Wie finde ich heraus *.c und *.h-Dateien wurden verwendet, um eine binäre?
Bin ich ein Projekt erstellen, das baut mehrere gemeinsam genutzte Bibliotheken und ausführbaren Dateien. Alle Quell-Dateien, die verwendet werden, um diese Binärdateien werden in einem Einzel - /src-Verzeichnis. So ist es nicht offensichtlich, um herauszufinden, welche Quellcode-Dateien wurden verwendet, um zu bauen des binaries (es gibt viele-zu-viele-Beziehung).
Mein Ziel ist es, ein Skript schreiben, das würde analysieren eine Reihe von C-Dateien für jedes Programm und stellen Sie sicher, dass nur die richtigen Funktionen aufgerufen werden, von Ihnen.
Einer option zu sein scheint, um zu versuchen, diese Informationen zu extrahieren aus Makefile. Aber dies funktioniert nicht gut mit den generierten Dateien und Header (aufgrund der Abhängigkeit Enthält).
Eine andere Möglichkeit könnte sein, einfach anrufen Graphen, aber das würde kompliziert werden, weil eine Menge von Funktionen bezeichnet, die durch die Verwendung von Funktionszeigern.
Irgendwelche anderen Ideen?
- Nur aus Neugier: warum willst du das?
- Die Verteilung Paket-Mechanismus kennt alle Abhängigkeiten...
- Haben Sie eine genaue definition dessen, was "die richtigen Funktionen aufgerufen werden" bedeutet? Es ist nicht offensichtlich und ist nicht einfach.
- Mögliche Duplikate von wie finden Sie den Namen der Quelldatei aus ausführbaren Programm?
- Referenz: die Antwort verwendet einen interessanten Ansatz, mit
inotifywait
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie zunächst Ihr Projekt kompilieren mit debug information (gcc -g) und verwenden
objdump
zu bekommen, welche Quellcode-Dateien enthalten waren.Zwerg-format sollte die Informationen enthalten, die Sie suchen.
In diesem Beispiel, das ich zusammengestellt habe-object-Datei von test_3, und es war in .../Studien-Verzeichnis. Dann natürlich müssen Sie das schreiben eines Skripts, um dieses zu sammeln, die zugehörige source-Datei-Namen.
Müssen Sie zuerst trennen Sie die debug-Symbole aus dem binary, den Sie gerade kompiliert. prüfen Sie diese Frage auf wie dies zu tun:
Wie generieren gcc debug-symbol außerhalb der build-Ziel?
Dann können Sie versuchen, diese Datei analysieren, auf Ihre eigenen. Ich weiß, wie zu tun also für Visual Studio, aber als Sie GCC verwenden, die ich nicht in der Lage sein, um Ihnen weiter helfen.
Hier ist eine Idee, verfeinern müssen, basierend auf Ihren spezifischen Aufbau. Ein build, melden Sie es mit einem Skript (zum Beispiel
script log.txt make clean all
). Die Letzte (oder eine der letzten) Schritt sollte sein, die Verknüpfung von Objekt-Dateien. (Tipp: suchen Sie nachcc -o <your_binary_name>
). Diese Linie sollte link alle.o
Dateien, die entsprechende.c
Dateien in Ihrem Baum. Dann grep diejenigen.c
- Dateien für alle enthaltenen header-Dateien.Wenn du doppelte Namen in Ihrem
.c
Dateien in den Baum, dann werden wir sehen müssen Sie den vollständigen Pfad in die linker Zeile oder die Arbeit von derMakefile
.Was Mahmood schlägt unten sollten auch funktionieren. Wenn Sie ein Bild mit Symbolen,
strings <debug_image> | grep <full_path_of_src_directory>
sollte Ihnen eine Liste der C-Dateien.Können Sie verwenden, unix -
nm
tool. Es zeigt alle Symbole, die definiert sind in dem Objekt. So müssen Sie zu:nm
auf Ihre binäre und greifen alle undefinierten Symboleldd
auf Ihrem binary zu packen Liste aller dynamischen Abhängigkeiten (.also Dateien, die Ihr binäre mit)nm
auf jeden.so
Datei Besuches in Schritt 2 gefunden.Dass Ihnen die komplette Liste der dynamische Symbole, die Ihre binary verwenden.
Beispiel:
Alle diese Symbole mit der Hauptstadt "U" verwendet werden, durch die ls-Befehl.
Wenn Ihr Ziel ist es zu analysieren, C-source-Dateien, Sie können tun, dass durch die Anpassung des GCC-Compilers. Könnten Sie SCHMELZEN für diesen Zweck (SCHMELZE ist ein high-level-Domäne-spezifische Sprache zu erweitern GCC) -hinzufügen von eigenen Analyse geht kodiert SCHMELZEN innerhalb GCC-, aber sollten Sie zuerst lernen, über die GCC Mitte-Ende der internen Repräsentationen (Gimple, Baum, ...).
Customizing-GCC geschieht in mehreren Tagen Arbeit (vor allem, weil GCC internals sind sehr Komplex in den details).
Fühlen Sie sich frei zu Fragen, mir mehr zu SCHMELZEN.