Эквивалентный параметр компоновщика '/SECTION:.data,EWR' для GCC - PullRequest
0 голосов
/ 06 июня 2019

Я хочу добавить атрибут памяти EWR (выполнение / запись / чтение) в раздел .data во время компиляции.

Компилятор MSVC может сделать это, просто добавив параметр компоновщика "/SECTION:.data,EWR".

Но я не знаю, как это сделать в компиляторе GCC (MinGW).

Пожалуйста, помогите!

1 Ответ

1 голос
/ 06 июня 2019

Самый простой способ, о котором я могу подумать, - это добавить фиктивный файл к ссылке с секцией .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
...