Tengo un ejecutable antiguo que está programado para el montón de desechos, pero aún no está disponible. Se basa en algunas bibliotecas que se han eliminado de mi entorno, pero tengo algunas bibliotecas auxiliares en algún lugar donde funciona bien. Me gustaría apuntar este ejecutable a estos stub libs. Sí, podría configurar LD_LIBRARY_PATH, pero este ejecutable se llama desde muchos scripts, y muchos usuarios, y me encantaría arreglarlo en un solo lugar.
No tengo fuente para esto y sería difícil conseguirlo. Estaba pensando: ¿puedo editar este archivo, usando un editor compatible con ELF y agregar un PATH simple a rpath para que llegue a las nuevas bibliotecas? ¿Es esto posible, o una vez que crea un binario ELF, arregla las cosas en las ubicaciones y no se pueden mover?
Respuestas:
Hay una herramienta llamada
chrpath
que puede hacer esto; probablemente esté disponible en los paquetes de su distribución.fuente
install_name_tool
pueden hacer esto con la-rpath
bandera<binary>: no rpath or runpath tag found.
, no puede usarchrpath
para reemplazarlo, pero puede usarpatchelf
en este caso:patchelf --set-rpath /path/to/libaries <binary>
Existe una herramienta más universal que la
chrpath
llamadapatchelf
. Originalmente fue creado para su uso en la creación de paquetes para Nix y NixOS (sistema de empaquetado y distribución GNU / Linux).En caso de que no haya rpath en un binario (aquí llamado rdsamp),
chrpath
falla:Por otra parte,
tiene éxito muy bien.
fuente
patchelf
es capaz de agregar un rpath a un binario que aún no contiene un rpath, dondechrpath
solo parece poder modificar una entrada ya presente.rpath
yrunpath
. Básicamente, uno puede anularLD_LIBRARY_PATH
y el otro no. Para obtener más información, consulte blog.tremily.us/posts/rpathchrpath
ypatchelf
son descuidados con su terminología. Por ejemplo, elpatchelf
comando que se muestra arriba cambiará,runpath
pero no arpath
menos que también proporcione la--force-rpath
opción.patchelf
explica: "--set-rpath
,--shrink-rpath
y--print-rpath
ahora prefieroDT_RUNPATH
sobreDT_RPATH
, que es obsoleto. Al actualizar, si ambos están presentes, ambos se actualizan. Si solo está presente DT_RPATH, se convierte aDT_RUNPATH
menos que--force-rpath
se especifique. Si ninguno está presente ,DT_RUNPATH
se agrega a a menos que--force-rpath
se especifique, en cuyo casoDT_RPATH
se agrega a ". El nombre de la opción probablemente se mantuvo sin cambios por razones de compatibilidad.Como dijo @ user7610, el camino correcto es la
patchelf
herramienta.Pero, siento que puedo dar una respuesta más completa, cubriendo todos los comandos que uno necesita para hacer exactamente eso.
Para obtener un artículo completo sobre el tema, haga clic aquí.
En primer lugar, muchos desarrolladores hablan
RPATH
, pero en realidad quieren decirRUNPATH
. Se trata de dos secciones dinámicas opcionales diferentes y el cargador las maneja de manera muy diferente. Puedes leer más sobre la diferencia entre ellos en el enlace que mencioné antes.Por ahora, solo recuerda:
RUNPATH
está configurado,RPATH
se ignoraRPATH
está en desuso y debe evitarseRUNPATH
se prefiere porque puede ser anulado porLD_LIBRARY_PATH
Ver la RUTA R [UN] actual
Borrar la RUTA R [UN]
Notas:
RPATH
yRUNPATH
Agregar valores a R [UN] PATH
Notas:
<desired-path>
es una lista de directorios separados por comas, por ejemplo:/my/libs:/my/other/libs
--force-rpath
, estableceRPATH
, de lo contrario estableceRUNPATH
fuente
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
conjuntosDT_RUNPATH
, y ese es el que la mayoría de la gente debería usar.RUNPATH
puede ser anulado porLD_LIBRARY_PATH
, por lo que la gente no debería usar--force-rpath
.<desired-path>
utiliza dos puntos; debe ser una coma (es decir :)/my/libs,/my/other/libs
.Esto funcionó para mí, reemplazando XORIGIN con $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
fuente