在尝试在GCC 4.4和GCC 4.5上执行相同的操作时,我观察到了差异.因为我使用的代码是专有的,我无法提供它,但我观察到这个简单测试用例的类似失败.
我基本上要做的是让一个共享库(libb)依赖于另一个共享库(liba).当加载libb时,我假设也应该加载liba - 即使libb不一定使用liba中的符号.
我观察到的是当我使用GCC 4.4进行编译时,我发现liba已加载,但如果我使用GCC 4.5进行编译,则不会加载libb.
我有一个小测试用例,包含两个文件,ac和bc.文件内容:
//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
Run Code Online (Sandbox Code Playgroud)
这是我用不同版本的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 …Run Code Online (Sandbox Code Playgroud)