aviso LNK4086 e faltando dll entrypoint no VS2008 asm construção
-
16-09-2019 - |
Pergunta
Eu tentei compilar o seguinte arquivo .asm no VS2008 (como parte de um projeto Win32 dll vazio para que eu adicionei este arquivo .asm single):
.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
O código foi originalmente publicado aqui .
Quando eu construo Eu começo um aviso:
aviso LNK4086: '_start' entrypoint não é __stdcall com 12 bytes de argumentos; imagem pode não ser executado
No entanto, um arquivo .dll é gerado.
Ao tentar usar essa dll eu recebo uma exceção porque "Incapaz de encontrar o ponto de entrada CPUIDIsSupported na DLL"
Mas agora aqui está o kicker:
Se eu compilar exatamente o mesmo arquivo asm em masm32, eu ainda obter o LNK4086 mas a dll pode ser corretamente chamado.
Gostaria de incluir o arquivo asm na minha solução VS2008 e construí-lo de lá, em vez de ter que usar masm32. Portanto, eu gostaria de saber o que eu preciso mudar em meu processo de construção, a fim de obter uma dll de trabalho. Também estou interessado em saber como eu posso criar uma versão da dll de 64 bits a partir de dentro VS2008.
Solução
A alteração do end start
para end DllEntry
deve corrigir os problemas. VS2008 tem uma versão muito mais recente do ML à incluída com masm32 e pode ser mais rigorosa com relação ao ponto de entrada.
DllEntry
e start
são realmente o mesmo ponto, que é por que o código é executado. Eu acho que quando aparece o aviso nenhum ponto de entrada é realmente especificado no cabeçalho do PE.