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). P>
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. strong> p>
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). P>
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. P>
Toute autre idée? p>
5 Réponses :
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 Si vous avez des noms en double dans vos fichiers Ce que Mahmood suggère ci-dessous devrait fonctionner aussi. Si vous avez une image avec des symboles, script log.txt Faire nettoyer tout code>). La dernière (ou une des dernières) étape doit être la liaison des fichiers d'objet. (Astuce: recherchez
cc -o
code> qui doivent avoir des fichiers correspondants
.c code> dans votre arbre. Puis grep ces fichiers
.c code> pour tous les fichiers d'en-tête fournis. P>
.C code> de votre arbre, nous devrons examiner le chemin complet de la ligne de liaison ou travailler à partir du fichier
Makefile code >. p>
Strings
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.
Tout d'abord, vous devez séparer les symboles de débogage du binaire que vous venez de compiler. Vérifiez cette question sur la façon de faire:
Comment générer un symbole de débogage de GCC en dehors de la cible de construction? < / a> p>
Ensuite, vous pouvez essayer d'analyser ce fichier par vous-même. Je sais comment le faire pour Visual Studio, mais comme vous utilisez GCC, je ne pourrai pas vous aider davantage. P>
Vous pouvez utiliser UNIX qui vous donnera la liste complète des symboles dynamique em> que votre utilisation binaire. p> Exemple: P> NM code> outil. Il affiche tous les symboles définis dans l'objet. Donc, vous devez:
nm code> sur votre binaire et saisissez tous les symboles non définis li>
LDD code> sur votre liste binaire à saisir la liste de toutes ses dépendances dynamiques (fichiers .so Votre binaire est lié à) li>
nm code> sur chaque fichier
.so code> Fichier Youf trouvé à l'étape 2. Li>
ol>
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
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
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, ...). P>
Personnalisation de la GCC prend plusieurs jours de travail (principalement parce que les internes de GCC sont assez complexes dans les détails). P>
N'hésitez pas à me demander plus de fondre. p>
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 code>