2015-06-29 18 views
5

Sto sviluppando uno strumento di analisi statica con libreria python-clang-3.6 che mi consente di disegnare grafici di chiamate di funzioni.uso di comandi linker per analisi statica clang

Per creare correttamente TranslationUnit, è necessario utilizzare il comando di compilazione corrispondente (ad esempio clang.cindex.Index.parse(c_file, compile_command)). Tuttavia, credo, per poter interconnettere correttamente TranslationUnits, avrei anche bisogno di usare i comandi linker per sapere quale TranslationUnit utilizza le funzioni di altri TranslationUnits. Questo è un problema nel mio progetto in cui esistono in realtà più file binari creati con una singola chiamata "make" e alcuni TranslationUnits potrebbero avere nomi di simboli in conflitto, quindi non posso presumere che tutti siano interconnessi.

Qual è il modo migliore per risolvere questo problema in modo che il mio strumento possa sapere quali funzioni nel file C possono chiamare funzioni da altri file C?

Per ora vedo due opzioni:

  1. In qualche modo recuperare e utilizzare i comandi linker; Questa opzione sembra complicata perché non è direttamente supportata in clang (almeno la libreria clang di python); oppure
  2. Nel momento in cui si attraversa l'albero AST di TranslationUnit, ricordare la posizione della dichiarazione di funzione nel file di intestazione. Questa opzione sembra complicata se, a causa dell'elaborazione della macro, otterrei numeri di linea diversi o avessi dichiarazioni di funzioni implicite per diversi TranslationUnits.

Ci sono altre opzioni? Quale opzione e perché sceglieresti?

risposta

1

Non sono sicuro se sia necessario estrarre le informazioni dai sorgenti usando clang, o se si può semplicemente estrarre le informazioni dai binari risultanti.

Se volete vedere i simboli usati nel binario è possibile utilizzare

readelf -s <file> 

Questo elenca la tabella dei simboli e si può estrarre se il simbolo è fornito dal binario o è richiesto (importata).

Utilizzando

readelf -d <file> | grep NEEDED 

si ottiene un elenco di librerie dipendenti.