2015-06-29 24 views
5

Opracowuję narzędzie analizy statycznej z biblioteką python-clang-3.6, które pozwoli mi rysować wywołania funkcji.użycie komend linera do analizy statycznej klang

Aby poprawnie utworzyć TranslationUnit, należy użyć odpowiedniego polecenia kompilacji (tj. clang.cindex.Index.parse(c_file, compile_command)). Wierzę jednak, że aby móc poprawnie łączyć TranslationUnits, potrzebowałbym również użyć poleceń linkera, aby wiedzieć, który TranslationUnit wykorzystuje funkcje z innych . Jest to problem w moim projekcie, w którym faktycznie powstaje wiele plików binarnych z pojedynczą inwokacją "make", a niektóre z nich mogą mieć kolidujące nazwy symboli, więc nie mogę założyć, że wszystkie są ze sobą powiązane.

Jaki jest najlepszy sposób rozwiązania tego problemu, aby moje narzędzie wiedziałoby, które funkcje w pliku C mogłyby wywoływać funkcje z innych plików C?

Na razie widzę dwie opcje:

  1. jakoś odtworzyć i użyć polecenia łączącą; Ta opcja wydaje się trudna, ponieważ nie jest obsługiwana bezpośrednio w clang (przynajmniej biblioteka python clang); lub
  2. W czasie, gdy przechodzenie przez drzewo AST TranslationUnit pamięta położenie deklaracji funkcji w pliku nagłówka. Ta opcja wydaje się trudna, jeśli z powodu przetwarzania makr dostanę różne numery linii lub domyślne deklaracje funkcji dla różnych TranslationUnits.

Czy są jeszcze jakieś opcje? Którą opcję i dlaczego wybrałeś?

Odpowiedz

1

Nie jestem pewien, czy konieczne jest wyodrębnienie informacji ze źródeł za pomocą klang, czy też można po prostu wyodrębnić informacje z wynikowych plików binarnych.

Jeśli chcesz zobaczyć symbole używane są w formacie binarnym można użyć

readelf -s <file> 

Lista tablicę symboli i można wyodrębnić jeśli symbol jest przez binarny lub jest wymagany (importowane).

Korzystanie

readelf -d <file> | grep NEEDED 

dostaniesz listę bibliotek zależnych.