Creación de una biblioteca de importación MSVC desde un archivo DLL que utiliza STDCALL
-
25-09-2019 - |
Pregunta
Tengo un DLL que las exportaciones
extern "C" __declspec(dllexport) int __stdcall Foo( void );
Un volcado de los espectáculos 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
******************************************************************************
Me comenzó con el siguiente archivo de definición:
LIBRARY simple.dll
EXPORTS
Foo
Esto crea un archivo lib con las siguientes exportaciones:
Exports
ordinal name
_Foo
Cuando me enlace con esta biblioteca, el enlazador msvc se queja de que no puede encontrar _foo @ 0. Para corregir este problema, he añadido un alias en el fichero def.
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
¿Qué resultados en un archivo lib con las exportaciones
Exports
ordinal name
_Foo
_Foo@0
Ahora los enlaces del proyecto sin ningún tipo de problema. Sin embargo, cuando intento ejecutarlo, me sale el mensaje
"El punto de entrada del procedimiento Foo @ 0 no se encuentra en la biblioteca de vínculos dinámicos simple.dll"
Así que parece que a pesar de que le dije que lib.exe Foo @ 0 es un alias de Foo, todavía crea una biblioteca de importación que intenta cargar "Foo @ 0" por su nombre.
¿Hay una manera de conseguir la biblioteca de importación de carga "Foo" cuando pedí "Foo @ 0"?
Gracias,
David
Solución
tenido la idea correcta tratando de utilizar un alias ...
"parece LIB no acepta formas de alias (simplemente ignorará la parte después del signo igual);. 2) que asume todas las funciones en el __cdecl archivo DEF El segundo se encuentra el punto en el hecho de que la biblioteca de importación se produce trazará un mapa de cada símbolo en la DLL a un nombre interno con un guión prefijado, es decir, el enlazador usando la biblioteca de importación intentará resolver un símbolo indefinido _function a la función de símbolos en el archivo DLL. Se necesita ningún cuidado especial de la vocación __stdcall convención. con algunas técnicas que podríamos utilizar LIB para producir bibliotecas de importación para __stdcall funciones, pero la persona que llama sólo podíamos llamarlos por ordinal, no por su nombre. los detalles se dejan como ejercicio :-)." ( http://wyw.dcweb.cn/stdcall.htm )
En lugar de utilizar un alias de utilizar un ordinal: (usando el ejemplo):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
a mí me funcionó:)