warning LNK4086 e dispersi entrypoint dll in VS2008 asm accumulo
-
16-09-2019 - |
Domanda
ho provato a compilare il seguente file .asm in VS2008 (come parte di un progetto vuoto Win32 DLL a cui aggiungere questo file singolo ASM):
.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
Il codice è stato originariamente pubblicato QUI .
Quando costruisco Ho ricevuto un avviso:
warning LNK4086: entrypoint '_start' non è __stdcall con 12 byte di argomenti; immagine non può eseguire
Tuttavia, viene generata una dll.
Quando si tenta di utilizzare tale dll ricevo un'eccezione perché "Impossibile trovare entrypoint CPUIDIsSupported nella DLL"
Ma ora ecco il kicker:
Se compilo esattamente lo stesso file asm in Masm32, ho ancora ottenere il LNK4086 ma la dll può essere chiamato in modo corretto.
Mi piacerebbe includere il file asm nella mia soluzione VS2008 e costruire da lì, invece di dover utilizzare Masm32. Quindi vorrei sapere che cosa ho bisogno di cambiare per il mio processo di generazione al fine di ottenere una dll di lavoro. Anche io sono interessato a sapere come posso creare una versione a 64 bit del dll all'interno di VS2008.
Soluzione
La modifica della end start
a end DllEntry
dovrebbe risolvere i problemi. VS2008 ha una versione molto più recente di ML a quello incluso con Masm32 e può essere più rigorosi per quanto riguarda il punto di ingresso.
DllEntry
e start
sono in realtà lo stesso punto, che è il motivo per cui il codice viene eseguito. Direi che quando compare l'avviso alcun punto di ingresso è in realtà specificato nell'intestazione PE.