2009-07-09 10 views

risposta

21

C'è un nuovo capretto sul blocco - pyelftools - una libreria Python puro per analizzare i formati ELF e nani. Provaci.

Vuole essere feature-complete ed è attualmente in fase di sviluppo, in modo che qualsiasi problema deve essere gestito in modo rapido e con entusiasmo :-)

10

Il concetto di "informazioni di debug ELF" non esiste realmente: la specifica ELF lascia il contenuto della sezione .debug volutamente non specificato.

I formati di debug comuni sono STAB e DWARF. Una libreria per leggere DWARF è libdwarf.

+0

Sì, giusto. DWARF è quello che mi interessa. –

+1

Ho aggiornato la domanda di conseguenza. –

+1

È multipiattaforma libdwarf, lo sai? La pagina non dice, ma sembra avere un gusto generale per Unix. –

5

Potreste trovare informazioni utili qui:

+0

Grazie, ho perso l'altra domanda SO, credo perché non stavo cercando "DWARF". Aggiornerò il titolo di questa domanda –

4

Le opzioni per la lettura delle informazioni di debug nani sono purtroppo abbastanza limitate.

Per quanto ne so, esiste una sola libreria di uso generale per l'analisi delle informazioni di debug del DWARF e che è libdwarf. Sfortunatamente nessuno ha scritto binding Python per libdwarf (forse potresti prenderlo su di te e condividerlo con tutti gli altri :)) Potresti certamente tentare di accedere alle funzioni della libreria usando ctypes o Python C API.

Una soluzione molto meno elegante, tuttavia, è utilizzare un parser DWARF esistente e analizzare le informazioni testuali che emette. Le opzioni per questo (su Linux) sono

objdump -W 
readelf --debug-dump=[OPTIONS] 

Attualmente uso un progetto che costruisce fuori di readelf ed è il supporto per le informazioni di debug NANO è molto piena funzionalità. Potresti semplicemente usare Python per eseguire entrambi i comandi nella shell e quindi analizzare le informazioni di cui hai bisogno. Certamente non è l'ideale come una biblioteca, ma dovrebbe fare il trucco.

EDIT: Ho notato in un commento precedente che hai menzionato Windows. Entrambi questi programmi (objdump e readelf) fanno parte di GNU-binutils, quindi dovrebbero essere disponibili con Cygwin o mingw.

+0

c'è anche 'dwarfdump'. – hochl

7

Potreste essere interessati nella biblioteca nano di pydevtools:

>>> from devtools.dwarf import DWARF 
>>> dwarf = DWARF('test/test') 
>>> dwarf.get_loc_by_addr(0x8048475) 
('/home/emilmont/Workspace/dbg/test/main.c', 36, 0) 
>>> print dwarf 
.debug_info 
COMPILE_UNIT<header overall offset = 0> 
<0><11> compile_unit 
producer: GNU C 4.4.3 
language: C89 
name: a/test.c 
comp_dir: /home/emilmont/Workspace/dbg/test 
low_pc: 0x080483e4 
high_pc: 0x08048410 
stmt_list: 0 
[...] 
+0

È bello saperlo. Un paio di domande: 1) Quali piattaforme sono supportate (Windows, Linux)? 2) Puoi metterlo su [PyPI] (http://pypi.python.org/pypi)? –

+0

È su PyPI: http://pypi.python.org/pypi/BinTools/0.1.0 – emilmont

+0

Grande! La documentazione non menziona piattaforme supportate. Funziona su Windows? –

Problemi correlati