2010-10-18 5 views
19

Estoy trabajando en un complemento de Firefox que utiliza bibliotecas externas para representar gráficos 3D en el navegador.cómo vincular lib compartido de lib compartido con la ruta relativa

El problema es que quiero que el complemento use librerías externas empaquetadas sin cambiar la variable LD_LIBRARY_PATH.
Las bibliotecas se instalan en una posición relativa al complemento (una biblioteca compartida también), mientras que el ejecutable real (es decir, el navegador) se puede ubicar en otro lugar.

Algunas cosas que debes saber. Estoy probando que en Ubuntu (no hay problema en la versión de Windows del plugin) Mis dependencias son las bibliotecas OpenSceneGraph y la compilación estática hará que el plug-in muy grande (no es una opción si hay otro)

Esperanza usted puede ayudame

Saludos cordiales.

+2

Esto podría ser útil: http://stackoverflow.com/questions/3015411/shipping-gnu-linux-firefox-plugin-with-shared-libraries-for-installation-with-no –

+0

Interesante, puedo confirmarlo con un programa de prueba simple. Utiliza 'dlopen()' para cargar los enlaces 'lib1' y' lib1' a 'lib2' y usa' $ ORIGIN' para cargarlo desde una ruta relativa. Esto funciona sin problemas. –

Respuesta

0

Puede usar el indicador -L durante la compilación para especificar la ruta relativa donde el enlazador puede encontrar sus objetos compartidos.

Si ya ha generado su lib, puede enlazar invocando directamente el comando ld.

Consejos: Puede verificar fácilmente si algunos símbolos están definidos en una lib utilizando el comando de unix nm. Esta es una forma útil de verificar que el enlace esté bien hecho.

(Si yo fuera tú, me acabo de cambiar provisoriamente el LD_LIBRARY_PATH como usted ha dicho en su puesto. ¿Por qué no quieres hacer esto?)

+0

No se trata de que el vinculador encuentre las bibliotecas, se trata de que el cargador las encuentre en una ubicación relativa a la biblioteca que se está cargando actualmente (el complemento). Con los complementos no puede controlar cómo se invoca el proceso de host (es decir, el navegador), por lo que las variables de entorno no lo harán. En OS X '@ loader_path' hace el truco, en Linux no lo sé. –

+0

Bien, lo siento por la mala lectura. Quizás lo mejor que se puede hacer es usar comandos específicos del lenguaje para cargar la lib en tiempo de ejecución. Probablemente borre esta respuesta mañana si no encuentro una manera de resolver esto correctamente. – ThR37

+0

La carga dinámica habitual tiene la gran desventaja de no tener los talones, por lo que debe resolver los símbolos manualmente:/ –

26

Utilice la opción rpath al vincular y especifique el 'especial 'ruta $ ORIGEN.

Ejemplo:

-Wl,-R,'$ORIGIN/../lib' 

Aquí es un sitio que se elabora en el uso de $ ORIGEN: http://www.itee.uq.edu.au/~daniel/using_origin/

+5

el enlace está roto (5 años de edad, sí lo sé :)) – dashesy

+0

[Wayback Machine] (https: // web.archive.org/web/20130915172134/http://itee.uq.edu.au/~daniel/using_origin/) al rescate :) – 865719

+0

Además, [parece] (https://en.wikipedia.org/wiki/Rpath) que ['chrpath'] (http://man.devl.cz/man/1/chrpath) y [' patchelf'] (http://man.devl.cz/man/1/patchelf) también puede ayudar (no los he probado aún ...) – 865719

-2

Es incorrecto utilizar rpath relativa por razones de seguridad,

que puedes usar funciones libdl (dlopen, etc.)

+3

Si se implementa mal, el uso de rpath ciertamente puede causar problemas, pero Linux (y otros sistemas) tienen protecciones incorporadas. Por ejemplo, bajo ciertas circunstancias, ld.so no expandirá ORIGIN en absoluto. Además, las rutas relativas son absolutamente necesarias para los programas reubicables; de lo contrario, terminará teniendo que instalar un paquete de software en una ubicación fija, por ejemplo, verse forzado a instalar matlab en/usr/share/matlab siempre en lugar de algo como/opt/matlab,/usr/local/matlab, etc. . –

+1

Además, las personas pueden tomar decisiones informadas sobre si usar la expansión ORIGIN, particularmente si el software en cuestión es de su propia creación y se está utilizando en su propio hardware. –

Cuestiones relacionadas