LNK4086 Warnung und fehlende DLL-Einstiegspunkt in VS2008 asm build
-
16-09-2019 - |
Frage
Ich habe versucht, die folgende .asm Datei in VS2008 (als Teil eines leeren Win32-DLL-Projekt, an dem ich diese einzelne .asm Datei hinzugefügt) zu kompilieren:
.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
Wenn ich baue ich eine Warnung:
Warnung LNK4086: Einstiegspunkt '_start' ist nicht mit 12 Byte von Argumenten __stdcall; Bild möglicherweise nicht ausgeführt
Allerdings ist eine DLL erzeugt wird.
Beim Versuch, diese DLL zu verwenden, erhalte ich eine Ausnahme, weil „nicht imstande, Einstiegspunkt CPUIDIsSupported in DLL zu finden“
Aber jetzt hier ist der Kicker:
Wenn ich genau die gleiche asm-Datei in MASM32 kompilieren, habe ich noch die LNK4086 bekommen, aber die DLL aufgerufen werden kann richtig.
würde Ich mag die asm-Datei in meiner VS2008-Lösung aufzunehmen und es von dort zu bauen, anstatt verwenden MASM32 zu haben. Daher würde Ich mag wissen, was ich brauche, um meinen Build-Prozess zu ändern, um eine Arbeits dll zu erhalten. Ich bin auch daran interessiert zu hören, wie ich eine 64-Bit-Version der DLL aus VS2008 erstellen kann.
Lösung
Ändern der end start
end DllEntry
sollten die Probleme beheben. VS2008 hat eine viel neuere Version von ML zu dem mit MASM32 enthalten und es kann in Bezug auf den Einstiegspunkt strenger sein.
DllEntry
und start
sind eigentlich der gleiche Punkt, weshalb der Code ausgeführt wird. Ich würde vermuten, dass, wenn die Warnung kein Einstiegspunkt erscheint tatsächlich in dem PE-Header angegeben ist.