[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