0

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

MSVC 编译器只需添加“/SECTION:.data,EWR”链接器选项即可完成此操作。

但我不知道如何在 GCC 编译器(MinGW)中做到这一点。

请帮忙!

4

1 回答 1

1

我能想到的最简单的方法是将一个虚拟文件添加到.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`

或者只是将 assebmly 文件传递​​给驱动程序:

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)
}

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

...
LOAD 0x002e28 0x0000000000003e28 0x0000000000003e28 0x000200 0x000208 *RWE* 0x1000
...
05 .init_array .fini_array .dynamic .got .got.plt *.data* .bss
于 2019-06-06T11:04:28.793 回答