gpt4 book ai didi

shared-libraries - Linux中没有符号插入的共享对象,-fno-semantic-interposition错误

转载 作者:行者123 更新时间:2023-12-05 00:57:47 28 4
gpt4 key购买 nike

由于符号插入,类 Unix 系统中的共享对象 (*.so) 效率低下:每次访问 .so 中的全局变量都需要 GOT 查找,并且每次从一个函数调用 .so 中的另一个函数都需要一个 PLT抬头。因此,我很高兴看到 gcc 5.1 版添加了选项 -fno-semantic-interposition。但是,当我尝试在一个函数调用另一个函数而不使用 PLT 的情况下创建 .so 时,我收到错误消息:

relocation R_X86_64_PC32 against symbol `functionname' can not be used when making a shared object; recompile with -fPIC



我希望选项 -fno-semantic-interposition 可以消除此错误消息,但事实并非如此。 -mcmodel=large 也无济于事。
对函数的引用确实与位置无关,错误消息实际上证实了这一点(R_X86_64_PC32 表示 64 位模式下的 PC 相对 32 位重定位)。 -fPIC 并不真正意味着位置无关,顾名思义,它实际上意味着使用 GOT 和 PLT。

我无法使用 __attribute__((visibility ("hidden")))因为被调用的函数和调用者是在单独的文件中编译的(调用者在 C++ 中,被调用的函数在汇编中)。

我试图制作一个程序集列表以查看选项 -fno-semantic-interposition 的作用。我发现当一个函数调用同一文件中的另一个函数时,它会引用本地别名,但在调用另一个文件中的函数时它仍然使用 PLT。

(g++ 版本为 5.2.1 Ubuntu,64 位模式)。

有没有办法让链接器在没有 GOT/PLT 查找的情况下接受 .so 中的交叉引用?

最佳答案

Is there a way to make the linker accept a cross-reference inside a .so without the GOT/PLT lookup?



是: attribute((visibility("hidden")))正是这样做的方法。

I cannot use attribute((visibility ("hidden"))) because the called function and the caller are compiled in seperate files



你糊涂了: visibility("hidden")意味着符号在最终链接时不会从共享库中导出。但该符号是全局的,并且在最终链接之前跨多个翻译单元可见。

证明:
$ cat t1.c
extern int foo() __attribute__((visibility("hidden")));

int main() { return foo(); }
$ cat t2.c
int foo() __attribute__((visibility("hidden")));
int foo() { return 42; }
$ gcc -c -fPIC t1.c t2.c
$ gcc -shared t1.o t2.o -o t.so
$ nm -D t.so | grep foo
$

I tried to make an assembly listing to see what the option -fno-semantic-interposition does. I found out that it makes a reference to a local alias when one function calls another in the same file, but it still uses a PLT when calling a function in another file.



如果您阅读了 discussion在 gcc-patches 中,您会看到 -fno-semantic-interposition是关于允许内联可能的可插入函数,而不是关于它们在未内联时实际调用的方式。

关于shared-libraries - Linux中没有符号插入的共享对象,-fno-semantic-interposition错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34102989/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com