我想在编译时将 EWR(Execute/Write/Read) 内存属性添加到 .data 部分。
MSVC 编译器只需添加“/SECTION:.data,EWR”链接器选项即可完成此操作。
但我不知道如何在 GCC 编译器(MinGW)中做到这一点。
请帮忙!
我想在编译时将 EWR(Execute/Write/Read) 内存属性添加到 .data 部分。
MSVC 编译器只需添加“/SECTION:.data,EWR”链接器选项即可完成此操作。
但我不知道如何在 GCC 编译器(MinGW)中做到这一点。
请帮忙!
我能想到的最简单的方法是将一个虚拟文件添加到.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