gcc biblioteca compartida falló al enlazar a glibc

Estoy escribiendo una biblioteca compartida en C simple usando Eclipse CDT bajo Linux 64bit.

El código tiene una referencia a la función rand() en Se comstack bien, pero al vincularlo, informa del siguiente error desde el vinculador:

 gcc -shared -o "libalg.so" ./sort.o /usr/bin/ld: ./sort.o: relocation R_X86_64_PC32 against undefined symbol `rand@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value 

sort.o es el archivo objeto comstackdo desde el archivo. libalg.so es el nombre de la biblioteca compartida de destino.

¿Alguien puede explicar por qué sucede esto?

Gracias.

En la architecture x86_64 , gcc requiere que use -fPIC es decir, el código independiente de posición de forma predeterminada.

El motivo subyacente del error es que el tipo de reubicación para el símbolo rand es del tipo R_X86_64_PC32 que significa que es relativo a la PC y debe estar dentro del desplazamiento de 32bit de la siguiente instrucción.

Pero la architecture actual es del tipo x86_64 que significa que puede estar en cualquier lugar dentro del espacio de direcciones de 64bit .

Por lo tanto, el enlazador dynamic en realidad no puede vincular un símbolo con ese tipo de reubicación.

O tienes que usar -fPIC o comstackr tu código usando el -mcmodel=large que hará que el tipo de reubicación sea R_X86_64_64 .

Para más detalles sobre cómo se realiza el enlace, consulte este gran blog de Eli Bendersky.