Tools zum Überprüfen von .lib-Dateien?

72

Ich evaluiere eine nicht dokumentierte Software. Wenn ich ein Beispielprojekt erstelle, wird ein Linkerfehler angezeigt, der wie folgt aussieht:

Fehler LNK2019: ungelöstes externes Symbol

Es gibt nicht viele lib-Dateien mit dieser App, daher kann ich dieses Problem mit Versuch und Irrtum lösen, aber ich weiß, dass es eleganter ist, dieses Problem zu lösen.

In der Java-Welt würde ich FOO * .jar suchen, um das Glas zu finden, und ich suche nach dem C ++ - Analogon. Ich arbeite mit C ++ - Code in Visual Studio 2005.

Ich vermute, dass das Dienstprogramm lib.exe mit der Option / LIST die Informationen abrufen kann, aber ich war bisher nicht erfolgreich. Es wird nur Folgendes gedruckt:

Microsoft (R) Library Manager Version 8.00.50727.762
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.

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

Irgendwelche Vorschläge?

Criddell
quelle

Antworten:

91

Zunächst müssen Sie wissen, welche Art von Bibliothek Sie betrachten. Einige Bibliotheken enthalten einfach Verknüpfungen für eine DLL (dh Bibliotheken importieren), andere sind Codeobjekte, die Teil des ausführbaren Images werden (dh statische Bibliotheken). Nach dem Aussehen dieser Ausgabe haben Sie sich eine DLL-Importbibliothek angesehen.

Als nächstes möchten Sie das richtige Werkzeug verwenden. Lib.exe wird verwendet, um Objektdateien aus Bibliotheken zu extrahieren und was nicht. Dies ist so ziemlich das gleiche wie das JAR-Dienstprogramm für Java. Microsoft stellt dumpbin.exe zur Verfügung, mit der Informationen aus der Bibliothek ausgegeben werden. Ich sehe, dass LarryF dies bereits erwähnt hat.

Führen dumpbin.exe -headers foo.libSie zum Importieren von Bibliotheken diese aus und leiten Sie sie in eine Ausgabedatei um. Die Ausgabe enthält Ausschnitte für jedes Symbol, das die zugehörige DLL exportiert. Suchen Sie nach Zeilen, die mit beginnen " Symbol name :". Beachten Sie, dass vor und nach "Symbolname" zwei Leerzeichen stehen, wenn Sie eine genaue Übereinstimmung wünschen. Sie können die Ausgabe auch durchlaufen findstr, um eine Liste von Symbolen zu generieren und diese in eine Textdatei umzuleiten, wenn Sie etwas Schöneres betrachten möchten:

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

Die andere Option besteht darin, die zugehörige DLL mit zu öffnen depends.exe.

D. Shawley
quelle
Für alle, die Probleme beim Ausführen dumpbin.exevon Powershell- stackoverflow.com/questions/477387/cannot-find-dumpbin-exe/…
Ralt
Konnte dies ohne Probleme über die VS-Eingabeaufforderung ausführen.
Deepelement
16

Mehr als eine Sache kann hier Ihr Problem sein. Ich bin mir nicht sicher, ob ein Blick in die lib-Datei der beste Weg ist, dies zu lösen, IMHO ... Allerdings ist die Datei DUMPBIN.exe wahrscheinlich das Werkzeug, nach dem Sie suchen. Verwenden Sie es über die Befehlszeile, stellen Sie jedoch sicher, dass Ihre Pfade festgelegt sind, oder verwenden Sie die "Visual Studio-Eingabeaufforderung", die VS für Sie in Ihrem VS-Startmenü installiert.

LarryF
quelle
Danke für den Hinweis auf dumpbin. Ich habe <b> dumpbin / all some.lib> some.dump </ b> ausgeführt und dann meine Dump-Dateien durchsucht und die Bibliothek gefunden, die ich verknüpfen musste.
Criddell
11

Wenn Sie eine DLL haben und diese in Ihrem Code verwenden möchten, __declspec(dllimport)können Sie die erforderliche LIB-Datei einfach erstellen, wenn Sie eine DEF-Datei für die DLL haben:

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

das schafft mydll.lib

Dieser Befehl sollte in der Visual Studio SDK-Eingabeaufforderung ausgeführt werden.

Eine DEF-Datei kann sehr einfach manuell geschrieben werden, wenn Sie keine haben: Sie öffnen die DLL in DependencyWalker ( http://www.dependencywalker.com ) und wählen "Speichern unter" -> "Text mit Import- / Exportlisten". und haben die Namen und Ordnungszahlen aller exportierten Funktionen in einer txt-Datei wie folgt:

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

Der Rest ist schnell erledigt. Erstellen Sie eine DEF-Datei mit diesem 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

Die Zahl hinter dem @ ist die Ordnungszahl.


PD: Dependency Walker können sogar undecorate kryptischen Namen von C ++ Exporte wie

Foo@@YGHHH@Z   -->   int Foo(int, int). 
Elmue
quelle
Übrigens funktioniert dies mit x64 aufgrund der ABI-Änderungen nicht mehr.
0xC0000022L
8

Dies funktionierte mit einem visuellen C ++ Express 9 .lib:

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

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

danke d.shawley

reuns
quelle
2

Öffnen Sie die Visual Studio-Eingabeaufforderung

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

KunMing Xie
quelle