Самый простой способ, о котором я могу подумать, - это добавить фиктивный файл к ссылке с секцией .data.*
, которая имеет нужные флаги. Этот фиктивный файл легко создать с помощью сборки:
.section .data.fake, "axw"
(при условии, что вы находитесь на платформе ELF, используя gas
).
Скажем, файл, содержащий выше, называется dummy.s
, тогда вы можете либо собрать его вручную, а затем добавить результат к ссылке
as dummy.s -o dummy.o
gcc <all your normal .o files> dummy.o # or `ld`
Или просто передать файл сборки драйверу:
gcc <all your normal files> dummy.s
Обратите внимание, что ассемблер выдает предупреждение:
Warning: setting incorrect section attributes for .data.fake
из-за необычных флагов. Это действительно устанавливает их как спрошено все же.
Теперь позвольте мне немного объяснить, что происходит.
Все входные секции .data*
объединены в секцию вывода .data
. См. Скрипт компоновщика по умолчанию (ld --verbose
):
.data :
{
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
}
Флаги секции output являются объединением флагов секции input (я уверен, что это поведение описано в руководстве по компоновщику). Вот как работает трюк. Флаги для сегмента, содержащего результирующий .data
, затем также вычисляются как объединение флагов секций, которые он содержит. Посмотрите результат readelf -lW
, чтобы убедиться, что вы получили ожидаемый результат. У меня
...
LOAD 0x002e28 0x0000000000003e28 0x0000000000003e28 0x000200 0x000208 *RWE* 0x1000
...
05 .init_array .fini_array .dynamic .got .got.plt *.data* .bss