gpt4 book ai didi

GCC 4.5 vs 4.4与依赖项的链接

转载 作者:行者123 更新时间:2023-12-04 06:45:04 26 4
gpt4 key购买 nike

在尝试在GCC 4.4和GCC 4.5上执行相同操作时,我观察到了差异。因为我执行此操作的代码是专有的,所以无法提供它,但是使用此简单的测试用例却遇到了类似的失败。

我基本上想做的是让一个共享库(libb)依赖于另一个共享库(liba)。加载libb时,我假设也应该加载liba-即使libb不一定使用liba中的符号。

我观察到的是,当我使用GCC 4.4进行编译时,我发现liba已加载,但是如果我使用GCC 4.5进行了编译,则libb也未加载。

我有一个包含两个文件a.c和b.c的小型测试用例。文件内容:

//a.c
int a(){
return 0;
}

//b.c
int b(){
return 0;
}
//c.c
#include <stdio.h>
int a();
int b();

int main()
{
printf("%d\n", a()+b());
return 0;
}
//test.sh
$CC -o liba.so a.c -shared
$CC -o libb.so b.c -shared -L. -la -Wl,-rpath-link .
$CC c.c -L. -lb -Wl,-rpath-link .
LD_LIBRARY_PATH=. ./a.out

这是我在不同版本的GCC中的输出
$ CC=gcc-4.4 ./test.sh
1
$ CC=gcc-4.5 ./test.sh
/tmp/cceJhAqy.o: In function `main':
c.c:(.text+0xf): undefined reference to `a'
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory
$ CC=gcc-4.6 ./test.sh
/tmp/ccoovR0x.o: In function `main':
c.c:(.text+0xf): undefined reference to `a'
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory
$

谁能解释发生了什么事?另一个额外的信息是,libb.so上的ldd确实在GCC 4.4上显示了liba.so,但在GCC 4.5上却没有。

编辑

我将test.sh更改为以下内容:
$CC -shared -o liba.so a.c
$CC -L. -Wl,--no-as-needed -Wl,--copy-dt-needed-entries -la -shared -o libb.so b.c -Wl,-rpath-link .
$CC -L. c.c -lb -Wl,-rpath-link .
LD_LIBRARY_PATH=. ./a.out

这在GCC 4.5中提供了以下输出:
/usr/bin/ld: /tmp/cc5IJ8Ks.o: undefined reference to symbol 'a'
/usr/bin/ld: note: 'a' is defined in DSO ./liba.so so try adding it to the linker command line
./liba.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory

最佳答案

DT_NEEDED链接期间,如何处理ld库似乎有所变化。这是当前man ld的相关部分:

With --copy-dt-needed-entries dynamic libraries mentioned on the command line will be recursively searched, following their DT_NEEDED tags to other libraries, in order to resolve symbols required by the output binary. With the default setting however the searching of dynamic libraries that follow it will stop with the dynamic library itself. No DT_NEEDED links will be traversed to resolve symbols.



(是 --copy-dt-needed-entries部分的一部分)。

在GCC 4.4和GCC 4.5之间的某个时间(显然,请参阅一些引用 here-找不到真正权威的东西),默认值已从递归搜索更改为无递归搜索(就像您在较新的GCC上看到的那样)。

无论如何,您都可以(并且应该)通过在最终链接步骤中指定 liba来修复它:
$CC c.c -L. -lb -la -Wl,-rpath-link .

您可以通过使用较新的编译器和以下命令行来检查此链接器设置确实是(至少是)问题的一部分:
$CC c.c -L. -Wl,--copy-dt-needed-entries -lb -Wl,--no-copy-dt-needed-entries \
-Wl,-rpath-link .

关于GCC 4.5 vs 4.4与依赖项的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8725572/

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