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
我想在编译时将 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