Determinare le dipendenze dirette di oggetti condivisi di un binario Linux?


Risposte:


262

È possibile utilizzare readelfper esplorare le intestazioni ELF. readelf -delencherà le dipendenze dirette come NEEDEDsezioni.

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...

20
Questo è fantastico Diversamente da ldd, in grado di ispezionare un binario multipiattaforma (ovvero ispezionare un eseguibile ARM da Linux x86-64).
Robert Calhoun,

86

Se si desidera trovare le dipendenze in modo ricorsivo (comprese le dipendenze delle dipendenze, le dipendenze delle dipendenze delle dipendenze e così via) ...

Puoi usare il lddcomando. ldd - stampa le dipendenze della libreria condivisa


5
Il comando ldd risolve le dipendenze delle dipendenze, che non è quello che voglio.
Gnu libero,

11
Per me funziona benissimo. E ti dice anche, quale delle biblioteche poteva e non poteva essere trovata.
Philipp F,

2
ldd non funzionerebbe con un eseguibile - è utile solo per scoprire le dipendenze delle librerie condivise.
Tuxdude,

2
Tuxdude, perché la pensi così? Qual è il motivo dell'insolubilità di ldd per gli eseguibili ELF?
Vitaly Isaev

Questo è fantastico per copiare lib lib richieste necessarie dalla macchina di sviluppo all'archivio di distribuzione.
Tomáš Zato - Ripristina Monica il

30

Lo objdumpstrumento può dirti queste informazioni. Se invochi objdumpcon l' -xopzione, per ottenere l'output di tutte le intestazioni, troverai le dipendenze degli oggetti condivisi proprio all'inizio nella "Sezione dinamica".

Ad esempio, in esecuzione objdump -x /usr/lib/libXpm.so.4sul mio sistema fornisce le seguenti informazioni nella "Sezione dinamica":

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

Le dipendenze dirette di oggetti condivisi sono elencate come valori "NECESSARI". Quindi nell'esempio sopra, libXpm.so.4sul mio sistema ho solo bisogno libX11.so.6e libc.so.6.

È importante notare che ciò non significa che tutti i simboli necessari al binario che passerà objdumpsaranno presenti nelle librerie, ma almeno mostra quali librerie il caricatore proverà a caricare durante il caricamento del binario.


13

ldd -v stampa l'albero delle dipendenze nella sezione "Informazioni sulla versione:". Il primo blocco in quella sezione sono le dipendenze dirette del file binario.

Vedi Hierarchical ldd (1)


Qual è la differenza tra questo e objdump -x <binary> | grep "NEEDED"? Voglio dire, entrambi sono quasi esattamente uguali, sto solo ottenendo un .sofile in più con ldddi objdump. Ma il fatto che i risultati non siano gli stessi mi chiedo quale metodo sia più preciso.
m4l490n,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.