我正在处理一些在编译为 PIC(位置无关代码)时速度慢 70-80% 的代码,并寻找缓解该问题的方法。问题的一个重要部分是 gcc 坚持在每个函数中插入以下内容:
call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
即使这最终占了函数内容的 20%。现在,ebx
是一个调用保留寄存器,并且every相关翻译单元(源文件)中的函数正在用GOT的地址加载它,并且很容易检测到static
函数不能从翻译单元外部调用(它们的地址永远不会被占用)。那么为什么 gcc 不能直接加载ebx
一旦在大的外部链接函数的开头,并生成静态链接函数,以便它们假设ebx
是否已经加载了GOT的地址?我是否可以使用任何优化标志来强制 gcc 进行这种明显且大规模的优化,而不是将内联限制提高到天高,以便所有内容都内联到外部函数中?
可能没有通用的解决方法,但您可以尝试使用内联选项。我猜想static
编译单元中的函数没有太多的调用者,因此代码复制的开销不会太糟糕。
使用 gcc 强制执行此类操作的最简单方法是设置attribute((always_inline))
。您可以使用 gcc 相关宏来确保可移植性。
如果你不想修改代码(但是static inline
无论如何都会很好)你可以使用-finline-limit
选项来微调。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)