Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Identifier les dépendances à une bibliothèque

9 réponses
Avatar
Olivier Miakinen
Bonjour,

Afin de remplacer une très vieille version d'une bibliothèque
(library en anglais) dans un programme qui l'utilise, je cherche
à identifier tous les symboles utilisés (fonctions en particulier).

Comme je ne suis pas sûr d'être très clair, je précise ce que je
veux dire.

+------------------------------------------------------------------+
Un programme dont j'ai les sources utilise la bibliothèque UCD-SNMP
dans une version datée, si je ne m'abuse, du 4 décembre 2000.
Cette bibliothèque a forcément évolué depuis, jusqu'à son nom qui
est devenu NET-SNMP <http://www.net-snmp.org/>. Afin d'évaluer la
quantité de travail à fournir pour remplacer UCD-SNMP 2000 par
NET-SNMP 2013, je voudrais identifier tous les points d'adhérence.
Bien sûr je peux le faire en lisant tout le code source, mais je
me demande s'il ne serait pas possible de le faire via une commande
unix sur l'exécutable.

J'ai lu la page man de 'nm' sur Linux, qui m'a aussi renvoyé aux man
de 'readelf' et 'objdump', mais je n'ai pas réussi à trouver ce que
je cherchais -- ce qui ne veut pas dire que ça n'existe pas, c'est
peut-être juste que j'ai mal regardé.
+------------------------------------------------------------------+

Et donc, en bref, voici ce que je cherche : sachant qu'une bibliothèque
fournit les symboles truc, bidule, chose, machin, et ainsi de suite,
mais qu'un programme n'utilise que les symboles bidule et chose et
pas truc et machin, comment faire pour obtenir cette liste de symboles
utilisés ?

Je précise que je ne suis pas limité à Linux : s'il est plus facile
d'utiliser des outils spécifiques Sun ou AIX, ça peut se faire aussi.
Et également sur Windows, mais bon, je n'aime pas beaucoup Windows,
alors je préfèrerais rester sur Unix-like (d'autant qu'alors on
serait hors-charte dans le groupe f.c.o.unix).

Cordialement,
--
Olivier Miakinen

9 réponses

Avatar
Tanguy Ortolo
Olivier Miakinen, 2013-06-07 16:51+0200:
Afin de remplacer une très vieille version d'une bibliothèque
(library en anglais) dans un programme qui l'utilise, je cherche
à identifier tous les symboles utilisés (fonctions en particulier).



nm --dynamic ?

Les fonctions à importer depuis une autre bibliothèque sont marquée U
(undefined).

--
. o .
. . o Tanguy
o o o
Avatar
Alain Ketterlin
Olivier Miakinen <om+ writes:

[...]
Et donc, en bref, voici ce que je cherche : sachant qu'une bibliothè que
fournit les symboles truc, bidule, chose, machin, et ainsi de suite,
mais qu'un programme n'utilise que les symboles bidule et chose et
pas truc et machin, comment faire pour obtenir cette liste de symboles
utilisés ?



Est-ce que "nm -D" ne fournit pas ce que tu cherches ? J'ai l'impression
qu'il te suffit de regarder ce qui est flaggé U, et de croiser avec ce
que fournis ta lib... Je ne pense pas qu'il soit possible d'avoir
quelque chose de plus précis

-- Alain.

P/S: je parle de ELF sous Linux, je ne sais pas pour les autres
Avatar
Olivier Miakinen
Bonjour,

Le 07/06/2013 17:02, Tanguy Ortolo a écrit :

nm --dynamic ?

Les fonctions à importer depuis une autre bibliothèque sont marquée U
(undefined).



Le 07/06/2013 17:12, Alain Ketterlin a écrit :

Est-ce que "nm -D" ne fournit pas ce que tu cherches ? J'ai l'impression
qu'il te suffit de regarder ce qui est flaggé U, [...]



Merci à tous les deux, malheureusement ça ne fonctionne pas. Je suppose
que la bibliothèque doit être liée en statique, et que c'est pour ça que
les fonctions qui m'intéressent sont marquées T et pas U. Inversement,
il y a tellement de fonctions marquées T que ça ne m'avance pas plus
que le nm sur la bibliothèque elle-même.

Bon, eh bien je crois que je vais devoir me plonger directement dans le
code source !
Avatar
Nicolas George
Olivier Miakinen , dans le message <kot22c$2ecv$,
a écrit :
Merci à tous les deux, malheureusement ça ne fonctionne pas. Je suppose
que la bibliothèque doit être liée en statique, et que c'est pour ça que
les fonctions qui m'intéressent sont marquées T et pas U. Inversement,
il y a tellement de fonctions marquées T que ça ne m'avance pas plus
que le nm sur la bibliothèque elle-même.



