advertencia LNK4086 y desaparecidos punto de entrada DLL en VS2008 asm acumulación
-
16-09-2019 - |
Pregunta
He intentado compilar el siguiente archivo asm en VS2008 (como parte de un proyecto DLL Win32 vacía a la que he añadido este archivo asm individual):
.386
.model flat, stdcall
option casemap:none
TRUE equ 1
.code
start:
DllEntry proc instance:DWORD, reason:DWORD, reserved:DWORD
mov eax, TRUE
ret
DllEntry endp
CPUIDIsSupported proc uses ebx edx
mov eax, 0
pushfd
pop eax ; Get EFLAGS to EAX
mov ecx, eax ; Preserve it in ECX
xor eax, 200000h ; Check if CPUID bit can toggle
push eax
popfd ; Restore the modified EAX
; to EFLAGS
pushfd ; Get the EFLAGS again
pop ebx ; to EBX
xor eax, ebx ; Has it toggled?
and eax, 200000h
jnz __not_supported ; No? CPUID is not supported
mov eax, 1
jmp _ciis_ret_ ; Yes? CPUID is supported
__not_supported:
xor eax, eax
_ciis_ret_:
push ecx ; Restore the original EFLAGS
popfd
ret
CPUIDIsSupported endp
.586
__cpuid proc stdcall public uses ebx edi __funcNumber:dword, __eax:dword, __ebx:dword, __ecx:dword, __edx:dword
; Must be 80586 and above
call CPUIDIsSupported
dec eax
jz _cpuid_begin_
; No CPUID instruction
xor eax, eax
jmp _cpuid_ret_
_cpuid_begin_:
mov eax, __funcNumber
cpuid
mov edi, __eax
mov dword ptr [edi], eax
mov edi, __ecx
mov dword ptr [edi], ecx
mov edi, __edx
mov dword ptr [edi], edx
mov edi, __ebx
mov dword ptr [edi], ebx
mov eax, 1
_cpuid_ret_:
ret
__cpuid endp
end start
El código fue originalmente publicado AQUÍ .
Cuando construyo recibo una advertencia:
LNK4086 de advertencia: punto de entrada '_start' no está __stdcall con 12 bytes de argumentos; la imagen no se puede ejecutar
Sin embargo, se genera una .dll.
Al intentar utilizar esa DLL consigo una excepción porque "No se puede encontrar punto de entrada CPUIDIsSupported en DLL"
Pero ahora aquí está el problema:
Si puedo compilar exactamente el mismo archivo asm en MASM32, sigo teniendo el LNK4086 pero el DLL puede ser llamado correctamente.
Me gustaría incluir el archivo asm en mi solución VS2008 y construir desde allí en vez de tener que utilizar MASM32. Por lo tanto me gustaría saber lo que tengo que cambiar mi proceso de construcción con el fin de obtener una DLL de trabajo. También estoy interesado en saber cómo puedo crear una versión de 64 bits de la DLL desde dentro VS2008.
Solución
Cambio de la end start
a end DllEntry
debe solucionar los problemas. VS2008 tiene una versión mucho más reciente de ML a la que se incluye con MASM32 y puede ser más estricta con respecto al punto de entrada.
DllEntry
y start
son en realidad el mismo punto, por lo que el código se ejecuta. Yo supongo que cuando aparezca la advertencia que ningún punto de entrada es en realidad especifica en la cabecera PE.