首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS2008 asm生成中出现LNK4086警告和缺少dll入口点

VS2008 asm生成中出现LNK4086警告和缺少dll入口点
EN

Stack Overflow用户
提问于 2009-11-04 22:47:21
回答 1查看 707关注 0票数 0

我尝试用VS2008编译以下.asm文件(作为一个空的Win32 dll项目的一部分,我将这个单独的.asm文件添加到该项目中):

代码语言:javascript
复制
.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

代码最初发布在HERE上。

当我构建的时候,我得到了一个警告:

警告LNK4086:入口点'_start‘不是具有12个字节参数的__stdcall;映像可能无法运行

但是,会生成一个.dll。

当尝试使用该dll时,我得到一个异常,因为“无法在dll中找到入口点CPUIDIsSupported”

但现在关键是:

如果我用MASM32编译完全相同的asm文件,我仍然会得到LNK4086,但是dll可以被正确地调用。

我希望将asm文件包含在我的VS2008解决方案中,并从那里构建它,而不必使用MASM32。因此,我想知道我需要对构建过程进行哪些更改才能获得工作的dll。另外,我很想知道如何在VS2008中创建64位版本的动态链接库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 19:23:01

end start更改为end DllEntry应该可以解决这些问题。与MASM32附带的ML相比,VS2008有一个更新得多的ML版本,它可能对入口点有更严格的要求。

DllEntrystart实际上是同一个点,这就是代码运行的原因。我猜想当警告出现时,实际上没有在PE头中指定入口点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1674220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档