VS2008のASMビルドでLNK4086の警告と欠落しているDLLのエントリポイント
-
16-09-2019 - |
質問
私は(私はこの単一.ASMファイルを追加するために、空のWin32 DLLプロジェクトの一環として)VS2008で次の.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
のコードは、もともと HERE に投稿されました。
私は警告を受けるビルドするときます:
警告LNK4086:エントリポイント「_start」は引数の12のバイトと__stdcallされていません。イメージが実行されない場合があります。
ただし、.dllファイルが生成されます。
私は例外を取得そのDLLを使用しようとするため、「DLL内のエントリポイントCPUIDIsSupportedを見つけることができません」
しかし、今ここにキッカーです:
私はMASM32でまったく同じASMファイルをコンパイルする場合は、私はまだLNK4086を取得しますが、DLLが適切に呼び出すことができます。
私はVS2008溶液中のasmファイルをインクルードし、代わりにMASM32を使用するので、そこからそれを構築したいと思います。したがって、私は、私が働いてdllファイルを取得するために私のビルドプロセスについて変更する必要があるかを知りたいと思います。また、私は、私はVS2008の中から、DLLの64ビットバージョンを作成する方法を聞いて興味を持っています。
解決
end start
にend DllEntry
を変更すると、問題を修正する必要があります。 VS2008は、MASM32に含まれているものにMLの多くの新しいバージョンを持っており、それはエントリポイントへに関してより厳密であってもよい。
DllEntry
とstart
は、コードが実行理由である、実際には同じ点です。私は、警告が表示されたら、エントリポイントが実際PEヘッダーに指定されていないことを推測する。
所属していません StackOverflow