2016-07-12 15 views
2

OK, habe ich die Linux Dwarf ldw Bibliothek verwendet backtrace_symbols Ausgabe auf den Quellcode und Zeilennummern zu konvertieren, aber ich habe einen Haken getroffen. backtrace_symbols gibt Offsets im Speicher, von denen ich die Basisadresse subtrahiere (erhalten mit dladdr()) vor der Verwendung als Eingabe in Dwarf. Aber es scheint, dass ich für die Eltern-ausführbare Datei die Basisadresse NICHT subtrahieren sollte, weil die Dwarf-Offsets sie zu enthalten scheinen.Dwarf Verschiebungen und gemeinsam genutzte Objekte vs Executables

Also, wie kann ich entweder EXE und SO in meinem Code unterscheiden (ich hoffe, es gibt etwas Besseres als 'suche nach Endung .so') oder gibt es eine andere Funktion, die ich anrufen kann, die die Basisadresse erhalten oder Null für die Eltern-EXE?

Antwort

2

Keine sicher, ob dies der beste Weg ist, aber ldw hat eine Funktion, dwarf_getelf(), die Sie an die ELF Informationen, von dort elf32/64_getehdr() und von dort zu suchen verwenden zu können im Feld e_type. Wenn E_TYPE ist ET_DYN dann ist es ein gemeinsames Objekt und Sie sollten auf und dladdr verwenden tragen den Versatz zu finden, von Adressen löschen sonst nur die Adressen von Backtrace direkt erzeugt verwenden.

1

Ja, Sie haben Recht. Wenn die ausführbare Datei eine ET_EXEC (keine DT_DYN ist, d. H. Es ist keine positionsunabhängige ausführbare Datei), dann sind die virtuellen Adressen in der DWARF die realen virtuellen Adressen in Ihrem Programmabbild. Für DT_DYN sind die Adressen im DWARF Offsets von der Basisadresse des Moduls.

Dies ist in 7.3 der ZWERG spec erklärt:

die verschobene Adressen in den Debug-Informationen für eine ausführbare Objekt sind virtuelle Adressen und die verschobene Adressen in den Debug-Informationen für einen gemeinsamen Objekt sind Offsets relativ an den Anfang der untersten Region von Speicher geladen von diesem Shared Memory.

Sie sollten e_type im ELF-Header verwenden, um sie zu unterscheiden.