7
votes

Comment savoir *. .C et * .h des fichiers utilisés pour construire un binaire?

Je construis un projet qui construit plusieurs bibliothèques partagées et fichiers exécutables. Tous les fichiers source utilisés pour construire ces fichiers binaires sont dans un répertoire unique / SRC. Il n'est donc pas évident de comprendre quels fichiers sources ont été utilisés pour construire chacun des fichiers binaires (il y a de nombreuses relations à plusieurs).

Mon objectif est d'écrire un script qui analyserait un ensemble de fichiers C pour chaque binaire et assurez-vous que seules les bonnes fonctions sont appelées d'eux.

Une option semble être d'essayer d'extraire ces informations de Makefile. Mais cela ne fonctionne pas bien avec des fichiers et des en-têtes générés (en raison de la dépendance à l'encontre).

Une autre option pourrait être de simplement parcourir les graphiques d'appel, mais cela serait compliqué, car de nombreuses fonctions sont appelées à l'aide de pointeurs de fonction.

Toute autre idée?


5 commentaires

Juste hors de curiosité: pourquoi essayez-vous cela?


Le mécanisme de package de distribution connaît toutes les dépendances ...


Avez-vous une définition précise de ce que «les bonnes fonctions sont appelées» signifie? Il est non évident et n'est pas simple.


Dupliqué possible de Comment trouver le nom de fichier source de l'exécutable?


Pour référence: Cette réponse utilise une approche intéressante avec inotifywait


5 Réponses :


2
votes

Voici une idée, il faut affiner en fonction de votre construction spécifique. Fabriquez une construction, logez-le à l'aide du script (par exemple script log.txt Faire nettoyer tout ). La dernière (ou une des dernières) étape doit être la liaison des fichiers d'objet. (Astuce: recherchez cc -o ). Cette ligne doit relier tous les fichiers qui doivent avoir des fichiers correspondants .c dans votre arbre. Puis grep ces fichiers .c pour tous les fichiers d'en-tête fournis.

Si vous avez des noms en double dans vos fichiers .C de votre arbre, nous devrons examiner le chemin complet de la ligne de liaison ou travailler à partir du fichier Makefile .

Ce que Mahmood suggère ci-dessous devrait fonctionner aussi. Si vous avez une image avec des symboles, Strings | grep devrait vous donner une liste de fichiers C.


1 commentaires

Bonne idée aussi. Mais je ne connais pas les maquillages de GCC, mais je le fais avec VS et VS ne montrent pas cette étape dans de nombreux détails, il suffira de répertorier les fichiers de la bibliothèque que vous reliez.




2
votes

Vous pouvez utiliser UNIX NM code> outil. Il affiche tous les symboles définis dans l'objet. Donc, vous devez:

  1. Exécuter nm code> sur votre binaire et saisissez tous les symboles non définis li>
  2. Exécuter LDD code> sur votre liste binaire à saisir la liste de toutes ses dépendances dynamiques (fichiers .so Votre binaire est lié à) li>
  3. Exécuter nm code> sur chaque fichier .so code> Fichier Youf trouvé à l'étape 2. Li> ol>

    qui vous donnera la liste complète des symboles dynamique em> que votre utilisation binaire. p>

    Exemple: P>

    nm -C --dynamic /bin/ls
    ....skipping.....
    00000000006186d0 A _edata
    0000000000618c70 A _end
                     U _exit
    0000000000410e34 T _fini
    0000000000401d88 T _init
                     U _obstack_begin
                     U _obstack_newchunk
                     U _setjmp
                     U abort
                     U acl_extended_file
                     U bindtextdomain
                     U calloc
                     U clock_gettime
                     U closedir
                     U dcgettext
                     U dirfd
    


0 commentaires

10
votes

Vous pouvez d'abord compiler votre projet avec des informations de débogage (GCC -g) et utiliser objdump code> pour obtenir quels fichiers source ont été inclus.

 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    < c>   DW_AT_producer    : (indirect string, offset: 0x5f): GNU C 4.4.3 
    <10>   DW_AT_language    : 1    (ANSI C)
    <11>   DW_AT_name        : (indirect string, offset: 0x28): test_3.c    
    <15>   DW_AT_comp_dir    : (indirect string, offset: 0x36): /home/auselen/trials    
    <19>   DW_AT_low_pc      : 0x82f0   
    <1d>   DW_AT_high_pc     : 0x8408   
    <21>   DW_AT_stmt_list   : 0x0  


0 commentaires

1
votes

Si votre objectif est d'analyser les fichiers source C, vous pouvez le faire en personnalisant le compilateur GCC. Vous pouvez utiliser Melt à cet effet (Melt est une langue spécifique de haut niveau pour étendre GCC) -Adding votre Propre Analyser les passes codées à l'intérieur de la FLCC -, mais vous devriez d'abord en apprendre davantage sur les représentations internes internes du Middle-end (Gimple, Arbre, ...).

Personnalisation de la GCC prend plusieurs jours de travail (principalement parce que les internes de GCC sont assez complexes dans les détails).

N'hésitez pas à me demander plus de fondre.


0 commentaires