Quiero encontrar la lista de bibliotecas dinámicas que un binario carga cuando se ejecuta (con sus rutas completas). Estoy usando CentOS 6.0. ¿Como hacer esto?
executable
libraries
dynamic-linking
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
fuente
lld
en Darwin, parece, ni puedo encontrarlo a través de homebrew.otool -L <path-to-binary>
ldd
. Ver página del manual .readelf -d $executable | grep 'NEEDED'
Se puede usar si no puede ejecutar el ejecutable, por ejemplo, si se compiló de forma cruzada o si no confía en él:
Ejemplo:
Muestra de salida:
Tenga en cuenta que las bibliotecas pueden depender de otras bibliotecas, por lo que ahora necesita encontrar las dependencias.
Un enfoque ingenuo que a menudo funciona es:
pero el método más preciso es comprender la
ldd
ruta de búsqueda / caché. Creo queldconfig
es el camino a seguir.Elija uno y repita:
Salida de muestra:
Y así.
Ver también:
/proc/<pid>/maps
para ejecutar procesosMencionado por Basile , esto es útil para encontrar todas las bibliotecas que se utilizan actualmente ejecutando ejecutables. P.ej:
muestra todas las dependencias dinámicas cargadas actualmente de
init
(PID1
):Este método también muestra bibliotecas abiertas con
dlopen
, probadas con esta configuración mínima pirateada con unsleep(1000)
en Ubuntu 18.04.Consulte también: ¿Cómo ver los objetos compartidos cargados actualmente en Linux? El | Super usuario
fuente
ldd y lsof muestran las bibliotecas cargadas directamente o en un momento dado . No tienen en cuenta las bibliotecas cargadas a través de
dlopen
(o descartadas pordlclose
). Puede obtener una mejor imagen de esto usandostrace
, por ejemplo,(ya que en
dlopen
última instancia llamaopen
, aunque, por supuesto, puede tener un sistema que use diferentes nombres para las aperturas de 64 bits ...).Ejemplo:
me muestra esto:
desde el cual se podrían seleccionar los nombres ".so" para ver simplemente los objetos compartidos.
fuente
strace -e trace=open,openat myprogram
/proc/<pid>/maps
también muestradlopen
libs por cierto: unix.stackexchange.com/questions/120015/… laltrace -S
salida es aún más genial, ya que muestra tanto syscalls como llamadas de biblioteca comodlopen
: unix.stackexchange.com/questions/226524/…lsof también puede mostrarle qué bibliotecas se están utilizando para un proceso en particular.
es decir
fuente
Para un proceso de pid 1234, también puede leer el
/proc/1234/maps
pseudo-archivo (textual) (read proc (5) ...) o usar pmap (1)Esto le da al espacio de direcciones virtuales de ese proceso, por lo tanto, los archivos (incluidas las bibliotecas compartidas, incluso dlopen (3) -ed) que se asignan en memoria
(por supuesto, use
ps aux
o pgrep (1) para encontrar los procesos que ejecutan algún programa dado)fuente
Para consulta masiva:
cree un pequeño script (
useslib
) y póngalo en la RUTA (o especifique una ruta completa en el siguiente comando)Úselo en un
find
comando, por ejemplo:(libgtk-x11-2.0 parece ser la lib gtk2)
fuente
Es posible su uso
pmap
.Por ejemplo, inicie un proceso:
$ watch date
Obtener pid:
$ ps -ef | grep watch
Mostrar mapa de memoria:
$ pmap <pid>
Mostrar con ruta completa:
$ pmap <pid> -p
fuente