GCC 4.5 против 4.4 связывание с зависимостями
Я наблюдаю разницу при попытке выполнить одну и ту же операцию на 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
$
Кто-нибудь может объяснить, что происходит? Еще одна дополнительная информация заключается в том, что ldd на libb.so показывает liba.so на GCC 4.4, но не на 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