Creating an MSVC import library from a DLL using stdcall

I have a dll that exports

extern "C" __declspec(dllexport) int __stdcall Foo( void ); 

Dump dll shows

 ****************************************************************************** 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 ****************************************************************************** 

I started with the following def file:

 LIBRARY simple.dll EXPORTS Foo 

This created a lib file with the following exports:

 Exports ordinal name _Foo 

When I contact this library, the msvc linker complains that it cannot find _Foo @ 0. To fix this problem, I added an alias to the def file.

 LIBRARY simple.dll EXPORTS Foo Foo@0 =Foo 

The result is a lib file with export

 Exports ordinal name _Foo _Foo@0 

Now the project is connecting without any problems. However, when I try to start it, I get a message

"The Foo @ 0 login point cannot be located in the simple.dll dynamic link library"

So it seems that although I told lib.exe that Foo @ 0 is an alias for Foo, it still creates an import library that tries to load "Foo @ 0" by name.

Is there a way to get the import library to load "Foo" when I asked for "Foo @ 0"?

Thanks,

David

+4
source share
1 answer

You had the right idea when trying to use an alias ...

"it looks like the LIB does not accept aliases (it just ignores the part after the equal sign); 2) it takes all the functions in the __cdecl DEF file. The second point is that the import library matches each symbol in the DLL with an internal name with an underscore prefix that is, the linker using the import library will try to resolve the undefined _Function symbol to the Function symbol in the DLL. It does not really care about __stdcall call convention. Using some methods, we could use the LIB to create import libraries for the __stdcall functions, but in the caller called them only by serial numbers, not by name. Details are left as an exercise :-). " ( http://wyw.dcweb.cn/stdcall.htm )

Instead of using an alias, use the serial number: (using your example):

 LIBRARY simple.dll EXPORTS Foo Foo@0 @2 ;(from your dumpbin) 

Worked for me :)

+4
source

Source: https://habr.com/ru/post/1303347/


All Articles