2010-08-08 7 views
5

Il est bien connu que glibc (et, autant que je sache, glibstd ++ aussi) utilise un mécanisme de versionnage de symboles. (Pour les détails se référer: How can I link to a specific glibc version.)Comment déterminer la version de la glibc (glibcxx) binaire dépendra de?

La question est de savoir comment déterminer les versions exactes de GLIBC et GLIBCXX sera choisi par l'éditeur de liens pour les noms de libc et libstdC++? Par exemple, comment obtenir quelque chose comme ceci:

time -> [email protected]_2_5 
... 
gethostbyname -> [email protected]_2_3 

Pourquoi avons-nous besoin de cela? Il me semble que cela peut être utile si vous voulez minimiser les versions requises de glibc/libstdC++.

+0

IIRC dso-howto (http://www.akkadia.org/drepper/dsohowto.pdf) avait une section sur l'utilisation des scripts de liens pour cela. – ninjalj

Répondre

9

Une chose que vous pouvez essayer est d'exécuter objdump -T sur votre binaire.

Si vous envisagez de vous connecter à des anciennes versions de symboles, sachez que ces anciennes versions peuvent également dépendre d'anciennes structures ou d'autres définitions. Pour éviter cela, compilez et liez avec des fichiers d'en-tête et des bibliothèques plus anciens.

+0

Merci, jilles. Ça marche. Une question de plus, comment obtenir l'emplacement dans le code à partir de quel symbole dynamique est appelé? Je veux dire, par exemple, si 'objdump -T' renvoie une entrée, disons GLIBCXX_3.4.9 *** Insert _ ***, comment comprendre quelles fonctions dans les sources utilisent ce symbole? – Shcheklein

+0

hmm, je ne connais pas vraiment une meilleure solution que d'exécuter objdump -t sur tous les fichiers .o et de vérifier lesquels contiennent des références à la fonction. Il semble que cela puisse être mieux fait car l'éditeur de liens sait où un symbole non résolu a été utilisé. – jilles

+0

Ok, merci. En tout cas c'est une autre question ... – Shcheklein