除了说“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 的重击吗?
- (相关)通过,也许,在没有 -fPIC 的情况下编译 - 会有什么缺点?