Ich spiele gerade mit einigen C-Bibliotheken ohne Dokumentation herum. Ich frage mich, ob es überhaupt möglich ist, mehr Metadaten wie Parameter und Rückgabewerte abzurufen, als durch Aufrufen von nm -D
oder bereitgestellt werden objdump -T filename | grep text
. Ich bin mir nicht sicher, ob dies möglich ist, aber wenn ja, erspart es mir, den Verantwortlichen der Bibliothek zu jagen!
Bearbeiten: Ich möchte dies tun können, ohne wenn möglich Maschinencode zu lesen. Es scheint, dass es einige Lösungen gibt, die es mir ermöglichen, dies einfach zu tun, wenn ich ein Experte für Maschinencode war, aber da ich nicht den aktuellen Wunsch habe und nicht habe, in dieses Kaninchenloch zu springen, hoffe ich wirklich, dass es eine andere gibt Weg.
libraries
dynamic-linking
Edward Shen
quelle
quelle
Antworten:
Eine sehr ähnliche Frage wurde zum Stapelüberlauf gestellt: Wie extrahiere ich einen Funktionsprototyp aus einer ELF-Datei?
Kurzum: Im Allgemeinen können Sie nicht. Wenn die ausführbare Datei (oder gemeinsam genutzte Bibliothek) keine Debug-Informationen enthält, werden die Informationen zu Anzahl und Art der Argumente nicht in der ausführbaren Datei gespeichert.
Wenn die gemeinsam genutzte Objektdatei Debug-Informationen enthält, sollten Sie in der Lage sein, die Informationen mit
readelf -wi
oder mithilfe eines Debuggers zu extrahieren .Zum Beispiel habe ich eine ausführbare ELF-Datei, die eine Funktion enthält
int foo(char a, long b)
, die mit Debug-Informationen kompiliert wurde. GDB sagt mir:Und
readelf -wi
(ein bisschen kryptisch, Sie müssen die Einträge selbst abgleichen) hat:Beachten Sie, dass für C ++ die Symbole, die mit
nm
angezeigt werden, mehr Informationen enthalten (sofern sie nicht deklariert wurdenextern "C"
- die Anzahl und der Typ der Parameter müssen dem Linker zur Verfügung stehen, um eine Überladung zu bewältigen. Die Informationen zum Rückgabetyp sind jedoch auch nicht vorhanden Die Symbole sind verstümmelt -c++filt
können zum Entwirren verwendet werden.)Das Kompilieren derselben Quelldatei wie C ++ ergibt die folgende Ausgabe für
nm a.out | c++filt
:quelle
0x6c
zu einem tatsächlichen Typ?