URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 659
[ Назад ]

Исходное сообщение
"gcc и константные переменные"

Отправлено KS , 04-Апр-02 21:08 
Существует ли возможность заставить gcc класть данные (например, строки) в секцию данных (.data), а не в кодовую .text?
В программе хочется использовать некоторый статический массив из строк, который не изменяется в 99% случаях. Но все-таки иногда требуется его изменить. gcc кладет его в кодовую секцию, которая имеет атрибуты `code' и `read'. Соответсвенно при попытке изменения этого массива, т.е. записи в секцию, программа падает: segmentation fault. Проштудировал весь мануал, но ничего не нашел. Как поместить этот массив в секцию для которой установлен атрибут записи?

Содержание

Сообщения в этом обсуждении
"RE: gcc и константные переменные"
Отправлено Арлекин , 05-Апр-02 08:03 
В 8-й солярке гнутый ман содержит такой текст:
...
     -fwritable-strings
          Store string constants in the writable data segment and
          don't  uniquize  them.   This is for compatibility with
          old programs which assume they can  write  into  string
          constants.  `-traditional' also has this effect.

          Writing into string constants is a very bad idea; "con-
          stants" should be constant.
....
Может это то ? СПАРКовский компилер для этого имеет опцию -xMerge.


"RE: gcc и константные переменные"
Отправлено KS , 05-Апр-02 09:09 
Большое спасибо. Мой gcc-шный мануал вообще не содержит упоминаний о таком флаге, поэтому я и тормозил. Главное сам компилер поддреживает :)

"RE: gcc и константные переменные"
Отправлено Sergey Vlasov , 12-Апр-02 20:01 
1) надо читать info gcc, а не man gcc - ну не любят GNUсные программеры man :-)

2) -fwritable-strings - это костыль (если не сказать хуже) для поддержки старых программ - и только для этого. Вместо него используйте:

char str[] = "some string";

там, где нужно инициализировать str, но потом в него писать.

Т.е. char *str = "xx" - инициализирует указатель str указателем на _константную_ строку - писать туда нельзя (и правильнее в данном случае писать const char *str = "xx"). char str[] = "xx" - инициализирует _массив_ str, в который потом можно писать.