tagger tag picard para musicbrainz mac kid3 for easytag app linux linker shared-libraries install-name-tool

linux - tag - picard app



¿Cómo puedo cambiar el nombre de archivo de una biblioteca compartida después de crear un programa que depende de él? (4)

Podemos usar el patchelf :

patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

También podemos eliminar una dependencia:

patchelf --remove-needed libfoo.so.1 my-program

Añadir una dependencia:

patchelf --add-needed libfoo.so.1 my-program

O cambie la ruta donde buscar las bibliotecas ( rpath ):

patchelf --set-rpath /path/to/lib:/other/path my-program

Tengo un programa que depende de una biblioteca compartida que espera encontrar dentro de una estructura de directorios. Me gustaría mudar esa biblioteca compartida a un lugar mejor. En OS X, esto se puede hacer con install_name_tool. No puedo encontrar un equivalente para Linux.

Para referencia, readelf -d myprogram la siguiente salida parafraseada:

Dynamic section at offset 0x1e9ed4 contains 30 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [this/is/terrible/library.so] 0x00000001 (NEEDED) Shared library: [libGL.so.1] 0x00000001 (NEEDED) Shared library: [libGLU.so.1] 0x00000001 (NEEDED) Shared library: [libstdc++.so.6] (continues in an uninteresting fashion)

(y por solicitud, ldd myprogram :)

linux-gate.so.1 => (0x0056a000) this/is/terrible/library.so => not found libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000) libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000) (etc, etc)

y me gustaría errar que "this / is / terrible / library.so" sea "shared / library.so". Tenga en cuenta que, si el programa se deja en su ubicación "construida", donde realmente existe la ruta relativa esta / es / terrible / library.so, entonces ldd puede encontrarlo, como es de esperar.

Sé sobre RPATH y no es lo que estoy buscando, no necesito cambiar las rutas de búsqueda globalmente.


Publicar una solución tentativa, horrible, hacky.

Las dependencias de la biblioteca se almacenan en un bloque ELF conocido como el bloque .depends. El formato de ese bloque es una gran variedad de pares identificador / puntero de cadena, con el puntero de cadena apuntando a una cadena estándar terminada en nulo C ubicada en algún lugar del binario.

Usted ve a dónde va esto, ¿verdad?

Sí, siempre que la nueva ruta que necesita no sea más grande que la antigua, puede acceder directamente al binario y reemplazar una cadena simple. Asegúrate de no agregar o eliminar bytes o romperás todo el binario. Si desea estar más seguro al respecto, podría atravesar la estructura de ELF para asegurarse de que tenía la ubicación correcta; ahora mismo estoy comprobando que la cadena de origen aparezca exactamente una vez.

ELF incluye una suma de comprobación, pero aparentemente no hay un cargador que realmente lo verifique, por lo que es "seguro", aunque desordenado, ignorarlo.

La "solución real" sería una utilidad que permitiera manipulaciones generalizadas de bajo nivel de la estructura ELF. Tan cerca de lo que puedo decir, no existe tal utilidad, para nada excepto unos pocos casos especializados (RPATH, en su mayoría). No pretendo saber qué tan difícil sería escribir esa utilidad.

Me encantaría absolutamente una mejor solución a esto, pero, hasta ahora, esto parece funcionar.


Puede usar LD_LIBRARY_PATH para cambiar la ruta de búsqueda para las bibliotecas compartidas. Si su programa depende de una ruta relativa particular como muestra su ejemplo, aún necesitará tener esa estructura de directorios. En otras palabras, puede mover la /home/user/dev/project/this/is/terrible/library.so de /home/user/dev/project/this/is/terrible/library.so a /usr/local/lib/this/is/terrible/library.so pero no a /usr/local/lib/library.so

Si puede reconstruir su programa, entonces puede cambiar la ruta relativa que utiliza para la biblioteca.

Hay más información sobre las bibliotecas compartidas en Linux en http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html


HT - esto podría ser útil.

HT es un editor / visor / analizador de archivos para ejecutables. El objetivo es combinar la funcionalidad de bajo nivel de un depurador y la usabilidad de los IDE. Planeamos implementar todas las funciones de edición (hexadecimal) y el soporte de los formatos de archivo más importantes.

No pude encontrar algo muy diferente de la solución de ZorbaTHut, pero tal vez sea posible poner un nombre de diferente longitud y mantener el binario válido.

gelf - esto también podría ser útil.

GElf es una API genérica e independiente de clase ELF para manipular archivos de objeto ELF. GElf proporciona una interfaz única y común para el manejo de archivos objeto de formato ELF de 32 bits y 64 bits.