Предупреждение LNK4086 и отсутствующая точка входа в dll в сборке VS2008 asm

StackOverflow https://stackoverflow.com/questions/1674220

Вопрос

Я попытался скомпилировать следующий asm-файл в VS2008 (как часть пустого проекта 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' не является __stdcall с 12 байтами аргументов;изображение может не запуститься

Однако создается файл .dll.

При попытке использовать эту dll я получаю исключение, потому что "Не удается найти точку входа CPUID, поддерживаемую в dll"

Но теперь вот в чем загвоздка:

Если я скомпилирую точно такой же asm-файл в MASM32, я все равно получу LNK4086, но dll может быть вызвана правильно.

Я хотел бы включить asm-файл в мое решение VS2008 и создать его оттуда вместо того, чтобы использовать MASM32.Поэтому я хотел бы знать, что мне нужно изменить в моем процессе сборки, чтобы получить работающую dll.Также мне интересно услышать, как я могу создать 64-разрядную версию dll из VS2008.

Это было полезно?

Решение

Изменение end start Для end DllEntry должно устранить проблемы.VS2008 имеет гораздо более новую версию ML по сравнению с той, что поставляется с MASM32, и она может быть более строгой в отношении точки входа.

DllEntry и start на самом деле это одна и та же точка, именно поэтому код выполняется.Я бы предположил, что при появлении предупреждения в заголовке PE фактически не указана точка входа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top