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";
Другие вопросы по тегам