2015-06-29 16 views
5

Ich entwickle eine statische Analyse-Tool mit python-clang-3.6-Bibliothek, die ich Funktion Call Graphen zeichnen lassen würde.Verwendung von Linkerbefehlen für die statische Analyse von Clang

Um ordnungsgemäß TranslationUnit zu erstellen, muss ich den entsprechenden Kompilierbefehl verwenden (d. H. clang.cindex.Index.parse(c_file, compile_command)). Allerdings glaube ich, um in der Lage zu sein, richtig zu verbinden TranslationUnits Ich müsste auch Linker-Befehle verwenden, um zu wissen, welche TranslationUnit Funktionen von anderen TranslationUnits verwendet. Dies ist ein Problem in meinem Projekt, wo tatsächlich mehrere Binärdateien mit einem einzigen "make" -Aufruf erstellt werden und einige TranslationUnits möglicherweise kollidierende Symbolnamen haben, so dass ich nicht davon ausgehen kann, dass alle miteinander verbunden sind.

Was ist der beste Weg, um dieses Problem zu beheben, so dass mein Tool würde wissen, welche Funktionen in C-Datei Funktionen aus anderen C-Dateien aufrufen können?

Vorerst sehe ich zwei Möglichkeiten:

  1. Linker Befehle Irgendwie abrufen und verwenden; Diese Option scheint knifflig zu sein, da sie nicht direkt in clang unterstützt wird (zumindest in der Python-Bibliothek); oder
  2. Zum Zeitpunkt der Traversierung TranslationUnit AST Baum erinnern Sie den Speicherort der Funktion Deklaration in der Header-Datei. Diese Option scheint schwierig, wenn ich aufgrund der Makroverarbeitung verschiedene Zeilennummern oder implizite Funktionsdeklarationen für verschiedene TranslationUnits erhalten würde.

Gibt es noch andere Optionen? Welche Option und warum würden Sie wählen?

Antwort

1

Ich bin mir nicht sicher, ob es notwendig ist, die Informationen aus den Quellen mit Clang zu extrahieren, oder wenn Sie einfach die Informationen aus den resultierenden Binärdateien extrahieren können.

Wenn Sie die Symbole in der binären verwendet sehen möchten Sie

readelf -s <file> 

Dies listet die Symboltabelle verwenden könnte und Sie können extrahieren, wenn das Symbol durch die binäre vorgesehen oder erforderlich ist (importiert).

Mit

readelf -d <file> | grep NEEDED 

Sie eine Liste der abhängigen Bibliotheken erhalten.