PRB: استدعاء loadlibrary () تحميل DLL له TLS ثابتة

الأعراض

تستخدم مكتبة الارتباط الحيوي (DLL) __declspec(مؤشر ترابط) لتخصيص التخزين المحلي لمؤشر ترابط ثابت (TLS). لا توجد مشاكل مقترنة بتشغيل تطبيق مرتبط بمكتبة ثابتة المقابلة. ومع ذلك، عندما يستخدم تطبيق الدالة LoadLibrary تحميل DLL بدلاً من استخدام الإصدار ثابتة، LoadLibrary فشل واحد على Win32s مع رمز خطأ 87: معلمة غير صالحة.

نجاح LoadLibrary على كمبيوتر الذي يقوم بتشغيل نظام التشغيل Windows 98 أو نظام التشغيل Windows NT أو Windows 2000 في هذه الحالة. ومع ذلك، استدعاء دالات في DLL التي تشير المتغيرات ثابتة TLS السلوك غير معرف. تعمل على Microsoft Windows 95، GetLastError وفشل LoadLibrary إرجاع 1114-ERROR_DLL_INIT_FAILED (إجراء مكتبة ارتباط حيوي تهيئة فشل). في Windows 2000، تنجح دالة LoadLibrary . ومع ذلك، أي محاولة للوصول إلى البيانات TLS يؤدي انتهاك وصول (AV).

السبب

وهذا قيد LoadLibrary و __declspec. يتم تخصيص مساحة المتغير العمومي الخاص بمؤشر ترابط في وقت التشغيل. الحجم تستند إلى حساب متطلبات التطبيق بالإضافة إلى متطلبات كافة المكتبات المرتبطة بشكل ثابت. إذا كان DLL يستخدم TLS ثابتة والارتباط الحيوي في أحد تطبيقات عندما يتم استدعاء LoadLibrary أو FreeLibrary ، يجب على النظام العثور كافة مؤشرات الترابط الموجودة في العملية وتكبير أو ضغط ذكراهم TLS وفقا لحجم TLS ثابتة في حديثا تحميل DLL. هذه العملية الثمن غاليا لأنظمة التشغيل لإدارة، الذي يمكن أن يسبب استثناء عندما يتم تحميلها بشكل حيوي (dll) أو التعليمات البرمجية مراجع البيانات.

الحل

لا يمكن تحميل DLLs التي تستخدم __declspec(مؤشر ترابط) مع LoadLibrary.


وينبغي تعديل رمز DLL لاستخدام هذه الدالات TLS ك TlsAlloc، ولتخصيص TLS إذا كان يمكن تحميل DLL مع LoadLibrary. أو DLL يستخدم __declspec(مؤشر ترابط) يجب إلا ضمنياً تحميلها في التطبيق.

مزيد من المعلومات

لتحديد ما إذا كان ملف DLL يستخدم TLS ثابتة، يمكن استخدام الأداة Dumpbin.exe تفريغ معلومات الرأس. يحتوي DLL TLS ثابتة إذا احتوت على "قيم الرأس اختياري" حجماً أكبر من 0 (صفر) في "الدليل تخزين مؤشر الترابط"، كما يلي:

RVA [18] 517B20 [حجم] دليل تخزين مؤشر الترابط
خصائص

رقم الموضوع: 118816 - آخر مراجعة: 09‏/01‏/2017 - المراجعة: 1

تعليقات