LNK4086警告,缺少DLL入口点在VS2008 ASM构建
-
16-09-2019 - |
题
我试图编译在VS2008以下.ASM文件(作为一个空的Win32 DLL项目,其添加此单个.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
代码最初发布这里。
当我建立我得到一个警告:
警告LNK4086:入口点 '_start' 不与12个字节的参数__stdcall;图像可能无法运行
然而,生成的.dll。
在尝试使用该DLL,我得到一个例外,因为“无法找到入口点CPUIDIsSupported在DLL”
但是,现在在这里是踢球者:
如果我编译正是在MASM32同ASM文件,我仍然得到LNK4086但该dll可以正常调用。
我想包括在我的VS2008溶液中的ASM文件,并从那里,而不必使用MASM32的建立它。因此,我想知道我需要什么,为了得到工作的DLL来改变我的构建过程。我也很感兴趣地听到我如何从VS2008中创建DLL的64位版本。
解决方案
更改end start
到end DllEntry
应该修正的问题。 VS2008具有ML得多的较新版本包含MASM32的一个并且它可以是更严格与问候到入口点。
和DllEntry
start
实际上是相同的点,这就是为什么代码运行。我猜想,警告出现时没有入口点在PE头实际上是指定。
不隶属于 StackOverflow