[caracas-pm] Obteniendo __errno_location al cargar módulo Perl XS en FreeBSD

Ernesto Hernández-Novich emhnemhn at gmail.com
Thu Aug 18 08:10:11 PDT 2011


On Tue, 2011-08-16 at 11:03 -0400, Alejandro Imass wrote:
> Estoy compilando una librería propietaria en FreeBSD que ofrece un API
> en Perl mediante XS. El paquete viene con un ar archive para Linux 64
> pero necesito compilar y correr este módulo en FreeBSD. El proceso de
> make no se queja en lo absoluto sobre los object files en el ar, y
> todo se compila sin error alguno.
> 
> La librería se compila perfecto pero cuando dynaloader va a cargar el
> shared object me da el error:
> 
> /libexec/ld-elf.so.1: (undisclosed).so: Undefined symbol "__errno_location"
> 
> Me pregunto si esto es ld-el quejándose que no consigue el símbolo en
> (undisclosed), o es (undisclosed) que no consigue el símbolo en una de
> sus dependencias?

Ambos. ld-elf.so tiene que resolver todas las referencias entre los
componentes participantes. En la librería (undisclosed).so se hace
referencia al símbolo "__errno_location" que no está disponible en
ninguno de los componentes que participaron en el enlace dinámico.

> He investigado acerca de __errno_location pero algunos dicen que está
> relacionado a pthreads, y otros que es de libm y que está definido en
> errno.h pero este símbolo no lo encuentro en ningún .h ni en Linux ni
> en FreeBSD

__errno_location está definida en el LSB, es un apuntador a la ubicación
en memoria donde está contenido errno para el hilo actual, y la provee
libc en Linux. No existe en BSD.

> Como se puede ver, al librería se construye bien y satisface todas sus
> dependencias, Mi pregunta es... el error de undefined symbol no
> debería manifestarse durante la compilación en vez que en el linkeo
> dinámico?

No necesariamente. Es perfectamente posible escribir un programa que
solicite el enlazado a tiempo de *corrida* y no a tiempo de compilación
(man dlopen).

Si mi memoria sirve para algo, __errno_location en Linux es lo mismo que
__error en BSD. Capaz que con un #define apropiado te basta.
-- 
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list