Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

usage of linker commands for clang static analysis

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:

  1. Somehow retrieve and use linker commands; This option seems tricky because it is not directly supported in clang (at least clang python library); or
  2. At the time when traversing TranslationUnit'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?

like image 665
user389238 Avatar asked Nov 10 '22 10:11

user389238


1 Answers

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.

like image 148
Hans Dampf Avatar answered Nov 14 '22 22:11

Hans Dampf