Создание библиотеки импорта MSVC из DLL, использующей STDCALL
-
25-09-2019 - |
Вопрос
У меня есть DLL, которая экспортирует
extern "C" __declspec(dllexport) int __stdcall Foo( void );
Дампа DLL показывает
******************************************************************************
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
******************************************************************************
Я начал со следующего файла def:
LIBRARY simple.dll
EXPORTS
Foo
Это создало файл lib со следующим экспортом:
Exports
ordinal name
_Foo
Когда я связываю с этой библиотекой, Linker MSVC жалуется, что он не может найти _foo @ 0. Чтобы исправить эту проблему, добавил псевдоним в файл def.
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
Который приводит к файлу lib с экспортом
Exports
ordinal name
_Foo
_Foo@0
Теперь проектные ссылки без какой-либо проблемы. Тем не менее, когда я пытаюсь запустить его, я получаю сообщение
«Точка входа процедуры FOO @ 0 не может быть расположена в библиотеке динамической ссылки Simple.dll»
Таким образом, кажется, что, хотя я сказал lib.exe, что foo @ 0 - псевдоним для foo, он все еще создает библиотеку импорта, которая пытается загрузить «FOO @ 0» по имени.
Есть ли способ получить библиотеку импорта для загрузки «Foo», когда я спросил «Foo @ 0»?
Спасибо,
Дэйвид
Решение
Вы имели правильную идею, пытаясь использовать псевдоним ...
«Кажется, Lib не принимает псевдонимах форм (он просто будет игнорировать часть после равного знака); 2) предполагает все функции в файле def __CDECL. Вторая точка заключается в том, что библиотека импорта, которая она производит, будет отображаться Каждый символ в DLL к внутреннему имени с префиксом подчеркивания, т. Е. Синкер с использованием библиотеки импорта будет пытаться разрешить неопределенный символ _function к функции символа в DLL. Это не требует особого ухода за конвенцией о вызове __stcall. С Некоторые методы, которые мы могли бы использовать Lib для создания библиотек импорта для функций __STCALL, но вызывающий абонент может позвонить только по ординалам, а не по имени. Детали остаются как упражнение :-). (http://wyw.dcweb.cn/stdcall.htm.)
Вместо использования псевдонима, используйте порядковый характер: (используя свой пример):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
Работал для меня :)