Существует ли возможность заставить gcc класть данные (например, строки) в секцию данных (.data), а не в кодовую .text?
В программе хочется использовать некоторый статический массив из строк, который не изменяется в 99% случаях. Но все-таки иногда требуется его изменить. gcc кладет его в кодовую секцию, которая имеет атрибуты `code' и `read'. Соответсвенно при попытке изменения этого массива, т.е. записи в секцию, программа падает: segmentation fault. Проштудировал весь мануал, но ничего не нашел. Как поместить этот массив в секцию для которой установлен атрибут записи?
В 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.
Большое спасибо. Мой gcc-шный мануал вообще не содержит упоминаний о таком флаге, поэтому я и тормозил. Главное сам компилер поддреживает :)
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, в который потом можно писать.