avertissement LNK4086 et manquant entrypoint dll dans VS2008 construction asm
-
16-09-2019 - |
Question
J'ai essayé de compiler le fichier suivant dans .asm VS2008 (dans le cadre d'un projet dll Win32 vide auquel j'ai ajouté ce seul fichier 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
Le code a été publié ICI .
Quand je construis, je reçois un avertissement:
LNK4086 d'avertissement: entrypoint '_start' est pas __stdcall avec 12 octets d'arguments; l'image peut ne pas fonctionner
Cependant, une DLL est généré.
Lorsque vous essayez d'utiliser cette dll je reçois une exception parce que « Impossible de trouver entrypoint CPUIDIsSupported dans dll »
Mais est maintenant ici le kicker:
Si je compile exactement le même fichier asm dans MASM32, je reçois toujours le LNK4086 mais le dll peut être correctement appelé.
Je voudrais inclure le fichier asm dans ma solution VS2008 et construire à partir de là au lieu d'avoir à utiliser MASM32. Par conséquent, je voudrais savoir ce que je dois changer au sujet de mon processus de construction afin d'obtenir une dll de travail. Aussi je suis intéressé à entendre ce que je peux créer une version 64 bits de la dll de l'intérieur VS2008.
La solution
Modification du end start
à end DllEntry
devrait corriger les problèmes. VS2008 a une version beaucoup plus récente de ML à celui inclus avec MASM32 et il peut être plus stricte en ce qui concerne le point d'entrée.
DllEntry
et start
sont en fait le même point, ce qui est la raison pour laquelle le code est exécuté. Je suppose que lorsque l'avertissement apparaît pas de point d'entrée est effectivement spécifié dans l'en-tête PE.