Gibt es eine Möglichkeit, die Objektdateien zu finden, aus denen die aktuelle ausführbare Datei in Linux generiert wird (RHEL, um genau zu sein). Ich verstehe, dass man "nm" verwenden kann, um die exportierten Symbole zu finden, "ldd", um abhängiges gemeinsames Objekt zu finden.
Ich konnte jedoch keinen Befehl finden, um den Namen von Objektdateien (.o) herauszufinden, aus denen sich die ausführbare Datei zusammensetzt. Ist es möglich?
Wenn es mit Debugging-Informationen kompiliert wurde, ja. Verwenden Sie gdb (man gdb), um die Informationen zu finden.
Wenn es nicht ohne Debug-Informationen kompiliert wurde. Du hast kein Glück.
Die ursprünglichen Namen der Objektdateien werden nicht in den DWARF-Debuginformationen gespeichert.
Jede Objektdatei hat einen DW_TAG_compile_unit
-Eintrag im Abschnitt .debug_info
. Dieser Eintrag enthält einen Verweis auf die "primäre Quelldatei"
aus dem die Kompilierungseinheit abgeleitet wurde ", aber nicht der Name der Objektdatei. Der DWARF-Standard enthält eine Liste der Attribute, die für jede Übersetzungseinheit gespeichert werden können (Abschnitt 3.1.1, Seite Nummer 44, pdf Seite 58).
Sie können die Informationen anzeigen, die mit dem folgenden Befehl gespeichert werden:
%Vor%Ausgabe:
%Vor%Neben "nullptr" bezieht sich "gemeinsam genutztes Objekt" auf andere gemeinsam genutzte Bibliotheken (verknüpft), nicht auf ursprüngliche Objekte (nicht verknüpft)
Sie können auch objdump
verwenden (solange die ausführbare Datei und die Objekte mit Debuginformationen kompiliert wurden):
awk
wird nur zum Extrahieren der relevanten Informationen verwendet (wenn Sie nicht verwenden, erhalten Sie die vollständigen Debug-Informationen in der ausführbaren Datei und den Objekten).
Eine Objektdatei wird nach dem Verknüpfen in eine ausführbare Datei umgewandelt. Wenn die Verknüpfung geteilt wird, können Sie diese über gemeinsame Bibliotheken ( ldd
) erhalten. Wenn die Verknüpfung jedoch statisch ist, gibt es nur einen Weg, d. H. Über Debug-Informationen. Sie können debuginfo-Pakete in RHEL (oder Fedora) installieren. Hier sind die Anweisungen
Und dann benutze gdb info sources
wie hier beschrieben:
Dies würde Ihnen eine Liste der Quelldateien geben. Um die Objektdateien tatsächlich zu erhalten, müssen Sie jedoch die Build-Tools ( rpmbuild
) genauer betrachten. Um rpmbuild auszuführen, benötigen Sie das Quell-RPM-Paket, das Sie mit den folgenden Anweisungen erhalten:
Nun können Sie das Paket selbst erstellen und analysieren, welche Datei .o
in der ausführbaren Datei enthalten ist.
Ich hoffe, das hilft.
Tags und Links linux executable object-files