c - отправить.data в другой раздел
Я хочу взять символы в .data
раздел, созданный для конкретного файла C и поместите их в другой раздел (например, .mydata
в окончательном исполнении. Например,
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
раздел.
Что я делаю неправильно?
1 ответ
В вашей декларации C section()
Атрибут указывает имя входного раздела для компоновщика. .mydata
имя, указанное в SECTIONS
часть сценария компоновщика - это имя выходного раздела. В .mydata
вы говорите компоновщику разместить все символы из*(.data)
"вводить разделы в .mydata
выходной раздел, но ваш атрибут C использует имя выходного раздела.
Чтобы компоновщик поместил переменную C в правильный раздел вывода, вы должны использовать одно и то же имя для разделов ввода в обоих .mydata
определение выходного раздела и C section()
приписывать.
Попробуйте изменить имя входного раздела и использовать одно и то же имя как в скрипте компоновщика, так и в атрибутах C.
Скриптер компоновщика:
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";