GCC 等效的 MSVC '/SECTION:.data,EWR' 链接器选项

MSVC '/SECTION:.data,EWR' linker option equivalent for GCC

我想在编译时将 EWR(Execute/Write/Read) 内存属性添加到 .data 部分。

MSVC 编译器只需添加“/SECTION:.data,EWR”链接器选项即可做到这一点。

但我不知道如何在 GCC 编译器 (MinGW) 中执行此操作。

请帮忙!

我能想到的最简单的方法是将虚拟文件添加到 link 中,其中的 .data.* 部分具有所需的标志。该虚拟文件很容易使用汇编生成:

.section .data.fake, "axw"

(假设您在 ELF 平台上,使用 gas)。

比如说,包含上述内容的文件名为dummy.s,那么您可以手动assemble它,然后将结果添加到link

as dummy.s -o dummy.o
gcc <all your normal .o files> dummy.o  # or `ld`

或者直接将assebmly文件传递给驱动:

gcc <all your normal files> dummy.s

注意 assembler 给出警告:

Warning: setting incorrect section attributes for .data.fake

因为不寻常的标志。它确实按照要求设置了它们。

现在,让我解释一下发生了什么。

所有输入 .data* 部分合并到输出 .data 部分。查看默认的 linker 脚本 (ld --verbose):

.data           :
{
  *(.data .data.* .gnu.linkonce.d.*)
  SORT(CONSTRUCTORS)
}

输出部分的标志是输入部分标志的联合(我很确定这种行为记录在 linker 手册中)。这就是技巧的工作原理。然后,保存结果 .data 的段的标志也被计算为它包含的部分的标志的并集。查看 readelf -lW 的输出以确保您获得了预期的结果。我有

...
LOAD 0x002e28 0x0000000000003e28 0x0000000000003e28 0x000200 0x000208 *RWE* 0x1000
...
05 .init_array .fini_array .dynamic .got .got.plt *.data* .bss