سؤال

نحن نستخدم برنامج مترجم إرث، بناء على دول مجلس التعاون الخليجي 2.6.0، لعبور ترجمة لمعالج قديم قديم، ما زلنا نستخدمه (نعم، لا يزال قيد الاستخدام منذ عام 1994!). المهندس الذي قام بمنفذ دول مجلس التعاون الخليجي لهذه الشريحة قد انتقل منذ فترة طويلة. على الرغم من أننا قد نكون قادرين على استعادة مصدر دول مجلس التعاون الخليجي 2.6.0 من مكان ما على الويب، فقد اختفى التغيير المحدد لهذه الشريحة في قاعات تاريخ الشركات. لقد نشأنا إلى وقت قريب حتى في الآونة الأخيرة، حيث أن المترجم لا يزال يركض وأنتج تنفيذية قابلة للتطبيق، ولكن اعتبارا من Linux Kernel 2.6.25 (وأيضا 2.6.26) فشلت في الرسالة gcc: virtual memory exhausted... حتى عند تشغيل مع عدم وجود معلمات أو مع فقط -v. وبعد لقد قمت بإعادة تشغيل نظام التطوير الخاص بي (من 2.6.26) باستخدام Kernel 2.6.24 يعمل برنامج التحويل البرمجي مرة أخرى (إعادة التشغيل مع 2.6.25 لا).

لدينا نظام واحد نحافظ عليه عند 2.6.24 فقط لغرض القيام بذلك في هذه الشريحة، ولكن الشعور بأنه يتعرض بعض الشيء في حالة التحرك العالم Linux إلى النقطة التي لا نستطيع إعادة بناء نظام أطول من ذلك يموت المحول البرمجي (أي نظامنا 2.6.24 لدينا ولا يمكننا الحصول على 2.6.24 لتثبيت وتشغيله على نظام جديد لأن بعض أجزاء البرامج لم تعد متوفرة).

هل لدى أي شخص أي أفكار لما قد نتمكن من القيام به إلى تثبيت أكثر حداثة للحصول على هذا المترجم القديم لتشغيله؟

تعديل:

للإجابة على بعض التعليقات ...

من المحزن أن تتغير شفرة المصدر المحددة لرقاقةنا التي تضيعها. حدثت هذه الخسارة أكثر من اثنين من المشيمات الشركة الرئيسية والعديد من Sysadmins (بضعة ما تركت فوضى حقا). نحن نستخدم الآن التحكم في التكوين، ولكن هذا يغلق باب الحظيرة بعد فوات الأوان لهذه المشكلة.

إن استخدام VM هو فكرة جيدة، وقد يكون ما ينتهي به الأمر. شكرا لكم على هذه الفكرة.

أخيرا، جربت ستريا كما اقترح أفسث ووجدت أن آخر مكالمة النظام كانت BRK () التي أعادت خطأ في النظام الجديد (2.6.26 Kernel) وعاد النجاح على النظام القديم (2.6.24 Kernel). سيشير ذلك إلى أن هذا أمر ينفد حقا من الذاكرة الظاهرية، إلا أن TCSH "الحد" إرجاع نفس القيم على الأنظمة القديمة والجديدة، ويفرز / بروك / ميمينفاو أن الأنظمة الجديدة لديها ذاكرة أكثر قليلا ومساحة مبادلة أكثر قليلا. ربما تكون مشكلة تجزئة أو حيث يتم تحميل البرنامج؟

قمت بإضافة بعض الأبحاث الإضافية و "تعميم التجاري" في Kernel 2.6.25، ولكن CONFIG_COMPAT_BRK من المفترض أن تم تمكينه افتراضيا (الذي يعطل عشوائيات BRK).

تعديل:

موافق، مزيد من المعلومات: يبدو الأمر حقا وكأنه العشوائية BRK هو الجاني، فإن GCC Legacy يدعو BRK () لتغيير نهاية مقطع البيانات وفشل الآن، مما تسبب في الإبلاغ عن "الذاكرة الظاهرية المرنة". هناك عدد قليل من الطرق الموثقة لتعطيل العشوائية BRK:

  • sudo echo 0 > /proc/sys/kernel/randomize_va_space

  • sudo sysctl -w kernel.randomize_va_space=0

  • بدء قذيفة جديدة مع setarch i386 -R tcsh (أو "-r -l")

