Предупреждение LNK4086 и отсутствующая точка входа в dll в сборке VS2008 asm
-
16-09-2019 - |
Вопрос
Я попытался скомпилировать следующий 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 фактически не указана точка входа.