Estoy desarrollando una herramienta de análisis estático con la biblioteca python-clang-3.6 que me permitiría dibujar gráficos de llamadas de función.
Para crear TranslationUnit correctamente, necesito usar el comando de compilación correspondiente (es decir clang.cindex.Index.parse(c_file, compile_command) ). Sin embargo, creo que para poder interconectar TranslationUnits correctamente, también necesitaría usar comandos de vinculación para saber qué TranslationUnit usa funciones de otras TranslationUnits . Este es un problema en mi proyecto donde en realidad se están construyendo varios binarios con una sola invocación de "hacer" y algunas unidades de TranslationUnits posiblemente tengan nombres de símbolos en conflicto, por lo que no puedo asumir que todos ellos están interconectados.
¿Cuál es la mejor manera de abordar este problema para que mi herramienta sepa qué funciones en el archivo C podrían llamar funciones de otros archivos C?
Por ahora veo dos opciones:
clang (al menos en la biblioteca clang python); oTranslationUnit , recuerde la ubicación de la declaración de la función en el archivo de encabezado. Esta opción parece complicada si, debido al procesamiento de macros, obtengo diferentes números de línea o tengo declaraciones de funciones implícitas para diferentes TranslationUnits .¿Hay más opciones? ¿Qué opción y por qué elegiría usted?
No estoy seguro de si es necesario extraer la información de las fuentes usando clang, o si simplemente puede extraer la información de los archivos binarios resultantes.
Si desea ver los símbolos utilizados en el binario, puede utilizar
readelf -s <file>Esto enumera la tabla de símbolos y puede extraer si el binario proporciona el símbolo o si es necesario (importado).
Utilizando
readelf -d <file> | grep NEEDEDobtienes una lista de bibliotecas dependientes.