سؤال

بعد إضافة علم رابط / Tsaware إلى أحد مشاريعي (Visual Studio 6)، فوجئت بإيجاد قسم جديد في ملف PE (.idata). إذا لم أقم بتعيين العلم، يتم دمج الواردات في .rdata.

لتوضيح "المشكلة" نبدأ مع برنامج وحدة التحكم البسيطة:

#include <stdio.h>
int main() 
{
    printf("hello world\n");
    return 0;
}

وتجميع مع: cl /Og /O1 /GF /WX /c main.c

ثم ربط مع

  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj

دعنا نقارن إخراج Dumpbin:

Dump of file a.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .rdata
        5000 .text

Dump of file b.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .idata
        1000 .rdata
        5000 .text

لذلك لسبب ما، يقرر الرابط أن الواردات لا يمكن دمجها.

ولكن إذا ريننا editbin /TSAWARE a.exe يتم تغيير حقل خصائص DLL فقط في الرأس الاختياري PE.

هل يستطيع أي أحد تفسير هذا لي؟ هل هذا خطأ في رابط أو يمكن تغيير الملف القابل للتنفيذ عن طريق EditBin ينتهي بعدم العمل على أنظمة معينة؟

هل كانت مفيدة؟

المحلول

فقط تخمين: على نظام خادم المحطة الطرفية، تريد صورة تحتوي على عدد قليل من الصفحات المكتوبة بأكثر من ذلك. إذا لم يتم تعديل صفحة الذاكرة التي تتوافق مع الصورة، فيمكن تعديل صفحة واحدة من ذاكرة الوصول العشوائي الفعلي في جلسة EASH التي تستخدم تلك الصورة. إذا تم تعديل صفحة من صورة من الصورة، يجب على النظام إجراء عملية نسخ عند الكتابة لكل مثيل للصفحة بين جميع الجلسات واستخدام كتلة مختلفة من الذاكرة الفعلية لتمثيل الصفحة في كل جلسة.

نظرا لأن الواردات من أجل صورة غالبا ما يجب إصلاحها إذا تم نقل DLL التي يتم استيرادها، فإن الصفحات التي تعقد الواردات غالبا ما يتم تعديلها وبالتالي لا تستطيع المشاركة في المشاركة بين الدورات. إذا كان الرابط يدمج الواردات مع البيانات الأخرى التي لا يتم تعديلها عادة، فقد يزيد عدد صفحات النسخ على الكتابة دون داع.

قد يكون هذا نوعا من التحسين الذي يساعد على تقليل عدد الصفحات المنسوخة عبر الجلسات.

كما قلت رغم ذلك - هذا هو خمن بحت.

نصائح أخرى

التعليق من Warrenp هو الصحيح. بحسب ال وثائق MSDN.:

يقوم خيار / TSAware بتعيين علامة في حقل Image_optional_header Dll Charcharactericastics في رأس صورة البرنامج. عند تعيين هذه العلامة، لن يقوم الخادم الطرفي بإجراء تغييرات معينة في التطبيق.

عندما يكون التطبيق ليس خادم المحطة الطرفية (المعروف أيضا باسم تطبيق Legacy)، يقوم الخادم الطرفي بإجراء تعديلات معينة على التطبيق القديم لجعله يعمل بشكل صحيح في بيئة متعددة المستخدمين. على سبيل المثال، سيقوم Terminal Server بإنشاء مجلد Windows الظاهري، بحيث يحصل كل مستخدم على مجلد Windows بدلا من الحصول على دليل Windows Windows. وهذا يمنح للمستخدمين الوصول إلى ملفات INI الخاصة بهم. بالإضافة إلى ذلك، يقوم Terminal Server بإجراء بعض التعديلات على التسجيل للحصول على تطبيق Legacy. هذه التعديلات تبطئ تحميل الطلب القديم على الخادم الطرفي.

إذا كان التطبيق هو خادم المحطة الطرفية، فلا تعتمد على ملفات INI أو الكتابة إلى سجل HKEY_CURRENT_USER أثناء الإعداد.

إذا كنت تستخدم / Tsaware وتطبيقك لا يزال يستخدم ملفات INI، فسيتم مشاركة الملفات من قبل جميع مستخدمي النظام. إذا كان هذا مقبولا، فلا يزال بإمكانك ربط طلبك مع / TSAware؛ خلاف ذلك تحتاج إلى استخدام / تسوار: لا.

شيء واحد لم تلميح فقط في هنا هو أن مفاتيح الظل ممكنة فقط للعمليات التي لا تدرك TS.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top