Erstellen einer MSVC-Importbibliothek aus einer DLL, die stdcall verwendet
-
25-09-2019 - |
Frage
Ich habe eine DLL, die exportiert
extern "C" __declspec(dllexport) int __stdcall Foo( void );
Ein Dump der DLL wird angezeigt
******************************************************************************
Section: Exports
File Offset: 00001400 (5120)
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000
Exports from simple.dll
3 exported name(s), 3 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00002104 3 0000 std::nothrow
00001258 2 0001 Foo
000020F8 1 0002 ___CPPdebugHook
******************************************************************************
Ich habe mit der folgenden Def-Datei begonnen:
LIBRARY simple.dll
EXPORTS
Foo
Dadurch wurde eine lib-Datei mit den folgenden Exporten erstellt:
Exports
ordinal name
_Foo
Wenn ich mit dieser Bibliothek verlinke, beschwert sich der MSVC-Linker, dass er _Foo@0 nicht finden kann.Um dieses Problem zu beheben, habe ich der Def-Datei einen Alias hinzugefügt.
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
Was zu einer lib-Datei mit Exporten führt
Exports
ordinal name
_Foo
_Foo@0
Jetzt lässt sich das Projekt problemlos verknüpfen.Wenn ich jedoch versuche, es auszuführen, erhalte ich die Meldung
„Der Prozedureinstiegspunkt Foo@0 konnte in der Dynamic Link Library simple.dll nicht gefunden werden.“
Obwohl ich lib.exe mitgeteilt habe, dass Foo@0 ein Alias für Foo ist, scheint es also immer noch eine Importbibliothek zu erstellen, die versucht, „Foo@0“ namentlich zu laden.
Gibt es eine Möglichkeit, die Importbibliothek dazu zu bringen, „Foo“ zu laden, wenn ich nach „Foo@0“ gefragt habe?
Danke,
David
Lösung
Sie hatten die richtige Idee, einen Alias zu verwenden ...
„Es scheint, dass LIB keine Alias-Formen akzeptiert (der Teil nach dem Gleichheitszeichen wird einfach ignoriert);2) Es übernimmt alle Funktionen in der DEF-Datei __cdecl.Der zweite Punkt liegt in der Tatsache, dass die von ihr erzeugte Importbibliothek jedes Symbol in der DLL einem internen Namen mit einem vorangestellten Unterstrich zuordnet, d. h. der Linker, der die Importbibliothek verwendet, wird versuchen, ein undefiniertes Symbol _Function in das Symbol Function in aufzulösen die DLL.Die __stdcall-Aufrufkonvention muss nicht besonders beachtet werden.Mit einigen Techniken könnten wir LIB verwenden, um Importbibliotheken für __stdcall-Funktionen zu erstellen, aber der Aufrufer könnte sie nur über die Ordinalzahl und nicht über den Namen aufrufen.Die Details bleiben als Übung übrig :-)." (http://wyw.dcweb.cn/stdcall.htm)
Verwenden Sie anstelle eines Alias eine Ordnungszahl:(anhand Ihres Beispiels):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
Hat bei mir funktioniert :)