Dada una ruta, quiero detectar todos los paquetes del sistema operativo que debían instalarse para poder utilizarla. Por ejemplo:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/bin/tcsh
tcsh
A veces no funciona. Por ejemplo:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
file /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so is not owned by any package
Pero mirando el resultado de ldd
veo:
> ldd /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007f11f7ffa000)
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000711fff7901000)
libpython3.7m.so.1.0 => /usr/pkgs/python3/3.7.4/lib/libpython3.7m.so.1.0 (0x00007ffff7422000)
libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007f11ff7205000)
libc.so.6 => /lib64/libc.so.6 (0x00007f13ff6e60000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff126c5c000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff216a21000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000711ff681e000)
libm.so.6 => /lib64/libm.so.6 (0x00007fff16521000)
/lib64/ld-linux-x86-64.so.2 (0x00007fff17ddb000)
Veo que tiene /usr/lib64/libsqlite3.so.0
. Entonces puedo hacer:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/lib64/libsqlite3.so.0
libsqlite3-0
Lo que significa que hay un paquete de sistema operativo requerido que debe instalarse para poder utilizar /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
.
Ahora, puedo crear una secuencia de comandos que ejecute el rpm
comando anterior y luego el ldd
comando en cada ruta e itere sobre las bibliotecas compartidas (es posible que deba usarlo locate
porque a veces no hay una ruta, como for linux-vdso.so.1
). Pero:
- No se recomienda su uso
ldd
. - El análisis del
ldd
resultado es bastante feo.
Ahora, vi un relacionadotemasobre el asunto. Podría usar readelf
el mismo problema.
¿Existe una solución mejor para detectar todos los paquetes de sistema operativo necesarios para una ruta determinada? yo también estoy usandorpmdep.plpero espera obtener un nombre de paquete y devuelve todas las dependencias del paquete. Entonces por ahora mi algoritmo es:
- Ejecute
/bin/rpm -qf --queryformat "[%{NAME}]\n" $path
y obtenga el nombre del paquete (marcado con$package)
. También agréguelo a la lista de paquetes. - Ejecutar
rpmdep.pl $package
) y agregue todos los paquetes a la lista. - Ejecute
ldd $path
y para cada línea:- Si hay una ruta (como
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0
), regrese al paso 1 con/usr/lib64/libsqlite3.so.0
. - Si no hay una ruta (como
linux-vdso.so.1
), intente localizarla (usandolocate
el comando) y, si la encuentra, vuelva al paso 1 con la ruta que obtuvo.
- Si hay una ruta (como
De esa manera recopilo todos los paquetes del sistema operativo necesarios para una ruta. Funciona bastante bien, pero estoy buscando un enfoque mejor y más limpio para resolver esta tarea. Además, ¿qué opinas de mi algoritmo sugerido?
Estoy usando OpenSUSE si eso importa.