Создание библиотеки импорта MSVC из DLL, использующей STDCALL

StackOverflow https://stackoverflow.com/questions/2393178

Вопрос

У меня есть 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)

Работал для меня :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top