لقد جربتهم ويبدو أنها لها تأثير في أن قيمة الإرجاع BRK () مختلفة (ودائما نفسها) من دونها (حاول في كل من Kernel 2.6.25 و 2.6.26)، ولكن BRK () لا تزال تفشل حتى لا تزال دول مجلس التعاون الخليجي Legacy :-(.

بالإضافة إلى أنني وضعت vm.legacy_va_layout=1 و vm.overcommit_memory=2 مع عدم تغيير، وأعدت إعادة التشغيل مع vm.legacy_va_layout=1 و kernel.randomize_va_space=0 الإعدادات المحفوظة في /etc/sysctl.conf. لا يوجد أي تغيير.

تعديل:

استخدام kernel.randomize_va_space=0 في Kernel 2.6.26 (و 2.6.25) ينتج عنه دعوة BRK التالية () strace legacy-gcc:

brk(0x80556d4) = 0x8056000

يشير هذا إلى فشل BRK ()، لكن يبدو أنه فشل لأن قطاع البيانات ينتهي بالفعل إلى ما هو مطلوب. باستخدام Objdump، أستطيع أن أرى جزء البيانات يجب أن ينتهي عند 0x805518C بينما يشير BRK الفاشل () إلى أن شريحة البيانات تنتهي حاليا في 0x8056000:

الأقسام: اسم IDX Size Size VMA LMA إيقاف تشغيل Algn 0 .interp 00000013 080480D4 080480D4 000000D4 2 ** 0 محتويات، Alloc، تحميل، Readonly، بيانات 1 .hash 0000001A0 080480E8 080480E8 000000E8 080480E8 000000E8 2 ** 2 محتويات، Alloc، Readonly 2 .dynsym 00000410 08048288 08048288 00000288 2 ** 2 محتويات، alloc، Readonly، بيانات 3 .dynstr 0000020e 08048698 08048698 08048698 08048698 08048698 08048698 08048698 08048698 08048698 00000698 08048698 00000698 080698 ** 2 محتويات، Alloc، Load، Readonly، Data 5 .rel.plt 00000158 080488E0 080488E0 000008E0 2 ** 2 محتويات، Alloc، تحميل، Readonly، بيانات 6 .init 00000008 08048A40 08048A40 00000A40 2 ** 4 محتويات، Alloc، Load ، Readonly، Code 7. Gode 000002C0 08048A48 08048A48 00000A48 2 ** 2 محتويات، Alloc، تحميل، رمز 8.Text 000086cc 08048D10 08048D10 08048D10 08048D10 00000D10 2 ** 4 محتويات، Alloc، تحميل، الكود 9 .Fini 00000008 080513E0 080513E0 080513E0 080513E0 080513E0 080513E0 080513E0 000093E0 2 ** 4 محتويات، Alloc، تحميل، Readonly، Code 10. Rodata 000027D0 080513E8 080513E8 080513E8 000093E8 000093E8 2 ** 0 المحتويات، Alloc، تحميل ، Readonly، بيانات 11. بيانات 11.data 000005d4 08054BB8 08054BB8 2 ** 2 المحتويات، alloc، تحميل، البيانات 12 .ctors 00000008 0805518C 0805518C 0805518C 0805518C 2 ** 2 محتويات، alloc، تحميل، البيانات 13 .dtors 00000008 08055194 08055194 08055194 0000C194 0000C194 0000C194 2 محتويات، Alloc، تحميل، البيانات 14.got 000000b8 0805519C 0805519C 0000C19C 2 ** 2 المحتويات، alloc، تحميل، البيانات 15 .dynamic 00000088 08055254 08055254 0000C254 08055254 0000C254 2 ** 2 المحتويات، alloc، تحميل، البيانات 16.bss 000003B8 080552DC 080552DC 0000C2DC 2 ** 3 alloc 17 .Note 00000064 00000000 00000000 00000000000000 0000C2DC 2 ** 0 محتويات، Readonly 18 .comment 00000062 00000000 00000000 000000000000 0000C340 2 ** 0 محتويات، جدول رمز القراءة: لا توجد رموز

تعديل:

إلى تعليق تعليق Eko Epmient أدناه: "غريب جدا لعلاج دول مجلس التعاون الخليجي باعتباره ثنائي دون مصدر"!

لذلك، باستخدام الستر، Objdump، GDB وفهمي المحدود من 386 مجمع والهندسة المعمارية التي قمت بتعقب المشكلة في دعوة malloc 1st في الرمز القديم. يستدعي دول مجلس التعاون الخليجي Legacy Malloc، الذي يعود NULL، مما يؤدي إلى رسالة "ذاكرة الذاكرة الظاهرية" على Stderr. هذا malloc في libc.so.5، ويستدعي getenv حفنة من المرات وينتهي الدعوة برك () ... أعتقد أن زيادة الكومة ... التي تفشل.

من هذا، يمكنني فقط تقدير المشكلة فقط أن المشكلة أكثر من التعايشية BRK، أو لم أكن لم أحصل على تعايشية BRK المعطلة بالكامل، على الرغم من أن ROMMALIZE_VA_SPACE = 0 و LEGACY_VA_LAYOUT = 1 إعدادات SYSCTL.

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

المحلول

قم بتثبيت Linux + GCC القديم على جهاز ظاهري.

نصائح أخرى

هل لديك مصادر لهذه المترجم المخصص؟ إذا استطعت استرداد خط الأساس 2.6.0 (ويجب أن يكون ذلك سهلا نسبيا)، فيجب أن يتعافى Diff and Patch مجموعة التغيير الخاصة بك.

ما سألصح بعد ذلك باستخدام مجموعة التغيير التي تم تعيينها لإنشاء إصدار جديد ضد أحدث جي سي. ثم ضعها تحت التحكم في التكوين.

آسف، لا يعني أن الصراخ. لقد كنت أقول نفس الشيء لأكثر من 30 عاما.

هل تستطيع strace ال gcc-2.6.0 تنفيذ؟ قد يفعل شيئا مثل القراءة /proc/$$/maps, ، والحصول على الخلط عند تغييرات الإخراج بطرق غير مهمة. كانت مشكلة مماثلة لاحظت مؤخرا. بين 2.6.28 و 2.6.29.

إذا كان الأمر كذلك، يمكنك الاختراق /usr/src/linux/fs/proc/task_mmu.c أو ما بعد السبب في استعادة الإخراج القديم، أو إعداد بعض $LD_PRELOAD ليزيف gcc في قراءة ملف آخر.

تعديل

منذ أن ذكرت brk...

CONFIG_COMPAT_BRK يجعل الافتراضي kernel.randomize_va_space=1 بدلاً من 2, ، لكن ذلك لا يزال يعشيا كل شيء غير كومة (brk).

معرفة ما إذا كانت مشكلتك تختفي إذا كنت echo 0 > /proc/sys/kernel/randomize_va_space أو sysctl kernel.randomize_va_space=0 (ما يعادل).

إذا كان الأمر كذلك، أضف kernel.randomize_va_space = 0 ل /etc/sysctl.conf أو إضافة norandmaps إلى سطر الأوامر Kernel (ما يعادل)، وتكون سعيدا مرة أخرى.

جئت عبر هذه وفكر في مشكلتك. قد يكون يمكنك العثور على وسيلة للعب مع ثنائي لنقلها إلى تنسيق قزم؟ أو قد يكون غير ذي صلة، ولكن اللعب مع Objdump يمكن أن يوفر لك المزيد من المعلومات.

هل يمكن أن يكون لديك إلقاء نظرة على خريطة ذاكرة العملية؟

لذلك لقد عملت شيئا ما ... ليس حل كامل، لكنه يتخطى المشكلة الأصلية التي كان لدي مع دول مجلس التعاون الخليجي Legacy.

وضع نقاط التوقف على كل مكالمة LIBC في .PLT (جدول الربط الإجراء) أرى أن malloc (في libc.so.5) يدعو getenv () للحصول على:

 malloc_trim_threshold_ malloc_top_pad_ malloc_mmp_therheshold_ malloc_mmap_max_ malloc_check_

لذلك بحثت على الويب ووجدت هذه الذي ينصح

 setenv malloc_top_pad_ 536870912.

ثم تعامل دول مجلس التعاون الخليجي Legacy!

ولكن ليس في المنزل مجانا، وصلت إلى الرابط في البناء قبل الفشل، لذلك هناك شيء آخر يحدث مع Legacy NLD لدينا :-( إنه التقارير:

 تم تجاوز الذاكرة الظاهرية في "جديد"

في /etc/sysctl.conf لدي:

 kernel.randomize_va_space = 0 vm.legacy_va_layout = 1

لا يزال يعمل هو نفسه إذا

 kernel.randomize_va_space = 1 vm.legacy_va_layout = 0

ولكن ليس إذا

kernel.randomize_va_space = 2.

كان هناك اقتراح لاستخدام "LDD" لرؤية تبعيات المكتبة المشتركة: تحتاج دول مجلس التعاون الخليجي Legacy فقط LIBC5، ولكن Legacy NLD تحتاج أيضا LIBG ++. SO.27، LibstDC ++. SO.27، LIBM.SO.5 ويبدو أنه يوجد نسخة LIBC5 من LIBG ++. SO.27 (Libg ++ 27-Altdev؟) وماذا عن libc5-compat؟

لذلك، كما قلت، ليس في المنزل مجانا ... أن تقترب. ربما سأقوم بنشر سؤال جديد حول مشكلة NLD.

تعديل:

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

شكرا لك على ما يلي:

  • an0nym0usc0 إلى اقتراح استخدام VM (والتي قد تصبح الإجابة المقبولة في النهاية)
  • ephemient لاقتراح استخدام الستر، والمساعدة في استخدام Stackoverflow
  • shodanex لاقتراح استخدام objdump

تعديل

فيما يلي آخر الأشياء التي تعلمتها، والآن سأقبل محلول VM لأنني لم أتمكن من حلها بالكامل بأي طريقة أخرى (على الأقل في الوقت المناسب لذلك).

تحتوي Kernels الأحدث على علامة بناء CONFIG_COMPAT_BRK للسماح باستخدام LIBC5 لاستخدامها، لذلك يفترض أن بناء نواة جديدة مع هذه العلامة ستحدد المشكلة (والنظر من خلال Kernel SRC، يبدو الأمر كذلك، لكنني لا أستطيع التأكد من أنني فعلت لا تتبع جميع المسارات). هناك أيضا طريقة موثقة أخرى للسماح باستخدام LIBC5 في وقت التشغيل (بدلا من وقت بناء النواة): Sudo Sysstl -w kernel.randomize_va_space = 0. ومع ذلك، فإن هذا لا يقوم بعمل كامل وبعض تطبيقات LIBC5 (الأكثر؟) لا تزال قائمة، على سبيل المثال مترجم إرثنا ورتبطة. يبدو أن هذا بسبب اختلاف في افتراضات المحاذاة بين النواة الأحدث والأقدم. لقد قمت بتصحيح الرابط الثنائي لتجعله يعتقد أنه يحتوي على قسم BSS أكبر، من أجل رفع نهاية BSS إلى حدود صفحة، وهذا يعمل على Kernel الأحدث عندما Systl Var Kernel.randomize_va_space = 0. هذا ليس حلا مرضيا بالنسبة لي منذ أن أصنع عمى لتصحيح عمياء قابل للتنفيذ ثنائي حرج، على الرغم من تشغيل رابط التصحيح على Kernel الأحدث إنتاج إخراج متطابق بعض الشيء إلى الرابط الأصلي يعمل على النواة القديمة، لا يثبت ذلك سيؤدي بعض مدخلات الرابط الأخرى (أي نحن نغير البرنامج المرتبط) أيضا نتائج متطابقة.

هل لا يمكنك ببساطة إنشاء صورة قرص يمكن إعادة تثبيتها إذا مات النظام؟ أو اصنع VM؟

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