繁体   English   中英

为什么 gcc 会改变二进制函数的顺序?

[英]Why would gcc change the order of functions in a binary?

  • 关于强制二进制中函数顺序与源文件顺序匹配的许多问题
  • 例如, 这个帖子那个帖子和其他
  • 我不明白为什么 gcc 首先要更改他们的订单
  • 从中能得到什么?
  • 此外,为什么toplevel-reorder默认值为 true?

GCC 可以更改函数的顺序,因为 C 标准(例如n1570或更新版本)允许这样做。

There is no obligation for GCC to compile a C function into a single function in the sense of the ELF format. 参见 Linux 上的elf(5)

In practice (with optimizations enabled: try compiling foo.c with gcc -Wall -fverbose-asm -O3 foo.c then look into the foo.s assembler file), the GCC compiler is building intermediate representations like GIMPLE . 大量优化正在将 GIMPLE 转变为更好的 GIMPLE。

一旦 GIMPLE 表示“足够好”,编译器就会将其转换为RTL

在 Linux 系统上,您可以使用dladdr(3)找到离给定地址最近的 ELF function。 您还可以使用backtrace(3)在运行时检查调用堆栈

GCC 甚至可以完全删除函数,特别是static函数,其调用将被内联扩展(即使没有任何inline关键字)。

我倾向于相信,如果你编译和链接你的整个程序与gcc -O3 -flto -fwhole-program一些非 static 但未使用的功能也可以删除....

而且您可以随时编写自己的GCC 插件来更改功能的顺序。

如果您想猜测 GCC 是如何工作的:下载并研究它的源代码(因为它是免费软件)并在您的机器上编译它,使用 GCC开发人员选项调用它,在Z32D8B23Z53E3C528A78D 邮件列表中提问72 ...

另请参阅bismon static 源代码分析器(您可能会感兴趣的一些正在进行的工作)和DECODER项目。 您可以通过 email 与我联系,了解两者。 您还可以为RefPerSys做出贡献并使用它来生成GCC 插件(以 C++ 形式)。

从中能得到什么?

优化。 如果编译器认为某些代码会被大量使用,它可能会将该代码放在与预期不会经常执行的代码不同的区域(或者是错误路径,其中性能不那么重要)。 并且可能在其他代码之后或暂时靠近其他代码执行的代码应该放在附近,因此在需要时更有可能在缓存中。

__attribute__((hot))__attribute__((cold))出于某些相同的原因而存在。

为什么 toplevel-reorder 默认值为 true?

因为 99% 的开发人员都不会被这个默认设置所困扰,而且它可以让程序运行得更快。 需要关心排序的 1% 的开发人员使用属性、配置文件引导优化或其他可能与no-toplevel-reorder冲突的特性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM