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

llden 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
lddruta de búsqueda / caché. Creo queldconfiges el camino a seguir.Elija uno y repita:
Salida de muestra:
Y así.
Ver también:
/proc/<pid>/mapspara 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>/mapstambién muestradlopenlibs por cierto: unix.stackexchange.com/questions/120015/… laltrace -Ssalida 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/mapspseudo-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 auxo 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
findcomando, por ejemplo:(libgtk-x11-2.0 parece ser la lib gtk2)
fuente
Es posible su uso
pmap.Por ejemplo, inicie un proceso:
$ watch dateObtener pid:
$ ps -ef | grep watchMostrar mapa de memoria:
$ pmap <pid>Mostrar con ruta completa:
$ pmap <pid> -pfuente