Estoy observando una diferencia al intentar hacer la misma operación en GCC 4.4 y GCC 4.5. Debido a que el código con el que estoy haciendo esto es de propiedad, no puedo proporcionarlo, pero estoy observando un error similar con este sencillo caso de prueba.GCC 4.5 vs 4.4 vinculación con dependencias
Lo que básicamente trato de hacer es tener una biblioteca compartida (libb) que dependa de otra biblioteca compartida (liba). Al cargar libb, supongo que liba también debe cargarse, aunque libb no necesariamente usa los símbolos en liba.
Lo que estoy observando es cuando compilo con GCC 4.4, observo que la liba está cargada, pero si compilo con GCC 4.5, no se carga libb.
Tengo una pequeña caja de prueba que consta de dos archivos, a.c. y b.c. El contenido de los archivos:
//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
Ésta es mi salida con diferentes versiones de 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
$
Puede alguien explicar lo que está sucediendo? Otra información adicional es que ldd en libb.so muestra liba.so en GCC 4.4 pero no en GCC 4.5.
EDITAR
me cambió test.sh a lo siguiente:
$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
Esto dio el siguiente resultado con 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
Mi entorno de compilación es Ubuntu 11.10 x86-64 –
en Debian 6.0.3, el GCC 4.4 empaquetado maneja el ejemplo sin problemas. El GCC 4.3 empaquetado se queja de una bandera '-fPIC' faltante. –