2015-02-11 4 views
1

Я хочу взять символы в разделе .data, сгенерированном для определенного файла C, и поместить их в другой раздел (например, .mydata) в окончательный исполняемый файл. Например,c - отправить .data в другой раздел

normaldata.c: char * my_str = "this should appear in .data"; 
specialdata.c: char * my_special_str = "this should appear in .mydata"; 

По умолчанию оба my_str и my_special_str появляются в разделе .data. Однако, когда я генерирую specialdata.o, я хочу отправить все, что появилось бы в .data вместо .mydata.

Я знаю, что могу использовать __attribute__((section(".mydata"))) для достижения этого эффекта, но не знаю, как применить его к назначенному инициализатору элемента-указателя структуры (я упростил свой код для этого вопроса). Поэтому вместо этого я думаю, что, возможно, я смогу использовать скрипт компоновщика и отправить все данные из определенного файла в специальный раздел.

Я попробовал этот линкер скрипт (link.lds):

SECTIONS 
{ 
    .mydata : { *(.data) } 
} 

с gcc -c specialdata.c -T link.lds -o specialdata.o, но выход objdump -x specialdata.o показывает .data секцию, но не .mydata раздел.

Что я делаю неправильно?

ответ

0

В вашей декларации C атрибут section() указывает имя раздела ввода для компоновщика. Имя .mydata, указанное в части кода компоновщика SECTIONS, - это имя , выход. В .mydata вы указываете компоновщику, чтобы поместить все символы из разделов ввода «*(.data)» в раздел вывода .mydata, но ваш атрибут C использует имя раздела вывода.

Чтобы получить компоновщик для размещения переменной C в правильном разделе вывода, вы должны использовать одно и то же имя для разделов ввода как в определении выходного раздела , так и в атрибуте C section().

Попробуйте изменить имя раздела ввода и использовать одно и то же имя как в сценарии компоновщика, так и в настройках C.

Linker сценария: источник

SECTIONS 
{ 
    /* Put all symbols from the .my_data input section into the 
    * .mydata output section. 
    */ 
    .mydata : { *(.my_data) } 
} 

specialdata.c:

// Note that the input section name is ".my_data", not ".mydata". 
char * my_special_str __attribute__((section(".my_data"))) = 
    "this should appear in .mydata";