Criando uma biblioteca de importação do MSVC a partir de uma DLL que usa o stdcall
-
25-09-2019 - |
Pergunta
Eu tenho uma DLL que exporta
extern "C" __declspec(dllexport) int __stdcall Foo( void );
Um despejo da DLL mostra
******************************************************************************
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
******************************************************************************
Comecei com o seguinte arquivo def:
LIBRARY simple.dll
EXPORTS
Foo
Isso criou um arquivo lib com as seguintes exportações:
Exports
ordinal name
_Foo
Quando eu vincula -me a esta biblioteca, o vinculador do MSVC reclama que não pode encontrar _foo@0. Para corrigir esse problema, adicionei um alias ao arquivo def.
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
O que resulta em um arquivo lib com exportações
Exports
ordinal name
_Foo
_Foo@0
Agora o projeto vincula sem nenhum problema. No entanto, quando tento executá -lo, recebo a mensagem
"O ponto de entrada do procedimento Foo@0 não pôde estar localizado na biblioteca dinâmica de links simples.dll"
Parece que, embora eu tenha dito ao lib.exe que Foo@0 é um alias para Foo, ele ainda cria uma biblioteca de importação que tenta carregar "foo@0" por nome.
Existe uma maneira de obter a biblioteca de importação para carregar "foo" quando eu pedi "foo@0"?
Obrigado,
David
Solução
Você teve a ideia certa tentando usar um pseudônimo ...
"Parece que a LIB não aceita formas alias (ela simplesmente ignorará a peça após o sinal igual); 2) assume todas as funções no arquivo def __cdecl. O segundo ponto está no fato de que a biblioteca de importação que ele produz será mapeada Cada símbolo na DLL para um nome interno com um sublinhado prefixado, ou seja, o vinculador usando a biblioteca de importação tentará resolver um símbolo indefinido _função para a função de símbolo na DLL. Não é preciso cuidado especial da convenção de chamada __stdCall. Algumas técnicas que poderíamos usar a LIB para produzir bibliotecas de importação para funções __STDCALL, mas o chamador só poderia chamá-las por ordinal, não pelo nome. Os detalhes são deixados como um exercício :-) ". (http://wyw.dcweb.cn/stdcall.htm)
Em vez de usar um alias, use um ordinal: (usando seu exemplo):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
Trabalhou para mim :)