Ubuntu和CentOS之间的链接行为差异

时间:2019-02-28 11:27:35

标签: c ubuntu linker centos

我正在构建两个共享库,其中一个库(B)依赖于另一个库(A),并且两者都由await中的rpath构建,然后将可执行文件链接到库B。因此,依赖关系如下:

可执行C->库B->库A

在Ubuntu上,B使用A的$ORIGIN/.解决了对A的依赖关系,而在CentOS上,链接程序警告找不到A,我应该使用“尝试使用rpath-rpath “在可执行文件的编译过程中。

这是重现此问题的最小示例:

-rpath-link

Ubuntu和CentOS上的链接行为之间有什么区别导致此问题?有没有一种方法可以“解决”此问题,以便无需依赖mkdir testdir echo 'void a() {}' > testdir/a.c echo 'int a(); void b() { a(); }' > testdir/b.c echo 'int b(); int main() { b(); }' > testdir/c.c gcc testdir/a.c -shared -o testdir/liba.so -Wl,-rpath,'$ORIGIN/.' -fPIC gcc testdir/b.c -Ltestdir -la -shared -o testdir/libb.so -Wl,-rpath,'$ORIGIN/.' -fPIC gcc testdir/c.c -Ltestdir -lb -o testdir/a.out 之类的东西就能解决A?


更新:如果我使用库目录的绝对路径而不是LD_LIBRARY_PATH,这似乎可行。当然,我不知道将它们部署到哪里的绝对路径,因此这不能解决此问题,但是它指出$ORIGIN不受CentOS 7(或其加载程序)的支持。

1 个答案:

答案 0 :(得分:1)

我认为这里的问题可能是this bug,针对binutils 2.26进行了报告,但大概也存在于早期版本中。问题在于,链接器ld与动态加载器ld.so不同,它没有解释rpath中的特殊替换字符串$ORIGIN,因此只能使用绝对路径。

该错误在binutils 2.28中被标记为已修复,但是Centos 7具有binutils 2.27。另一方面,Ubuntu 18.4使用binutils 2.30。