LNK4086 تحذير وخزان DLL مفقود في VS2008 ASM Build
-
16-09-2019 - |
سؤال
حاولت تجميع ملف. الهضم التالي في VS2008 (كجزء من مشروع Win32 DLL فارغ قمت بإضافة هذا الملف. الهضم واحد):
.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 أحصل على استثناء لأنه "غير قادر على العثور على CPuidissupported في DLL"
ولكن الآن هنا هو كيكر:
إذا قمت بتجميع نفس ملف ASM بالضبط في Masm32، ما زلت أحصل على LNK4086 ولكن يمكن استدعاء DLL بشكل صحيح.
أرغب في تضمين ملف ASM في حل VS2008 الخاص بي وبناء عليه من هناك بدلا من الاضطرار إلى استخدام MASM32. لذلك أود أن أعرف ما أحتاج إلى تغيير عملية بناء بلدي من أجل الحصول على DLL العمل. كما أنني مهتم بسماع كيف يمكنني إنشاء نسخة 64 بت من DLL من داخل VS2008.
المحلول
تغيير end start
ل end DllEntry
يجب إصلاح المشكلات. يحتوي VS2008 على إصدار أحدث من ML إلى واحد مضمن مع MASM32 وقد يكون الأمر أكثر صرامة فيما يتعلق بنقطة الدخول.
DllEntry
و start
هي في الواقع نفس النقطة، وهذا هو السبب في تشغيل الكود. أعتقد أنه عندما لا يبدو أن التحذير لا توجد نقطة دخول محددة بالفعل في رأس PE.