usar simbolicos simbolico listar liga fisico enlaces enlace eliminar crear como borrar acceso linux bash scripting jni shared-libraries

liga - listar enlaces simbolicos linux



Script Bash para crear enlaces simbólicos a bibliotecas compartidas (3)

Creo que ldconfig es la herramienta estándar que hace esto.

Recuerdo que en algún lugar puede generar enlaces simbólicos basados ​​en la información de la versión interna, pero no puede encontrar la fuente en este momento.

EDITAR Sí, si ejecuta

ldconfig -v

Lo verá generando todos los enlaces basados ​​en las partes internas de la biblioteca.

ldconfig /path/to/dir

Solo creará enlaces para archivos en ese directorio

Sin embargo, una nota, jugué con ella y no parece crear consistentemente .so $, solo .so. {Major}

No estoy seguro de cómo funciona su funcionamiento interno, pero sí sé:

lib # rm libmagic.so lib # rm libmagic.so.1 lib # ldconfig lib # file libmagic.so.1 libmagic.so.1: symbolic link to `libmagic.so.1.0.0'' lib # file libmagic.so libmagic.so: cannot open `libmagic.so'' (No such file or directory)

Entonces, qué es lo que determina cómo funciona esto es un misterio para mí

Editar tras otra discusión, los archivos .la no tienen influencia en el comportamiento.

El campo de nombre "SO" indica cómo se llamará el enlace simbólico.

Y solo habrá uno.

0x000000000000000e (SONAME) Library soname: [libmagix.so]

Esto es después de piratear el código y reemplazar el ".1" con espacios.

ldconfig generó "libmagic.so" (sí, espacios incluidos)

Creo que esta pregunta es bastante fácil para los monstruos de scripts de shell.

Estoy buscando la manera más elegante y más corta de crear enlaces simbólicos a bibliotecas compartidas para Unix por medio de un script bash shell.

Lo que necesito es comenzar con una lista de archivos de bibliotecas compartidas, como "libmythings.so.1.1, libotherthings.so.5.11", obtener los enlaces simbólicos creados, tales como:

libmythings.so -> libmythings.so.1 -> libmythings.so.1.1 libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11

Los archivos de la biblioteca se encuentran dentro de un directorio que contiene otros archivos, como otros scripts de shell.

EDITAR : Bueno, "ldconfig -nN". podría funcionar bien, pero también necesito el enlace sin el número principal de la biblioteca adjunta después de ".so", al menos una de las bibliotecas, ya que una o más bibliotecas son los puntos de entrada de las llamadas JNI desde Java, por lo que cuando una biblioteca se instancia por medio de System.loadlibrary ("nombre de biblioteca") espera una biblioteca llamada "nombre de biblioteca.so", no "nombre de biblioteca.so.X".

La solución con solo ldconfig -nN podría funcionar si hubiera una solución para la parte de Java.


for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed ''s//.[0-9][0-9]*$//'') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) ln -s $baselib $shortlib done done

He hecho trampa: todos los enlaces van a la biblioteca base (libmythings.so.1.1); si realmente quieres encadenar, entonces necesitas:

for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed ''s//.[0-9][0-9]*$//'') [ -n "$extn" ] do shorterlib=$(basename $shortlib $extn) ln -s $shortlib $shorterlib shortlib=$shorterlib done done

Cuidado: código no probado.

Hubris precede a Némesis.

Se recibió el comentario de que el código anterior no funciona, y el comentario es correcto. Una versión fija con prueba in situ es:

set -- libname.so.5.1.1 for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed -n ''//.[0-9][0-9]*$/s/.*/(/.[0-9][0-9]*/)$//1/p'') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) echo ln -s $baselib $shortlib done done

El cambio está en el comando sed . Esta versión no imprime nada por defecto ( -n ), solo coincide con las líneas que terminan con un punto seguido de dígitos, y luego borra todo excepto ese sufijo, e imprime lo que queda para la asignación a extn. Según se enmendó, el script genera el resultado a continuación. Elimina el eco para que ejecute los comandos de enlace.

ln -s libname.so.5.1.1 libname.so.5.1 ln -s libname.so.5.1.1 libname.so.5 ln -s libname.so.5.1.1 libname.so

La secuencia de comandos ilustra un punto interesante y con frecuencia pasado por alto sobre los scripts de shell: la secuencia de operaciones en el bloque de condiciones de un tiempo no necesita ser un solo comando. El estado de la línea con la operación de edición no afecta si la prueba como un todo tiene éxito; el estado de salida del último comando, '' [ -n "$extn" ] '', controla si el ciclo continúa.


Derivado del guión de Jonathan Leffler (lo he agregado como guión llamado ''liblinks'' en mi ~ / bin)

#!/bin/bash # liblinks - generate symbolic links # given libx.so.0.0.0 this would generate links for libx.so.0.0, libx.so.0, libx.so # # By adding sudo to the ls command, we get permission to do the linking (or get an empty list) LIBFILES=`sudo ls lib*.so.*` for FILE in $LIBFILES; do echo $FILE shortlib=$FILE basename=$FILE while extn=$(echo $shortlib | sed -n ''//.[0-9][0-9]*$/s/.*/(/.[0-9][0-9]*/)$//1/p'') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) sudo ln -fs $basename $shortlib basename=$shortlib done done