【发布时间】:2012-12-03 13:51:38
【问题描述】:
我有一些库,除了说“CreateObject”之外不公开任何功能。尽管如此,它们的所有函数都是间接调用的,所以我在性能报告中看到高达 1.65% 的时间花费在 __i686.get_pc_thunk.bx 中。函数(类方法)被调用了 1.6 亿次,它们在共享库内部,即未公开。
我想知道是否可以在不重定位的情况下编译内部方法 - 即使用相对偏移或类似的东西。
gcc 是 4.5.2
更新:实际上我认为这是因为 -O0 留在了 makefile 中。所以现在这没什么大不了的,但我仍然想对 -O0 做同样的事情,因为它可以减少探查器的“垃圾”。我想知道执行此操作的 -O2 “真实”选项是什么。
UPDATE2:嗯,不是 -O2,可能是 --dynamic-list 降低了 pc_thunk 性能,但它仍然存在......所以甚至不确定 --dynamic-list 是否真的有帮助.隐藏符号是否仍应包含间接 thunk,是否正确?
UPDATE3:我创建了一个测试项目,对于内部库函数,我将属性可见性设置为隐藏,我使用 gcc 4.7 和 -O2 进行编译,并启用了 LTO,我将 --dynamic-list 传递给链接器,但其中没有内部函数,并且尽管如此,对 get_pc_thunk 的调用仍然存在。
这是测试共享库中的代码:
#include <stdio.h>
__attribute__((visibility("hidden"), noinline)) void lib1f2()
{
puts("I should have PLT disabled");
}
void lib1f()
{
puts("I'm lib1");
lib1f2();
}
在 gdb 中,我仍然在 lib1f2 中看到 thunk。
有趣的是,使用 -fwhole-program lib1f2 内联到主可执行文件中但仍然包含对 thunk 的调用。
UPDATE4:好的,我快接近了(意识到我很笨),程序(和上面的代码)使用数据,即使它只是一个 const 字符串,所以它需要 GOT 调用。所以现在的问题是:
- 不过,我可以避免 GOT 的 thunk 吗?
- (相关)通过,也许,在没有 -fPIC 的情况下编译 - 会有什么缺点?
【问题讨论】:
标签: optimization gcc shared-libraries