1

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

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
4

1 回答 1

2

text._ZN12MemoryMapper11SetUpMemoryEP11KernelStart

这是一个带有模糊链接的内联函数。

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

请注意,禁用它通常是浪费时间:它们不会伤害任何东西,并且如果您有多个编译单元,则需要它们,否则您将获得链接错误或二进制膨胀。

于 2015-07-23T06:11:11.640 回答