Tu peux comparer la liste des symboles définis dans le binaire avec ceux
définis dans l'archive de la bibliothèque originale, si tu arrives à mettre
la main dessus.

Heureusement pour toi que le binaire n'a pas été stripé.
Avatar
Olivier Miakinen
Le 07/06/2013 18:56, Nicolas George a écrit :

Tu peux comparer la liste des symboles définis dans le binaire avec ceux
définis dans l'archive de la bibliothèque originale, si tu arrives à mettre
la main dessus.



Non seulement j'ai la bibliothèque originale, mais j'ai même son code
source complet et tout ce qu'il faut pour la recompiler. C'est juste
la flemme de devoir fouiller dans les fichiers source qui me faisait
me demander s'il existait une méthode plus rapide.

Cela dit, ayant tout ça, la méthode plus rapide consiste peut-être
à en faire une bibliothèque dynamique plutôt que statique...

Heureusement pour toi que le binaire n'a pas été stripé.



;-)
Avatar
Alain Ketterlin
Olivier Miakinen <om+ writes:

[...]
Non seulement j'ai la bibliothèque originale, mais j'ai même so n code
source complet et tout ce qu'il faut pour la recompiler. C'est juste
la flemme de devoir fouiller dans les fichiers source qui me faisait
me demander s'il existait une méthode plus rapide.

Cela dit, ayant tout ça, la méthode plus rapide consiste peut- être
à en faire une bibliothèque dynamique plutôt que statique. ..



Ce serait-il pas plus simple de reconstruire en "oubliant" la
bibliothèque en question pour l'édition de liens ? Le linker va
t'afficher une liste de ce qui manque...

-- Alain.
Avatar
Erwan David
Alain Ketterlin écrivait :

Olivier Miakinen <om+ writes:

[...]
Non seulement j'ai la bibliothèque originale, mais j'ai même son code
source complet et tout ce qu'il faut pour la recompiler. C'est juste
la flemme de devoir fouiller dans les fichiers source qui me faisait
me demander s'il existait une méthode plus rapide.

Cela dit, ayant tout ça, la méthode plus rapide consiste peut-être
à en faire une bibliothèque dynamique plutôt que statique...



Ce serait-il pas plus simple de reconstruire en "oubliant" la
bibliothèque en question pour l'édition de liens ? Le linker va
t'afficher une liste de ce qui manque...



Mais ce n'est pas bon : le linker ne va pas indiquer les macros qui
manquent par exemple.

Mieux vaut enlever les include correspondant à la lib et voir ce qui est
appelé et non défini.

--
Les simplifications c'est trop compliqué
Avatar
Cyrille Lefevre
Le 10/06/2013 13:25, Erwan David a écrit :
Alain Ketterlin écrivait :

Olivier Miakinen <om+ writes:

[...]
Non seulement j'ai la bibliothèque originale, mais j'ai même son code
source complet et tout ce qu'il faut pour la recompiler. C'est juste
la flemme de devoir fouiller dans les fichiers source qui me faisait
me demander s'il existait une méthode plus rapide.

Cela dit, ayant tout ça, la méthode plus rapide consiste peut-ê tre
à en faire une bibliothèque dynamique plutôt que statique...



Ce serait-il pas plus simple de reconstruire en "oubliant" la
bibliothèque en question pour l'édition de liens ? Le linker va
t'afficher une liste de ce qui manque...



Mais ce n'est pas bon : le linker ne va pas indiquer les macros qui
manquent par exemple.



Bonjoir,

ben si, puisque la macro ne sera pas résolu, elle passera pour un objet
inexistant et l'éditeur de lien l'identifiera comme manquant.

Mieux vaut enlever les include correspondant à la lib et voir ce qui est
appelé et non défini.



le plus simple est effectivement de repartir sur une base saine, c-a-d,
mettre de côté UCD-SNMP, de mettre NET-SNMP à la place, de relancer la
compil et de compter les points. de toutes les façons, il y aura
surement des adaptations à réaliser pour se mettre à niveau...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Olivier Miakinen
Le 12/06/2013 01:52, Cyrille Lefevre répondait à Erwan David (répondant
à Alain Ketterlin et à moi :

le plus simple est effectivement de repartir sur une base saine, c-a-d,
mettre de côté UCD-SNMP, de mettre NET-SNMP à la place, de relancer la
compil et de compter les points. de toutes les façons, il y aura
surement des adaptations à réaliser pour se mettre à niveau...



C'est ce que j'ai commencé à faire. Merci à tous pour les suggestions
et remarques !

Cordialement,
--
Olivier Miakinen