I am developing a static analysis tool with python-clang-3.6
library that would let me to draw function call-graphs.
To properly create TranslationUnit
I need to use corresponding compile command (i.e. clang.cindex.Index.parse(c_file, compile_command)
). However, I believe, to be able to properly interconnect TranslationUnits
I would also need to use linker commands to know which TranslationUnit
uses functions from other TranslationUnits
. This is a problem in my project where there are actually multiple binaries being built with a single "make" invocation and some TranslationUnits
might possibly have colliding symbol names, so I can't assume that all of them are inter-connected.
What is the best way to address this issue so that my tool would know which functions in C file could call functions from other C files?
For now I see two options:
clang
(at least clang python library); orTranslationUnit
's AST tree remember the location of function declaration in the Header file. This option seems tricky if due to macro processing I would get different line numbers or have implicit function declarations for different TranslationUnits
.Are there any other options? Which option and why would chose you?
I'm not sure if it's necessary to extract the information from the sources using clang, or if you can simply extract the information from the resulting binaries.
If you want to see the symbols used in the binary you could use
readelf -s <file>
This lists the symbol table and you can extract if the symbol is provided by the binary or is required (imported).
Using
readelf -d <file> | grep NEEDED
you get a list of dependent libraries.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With