[Jde-dev] [Jde-users] Problema con enlazado dinámico libreríasJDE
Julio Vega
julio.vega en urjc.es
Vie Mar 6 11:21:55 CET 2009
Hola de nuevo,
bueno, pues resulta que después de X horas (no voy a especificar, para
no lastimar aún más mi autoestima), Jose María en 1 minuto se ha
percatado que en el fichero "ld.so.conf" las líneas de paths añadidas
tenían la sintaxis incorrecta. A modo de "Epi-Blas":
BIEN:
include /etc/ld.so.conf.d/*.conf
/usr/lib/jde-robot
/usr/lib/jde-robot/drivers
/usr/lib/jde-robot/schemas
/usr/lib/jde-robot/services
MAL:
include /etc/ld.so.conf.d/*.conf
include /usr/lib/jde-robot
Bueno, mirémoslo por el lado positivo. Ahora sabemos mucho más de
librerías dinámicas :)
Gracias encarecidamente Jose María,
Julio
Julio Vega wrote:
> Hola,
>
> a este paso vamos a ser los másters de las librerías dinámicas :)
>
> Sí, claro, he ejecutado el "ldconfig" tras actualizar el
> "ld.so.conf". De hecho es seguramente un problema que no tenga nada
> que ver con JDE, sino de alguna piltrafa en mi sistema (aunque está
> recién estrenado...). Digo esto, porque ayer pude llegar a la solución
> que expuse en el anterior e-mail, tras intentar instalar sin éxito a
> priori las librerías CUDA; y le ocurría el mismo problema de enlazado
> con sus respectivas dependencias.
>
> Es como si "ldconfig" tuviera un efecto nulo... De hecho,
> "LD_DEBUG=all ./esquema.so" muestra cómo efectivamente el enlazador NO
> está buscando en los paths añadidos al "ld.so.conf".
>
> Si llego a alguna conclusión lógica ya lo pondré. Mientras, salvo el
> paso con el LD_LIBRARY_PATH :)
>
> Saludos,
>
> Julio
>
> JoseMaria wrote:
>> Uhm... En general, no sólo para jde, sino para cualquier aplicación en C
>> que dependa de bibliotecas, las bibliotecas estáticas se localizan al
>> generar el ejecutable (compilar-enlazar) y se empotran en él. Las
>> bibliotecas dinámicas por contra no están empotradas en el ejecutable,
>> sino que en tiempo de ejecución el enlazador dinámico las encuentra y
>> las incorpora.
>>
>> Al enlazador dinámico (en linux: ld.so) hay que decirle dónde debe ir a
>> buscar las bibliotecas dinámicas. El cargador/enlazador dinámico busca
>> las bibliotecas dinámicas en (y en este orden):
>> 1.- los directorios incluidos en la variable de entorno LD_LIBRARY_PATH
>> 2.- los directorios incluidos en /etc/ld.so.cache
>> 3.- ciertos directorios por defecto como /lib y /usr/lib.
>>
>> Asi que se le puede indicar que busque mediante:
>> 1.- incluir en la variable de entorno LD_LIBRARY_PATH los directorios
>> adecuados. Esto depende de la shell concreta. En la bash que utilizo es
>> con: "export
>> LD_LIBRARY_PATH=midirectorio1:midirectorio2:$LD_LIBRARY_PATH.
>> 2.- /etc/ld.so.cache es un binario, para incluir en él nuevo directorios
>> hay que especificar en el fichero /etc/ld.so.conf los directorios donde
>> debe buscar las bibliotecas dinámicas y despues ejecutar ldconfig. Al
>> ejecutar ldconfig los directorios de /etc/ld.so.conf se incorporan
>> a /etc/ld.so.cache
>>
>> Nuestra aplicación en JDE típicamente consta de varios esquemas,
>> servicios y drivers. Todos ellos son plugins (bibliotecas dinámicas) que
>> se cargan en tiempo de ejecución, por ejemplo opencvdemo.so,
>> graphics_gtk.so, player.so, etc.. Si están en LD_LIBRARY_PATH o
>> en /etc/ld.so.cache, el enlazador dinámico los encontrará.
>> Adicionalmente, y esto ya sí depende de nuestro código, hemos
>> implementando un mecanismo de carga de esquemas, drivers y servicios que
>> busca los plugins en los directorios que se le especifican a jde en su
>> fichero de configuración (path XXX:YYY:ZZZ:ggg). De modo que se
>> localizan y pueden cargar sin estar en LD_LIBRARY_PATH o
>> en /etc/ld.so.cache, si sí están en alguno de esos directorios
>> especificados en el fichero de configuración de jde.
>>
>> A su vez cada componente (esquema,servicio,driver) puede depender de
>> otras bibliotecas como progeo, colorspaces, pioneer, etc. Estas
>> bibliotecas (que son dinámicas) sí deben estar en algún directorio
>> localizable por el cargador/enlazador dinámico (es decir contenido en
>> LD_LIBRARY_PATH o en /etc/ld.so.cache). Si alguna referencia a
>> biblioteca de un esquema no está bien resuelta, es decir, no se
>> encuentra la biblioteca que lo implementa, el esquema falla al cargarse.
>>
>> Para ver de qué bibliotecas depende un ejecutable, un esquema.so o un
>> driver.so basta ejecutar "ldd esquema.so" y te dice de qué bibliotecas
>> depende y si puede encontrar cada una de ellas.
>>
>> Julio, ¿has ejecutado ldconfig después de modificar /etc/ld.so.conf para
>> incorporar /usr/lib/jde-robot a los directorios en los que busca en
>> enlazador dinámico?
>>
>> JoseMaria
>> On Thu, 2009-03-05 at 20:01 +0100, Julio Vega wrote:
>>
>>> Bueno,
>>>
>>> después de varios combates se ha solucionado el asunto. Poniendo
>>> el path en la variable de entorno |LD_LIBRARY_PATH, de forma que
>>> ||LD_LIBRARY_PATH=/usr/lib/jde-robot y, lo que es más importante, no
>>> hay que olvidar hacer el $export LD_LIBRARY_PATH a continuación.
>>> Lo todavía extraño es que el enlazador dinámico parece que no mira
>>> en el fichero de configuración donde están especificados los paths
>>> de búsqueda por defecto del sistema (/etc/ld.so.conf). Por la
>>> naturaleza de éste, debería mirar primero en lo que tenga
>>> temporalmente en LD_LIBRARY_PATH y después en tal fichero. Pero si
>>> no configuro la variable de entorno, nada de nada; además
>>> consultando el debug completo (con '$LD_DEBUG=all ./esquema.so') veo
>>> perfectamente que no busca!
>>>
>>> Por otro lado, quizás me equivoque, pero creo que ldconfig sólo se
>>> usa para localizar librerías cuando compilamos el código en la
>>> máquina, y no cuando hacemos la instalación a través de algún
>>> binario o similar. Entonces sí tendría sentido este embrollo.
>>>
>>> Seguimos al acecho :) Saludos,
>>>
>>> Julio|
>>>
>>>
>
>
--
Julio Vega | http://robotica-urjc.es/jmvega
More information about the Jde-developers
mailing list