我正在处理一些在编译为 PIC(位置无关代码)时会变慢 70-80% 的代码,并正在寻找缓解问题的方法。问题的很大一部分是 gcc 坚持在每个函数中插入以下内容:
call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
即使这最终是函数内容的 20%。现在,ebx
是一个调用保留寄存器,相关翻译单元(源文件)中的每个函数都在用GOT的地址加载它,很容易检测到这些static
函数不能从翻译单元外部调用(它们的地址是从未采取)。那么为什么 gcc 不能ebx
在大外部链接函数的开头加载一次,并生成静态链接函数,以便它们假设ebx
已经加载了 GOT 的地址?是否有任何优化标志我可以用来强制 gcc 进行这种明显和大规模的优化,而不是将内联限制提高到天高,以便所有内容都内联到外部函数中?