我想在编译时将EWR(执行/写入/读取)内存属性添加到.data部分。
MSVC编译器可以通过简单地添加"/SECTION:.data,EWR“链接器选项来做到这一点。
但是我不知道如何在GCC编译器(MinGW)中做到这一点。
请帮帮我!
发布于 2019-06-06 19:04:29
我能想到的最简单的方法是向链接添加一个虚拟文件,其中包含一个具有所需标志的.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* .bsshttps://stackoverflow.com/questions/56473841
复制相似问题