LD_LIBRARY_PATH ignorar y seguir con la biblioteca dada a través de -rpath en tiempo de enlace

StackOverflow https://stackoverflow.com/questions/2408172

  •  18-09-2019
  •  | 
  •  

Pregunta

Estoy sentado en un entorno que no tengo ningún control real sobre (no se trata sólo de mí, así que básicamente, no puedo cambiar el medio ambiente o que no va a funcionar para cualquier otra persona), la única cosa que puede afectar es cómo se construye el binario.

Mi problema es, el entorno especifica un LD_LIBRARY_PATH contiene un libstdc ++ que no es compatible con el compilador que se utiliza. He intentado compilar estáticamente, pero eso no parece posible de g ++ (versión 4.2.3, parece haber sido el trabajo realizado en esta dirección en versiones posteriores, aunque que no están disponibles, -static-libstdc ++ o algo por el estilo).

Ahora he llegado a usar rpath para hornear el nombre de ruta absoluta en el ejecutable (que funcionaría, todas las máquinas que se supone que se ejecutan en son idénticos). Por desgracia, parece como si LD_LIBRARY_PATH tiene prioridad sobre rpath (reposición LD_LIBRARY_PATH confirmó que es capaz de encontrar la biblioteca, pero como se ha dicho, LD_LIBRARY_PATH se fijará para todo el mundo, y no puedo cambiar eso).

¿Hay alguna manera de hacer rpath tienen prioridad sobre LD_LIBRARY_PATH, o hay otras posibles soluciones a mi problema? Tenga en cuenta que estoy hablando de la vinculación dinámica en tiempo de ejecución, soy capaz de controlar la línea de comandos en tiempo de compilación y enlace de tiempo.

Gracias.

¿Fue útil?

Solución

Vinculación contra libstdc++.a es, sin duda posible, aunque difícil. Instrucciones aquí .

Soy un poco escéptico de su afirmación de que LD_LIBRARY_PATH tiene prioridad sobre el "cocido en" DT_RPATH sin embargo - al menos en Linux y (creo) de Solaris, LD_LIBRARY_PATH solamente se observó después de las operaciones de búsqueda DT_RPATH ha fallado

Otros consejos

Tal vez se puede utilizar un envoltorio de cáscara que modifica el ambiente sólo para este programa?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Esto debe sobrecargar el LD_LIBRARY_PATH antes de la ejecución, y luego vuelva a colocar la envoltura con su binario a través Exec.

¿Esto ayuda?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top