防止 g++ 添加额外的精灵部分

Posted

技术标签:

【中文标题】防止 g++ 添加额外的精灵部分【英文标题】:Prevent g++ adding extra elf sections 【发布时间】:2015-07-22 04:53:19 【问题描述】:

当使用 g++ 编译时,它会为几乎每个函数创建一个额外的部分。 这发生在带有elf64 可执行文件的linux 上。 举例:

text._ZN12MemoryMapper11SetUpMemoryEP11KernelStart

我如何告诉 g++ 在 .text 上发出所有代码,所以只有一个 .text 部分

在没有 -ffunction-sections 的情况下会发生这种情况

这些部分甚至在之后仍然存在

objcopy -S file.elf striped

================================================ ===

额外信息:

CXXFLAGS = -g -O0 -ffreestanding -fno-rtti -fno-exceptions -fno-asynchronous-unwind-tables -std=c++11 $(INCLUDES)
g++ version = gcc (GCC) 5.1.0

【问题讨论】:

如果省略-g(不添加调试符号)会怎样? 【参考方案1】:

text._ZN12MemoryMapper11SetUpMemoryEP11KernelStart

这是一个带有vague linkage 的内联函数。

您可以通过在源代码中不包含任何内联函数来避免为内联函数创建此类部分。可能有一个选项可以禁用为内联函数生成代码,但我没有找到。

请注意,禁用此功能通常是浪费时间:它们不会造成任何伤害,如果您有多个编译单元,则需要使用它们,否则您会遇到链接错误或二进制膨胀。

【讨论】:

以上是关于防止 g++ 添加额外的精灵部分的主要内容,如果未能解决你的问题,请参考以下文章

额外权限whowhoamilastlastblastlogbasename等命令

CSS 在 Netsuite 高级 PDF 模板中为部分表头添加额外的字母间距

需要向菜单栏添加一个额外的部分,但代码不会改变它

Swift静态TableView添加额外的行

防止 DotNetZip 创建额外的文件夹

防止一对多关系中的额外外键列