73 votes

Outils pour inspecter les fichiers .lib ?

Je suis en train d'évaluer un logiciel sous-documenté. Lorsque je construis un projet d'exemple, j'obtiens une erreur d'édition de liens qui ressemble à ceci :

error LNK2019: unresolved external symbol

Il n'y a pas beaucoup de fichiers de librairie avec cette application, donc je peux résoudre ce problème par essais et erreurs, mais je sais qu'il y a une autre solution. élégant manière de résoudre ce problème.

Dans le monde de Java, je voudrais grep FOO *.jar pour trouver le bocal et je cherche l'analogue du C++. Je travaille avec du code C++ dans Visual Studio 2005.

Je pense que l'utilitaire lib.exe avec l'option /LIST peut obtenir les informations, mais je n'y suis pas parvenu jusqu'à présent. Il affiche simplement ceci :

Microsoft (R) Library Manager Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

granite50.dll
granite50.dll
granite50.dll
granite50.dll
...

Des suggestions ?

91voto

D.Shawley Points 30324

Tout d'abord, vous devez savoir à quel type de bibliothèque vous avez affaire. Certaines bibliothèques contiennent simplement des liens pour une DLL (c'est-à-dire des bibliothèques d'importation) et d'autres sont des objets de code qui font partie de l'image exécutable (c'est-à-dire des bibliothèques statiques). D'après ce que vous avez vu, il s'agit d'une bibliothèque d'importation de DLL.

Ensuite, il faut utiliser le bon outil. Lib.exe est utilisé pour extraire les fichiers objets des bibliothèques et autres. C'est à peu près la même chose que l'utilitaire jar pour Java. Microsoft fournit dumpbin.exe qui extrait les informations de la bibliothèque. Je vois que LarryF a déjà mentionné ceci.

Pour les bibliothèques d'importation, exécutez dumpbin.exe -headers foo.lib et le redirige vers un fichier de sortie. La sortie contiendra des extraits pour chaque symbole que la DLL concernée exporte. Recherchez les lignes commençant par " Symbol name :" . Notez qu'il y a deux espaces avant et après "Symbol name" si vous voulez une correspondance exacte. Vous pouvez également exécuter la sortie par findstr pour générer une liste de symboles et la rediriger vers un fichier texte si vous voulez quelque chose d'un peu plus joli à regarder :

dumpbin.exe -headers foo.lib | findstr /c:"  Symbol name  :" > foo-exports.txt

L'autre option est d'ouvrir la DLL concernée avec depends.exe .

1 votes

Pour tous ceux qui ont des problèmes de fonctionnement dumpbin.exe de Powershell - stackoverflow.com/questions/477387/cannot-find-dumpbin-exe/

0 votes

J'ai pu l'exécuter à partir de l'invite de commande VS sans problème.

16voto

LarryF Points 2761

Plus d'une chose peut être votre problème ici. Je ne suis pas sûr que chercher dans le fichier lib soit la meilleure façon de le résoudre, IMHO... Cependant, le DUMPBIN.exe est probablement l'outil que vous recherchez. Utilisez-le à partir de la ligne de commande, mais assurez-vous que vos chemins d'accès sont définis, ou utilisez le "Visual Studio Command Prompt" que VS installe pour vous dans votre menu de démarrage VS.

0 votes

Thanks for the pointer to dumpbin. J'ai fait <b>dumpbin /all some.lib > some.dump</b> puis j'ai parcouru mes fichiers dump et j'ai trouvé la bibliothèque que je devais lier.

11voto

Elmue Points 277

Si vous avez une DLL et que vous voulez l'utiliser dans votre code avec __declspec(dllimport) vous pouvez créer facilement le fichier LIB requis si vous avez un fichier DEF pour la DLL :

lib /def:mydll.def /nologo /machine:x86  

qui crée mydll.lib

Cette commande doit être exécutée dans l'invite de commande de Visual Studio SDK.

Si vous ne disposez pas d'un fichier DEF, il est extrêmement facile de l'écrire manuellement : Vous ouvrez la DLL dans DependencyWalker ( http://www.dependencywalker.com ), sélectionnez "Enregistrer sous" -> "Texte avec listes d'importation/exportation" et faites en sorte que l'option noms y ordinaux de toutes les fonctions exportées dans un fichier txt comme ceci :

Export  Ordinal      Hint         Function                          Entry Point
------  -----------  -----------  --------------------------------  -----------
[C  ]    2 (0x0002)   1 (0x0001)  gsasl_base64_from                 0x000024F0
[C  ]    3 (0x0003)   2 (0x0002)  gsasl_base64_to                   0x000024A0
[C  ]    4 (0x0004)   3 (0x0003)  gsasl_callback                    0x000018B0
[C  ]    5 (0x0005)   4 (0x0004)  gsasl_callback_hook_get           0x00001900
[C  ]    6 (0x0006)   5 (0x0005)  gsasl_callback_hook_set           0x000018F0
[C  ]    7 (0x0007)   6 (0x0006)  gsasl_callback_set                0x000018A0
[C  ]    8 (0x0008)   7 (0x0007)  gsasl_check_version               0x00001870
[C  ]    9 (0x0009)   8 (0x0008)  gsasl_client_mechlist             0x00001E20
[C  ]   10 (0x000A)   9 (0x0009)  gsasl_client_start                0x00001F40

Le reste se fait rapidement. Créez un Fichier DEF qui a ce format :

EXPORTS
gsasl_base64_from @2
gsasl_base64_to @3
gsasl_callback @4
gsasl_callback_hook_get @5
gsasl_callback_hook_set @6
gsasl_callback_set @7
gsasl_check_version @8
gsasl_client_mechlist @9
gsasl_client_start @10
gsasl_client_suggest_mechanism @11

Le chiffre derrière le @ est l'ordinal.


P.D : DependencyWalker peut même décorer les noms cryptiques des exportations C++ comme

Foo@@YGHHH@Z   -->   int Foo(int, int).

0 votes

En fait, cela ne fonctionne plus avec x64 en raison des changements d'ABI.

8voto

user1952009 Points 89

Cela a fonctionné avec un fichier .lib de Visual C++ express 9 :

dumpbin.exe -headers clangParse.lib | findstr /c:"COMDAT"  > clangParse-exports.txt

o

dumpbin.exe -headers clangParse.lib | findstr /c:"sym="  > clangParse-exports.txt

merci d.shawley

2voto

KunMing Xie Points 965

Ouvrir l'invite de commande de Visual Studio

dumpbin /all Effects11.lib > D:\1.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X