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
chrpathque puede hacer esto; probablemente esté disponible en los paquetes de su distribución.fuente
install_name_toolpueden hacer esto con la-rpathbandera<binary>: no rpath or runpath tag found., no puede usarchrpathpara reemplazarlo, pero puede usarpatchelfen este caso:patchelf --set-rpath /path/to/libaries <binary>Existe una herramienta más universal que la
chrpathllamadapatchelf. 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),
chrpathfalla:Por otra parte,
tiene éxito muy bien.
fuente
patchelfes capaz de agregar un rpath a un binario que aún no contiene un rpath, dondechrpathsolo parece poder modificar una entrada ya presente.rpathyrunpath. Básicamente, uno puede anularLD_LIBRARY_PATHy el otro no. Para obtener más información, consulte blog.tremily.us/posts/rpathchrpathypatchelfson descuidados con su terminología. Por ejemplo, elpatchelfcomando que se muestra arriba cambiará,runpathpero no arpathmenos que también proporcione la--force-rpathopción.patchelfexplica: "--set-rpath,--shrink-rpathy--print-rpathahora prefieroDT_RUNPATHsobreDT_RPATH, que es obsoleto. Al actualizar, si ambos están presentes, ambos se actualizan. Si solo está presente DT_RPATH, se convierte aDT_RUNPATHmenos que--force-rpathse especifique. Si ninguno está presente ,DT_RUNPATHse agrega a a menos que--force-rpathse especifique, en cuyo casoDT_RPATHse 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
patchelfherramienta.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:
RUNPATHestá configurado,RPATHse ignoraRPATHestá en desuso y debe evitarseRUNPATHse prefiere porque puede ser anulado porLD_LIBRARY_PATHVer la RUTA R [UN] actual
Borrar la RUTA R [UN]
Notas:
RPATHyRUNPATHAgregar 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 estableceRUNPATHfuente
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtagsconjuntosDT_RUNPATH, y ese es el que la mayoría de la gente debería usar.RUNPATHpuede 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' httpdfuente