首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSVC '/SECTION:.data,EWR‘等同于GCC的链接器选项

问MSVC '/SECTION:.data,EWR‘等同于GCC的链接器选项
EN

Stack Overflow用户
提问于 2019-06-06 16:39:08
回答 1查看 99关注 0票数 0

我想在编译时将EWR(执行/写入/读取)内存属性添加到.data部分。

MSVC编译器可以通过简单地添加"/SECTION:.data,EWR“链接器选项来做到这一点。

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

请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 19:04:29

我能想到的最简单的方法是向链接添加一个虚拟文件,其中包含一个具有所需标志的.data.*部分。这个虚拟文件很容易使用汇编生成:

代码语言:javascript
复制
.section .data.fake, "axw"

(假设您在ELF平台上,使用gas)。

例如,包含上述内容的文件名为dummy.s,然后您可以手动组装它,然后将结果添加到链接中

代码语言:javascript
复制
as dummy.s -o dummy.o
gcc <all your normal .o files> dummy.o  # or `ld`

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

代码语言:javascript
复制
gcc <all your normal files> dummy.s

请注意,汇编程序给出了一个警告:

代码语言:javascript
复制
Warning: setting incorrect section attributes for .data.fake

因为那些不同寻常的旗帜。不过,它确实按照要求设置了它们。

现在,让我来解释一下发生了什么。

所有输入.data*部分都将合并到输出.data部分中。请参阅默认链接器脚本(ld --verbose):

代码语言:javascript
复制
.data           :
{
  *(.data .data.* .gnu.linkonce.d.*)
  SORT(CONSTRUCTORS)
}

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

代码语言:javascript
复制
...
LOAD 0x002e28 0x0000000000003e28 0x0000000000003e28 0x000200 0x000208 *RWE* 0x1000
...
05 .init_array .fini_array .dynamic .got .got.plt *.data* .bss
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56473841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档