我想在编译时将EWR(Execute / Write / Read)内存属性添加到.data节。
MSVC编译器可以通过简单地添加“ /SECTION:.data,EWR”链接器选项来实现此目的。
但是我不知道如何在GCC编译器(MinGW)中执行此操作。
请帮助!
答案 0 :(得分:1)
我能想到的最简单的方法是将虚拟文件添加到具有所需标志的 <SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="200.0" prefWidth="342.0" AnchorPane.bottomAnchor="363.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<HBox maxHeight="-Infinity" prefHeight="46.0" prefWidth="346.0"> <!-- removed maxWidth here -->
<children>
<MenuButton alignment="TOP_LEFT" mnemonicParsing="false" prefHeight="46.0" prefWidth="56.0" HBox.hgrow="ALWAYS">
...
</MenuButton>
</children>
</HBox>
...
</items>
</SplitPane>
节的链接中。该伪文件很容易使用汇编生成:
.data.*
(假设您使用.section .data.fake, "axw"
在ELF平台上)。
说,包含上述内容的文件称为gas
,那么您可以手动对其进行汇编,然后将结果添加到链接中
dummy.s
或者只是将assebmly文件传递给驱动程序:
as dummy.s -o dummy.o
gcc <all your normal .o files> dummy.o # or `ld`
请注意,汇编器会发出警告:
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