لماذا تتصرف المكتبة بتجميع آلات مختلفة قليلا مختلفة قليلا؟

StackOverflow https://stackoverflow.com/questions/1268101

سؤال

إليك الإعداد:

يحتوي زميلتي في العمل على آلة Fedora X64_86 مع مترجم مع دول مجلس التعاون الخليجي 4.3.3 (من Buildroot). لدي آلة Ubuntu 9.04 x64_86 مع نفس المترجم الصليب.

بنى My Catorker تطبيق مكتبة + اختبار يعمل على جهاز اختبار، قمت بتجميع نفس المكتبة و TestApp وتعطلها في نفس آلة الاختبار.

بقدر ما أستطيع أن أقول، بنيت دول مجلس التعاون الخليجي ضد Buildroot المترجمة UCLIBC، لذلك، نفس الرمز، نفس الترجمة نفسها. ما هي أنواع اختلافات الآلة المضيفة تؤثر على تجميع عبر؟

أي نظرة ثاقبة.

تحديث: للتوضيح، المحامرة تطابق. وبعد التعليمات البرمجية المصدر للمكتبة و TestApp تطابق. وبعد الفرق الوحيد هو أن testapp + lib تم تجميعها على آلات مختلفة ..

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

المحلول

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

النقطة المؤسفة لسلوك غير محدد هي أنه مايو العمل على بعض الآلات. أعتقد أنك تعاني من هذا الحدث هنا. حاول أن تجد الخطأ وستعرف ماذا يحدث :-)

نصائح أخرى

بأي طريقة تحطمها؟ هل يمكن أن تكون أكثر تحديدا، وتوفير الإخراج أو رموز الإرجاع، إلخ ... هل حاولت توصيل بعض printf مفيدة ()؟

وأعتقد أننا بحاجة إلى عدد قليل من التفاصيل هنا:

  1. هل TestApp رابط إلى المكتبة؟

  2. هل مكتبة ثابتة أو ديناميكية؟

  3. هل المكتبة في مسار بحث المكتبة، أو قمت بإضافة دليلها إلى LD.So.conf؟

  4. هل تتابع أي إجراءات تثبيت للمكتبة و TestApp؟

  5. هي المكتبتين و TestApps بت متوافق مع بت؟ هل تتوقع أن يكونوا؟

  6. هل تقوم بتشغيل نفس المستخدم مثل زميل العمل، بنفس البيئة والأذونات؟

بوضوح, ، شيء غير متطابق.

حاول استخدام Objdump وخياراتها العديدة، خاصة، لتحديد ما هو مختلف.

أنت لم تقدم نقطة، لذلك أنا ذاهب إلى تخمين binutils هو الفرق. هذه هي مجموعة الأدوات المستخدمة في بناء الثنائيات. ويشمل LD، كما و objdump.

يحتاج المواصلات عبر الحدود إلى مجموعة من Binutils الخاصة بالهندسة المعمارية المستهدفة. ومع ذلك، على عكس دول مجلس التعاون الخليجي، لا أعتقد أن أدوات Binutils تقوم بعمل Bootstrap مزدوج وتحقق من الخطوة، لذلك من الممكن أن يكون هناك بعض الاختلاف من بيئة بناء X86_64 الأصلية.

سأحاول بناء حزم Binutils للذراع مرة أخرى، باستخدام Crosscompiler الذراع. لنرى إن كان سيحدث فرقا.

إنه شيء رأيته في التثبيت العادي X86 Gentoo Stage1 أيضا: بعد الحصول على نظام Bootstrap والتركيبات المثبتة وتحديثه، يوصى مستخدم Gentoo بشكل جيد بإعادة إنشاء النظام تكرارا باستخدام الأدوات المحدثة.

ما قوس هو هدفك (آلة الاختبار)؟

هل تستخدم محطات التوزيع المقدمة؟ عادة ما يكون لديهم مجموعة كبيرة جدا من التصحيحات المطبقة على دول مجلس التعاون الخليجي، على سبيل المثال على gentoo هناك حوالي 20 بقع، فيدورا وأوبونتو لن يكون مختلفا. ليست كل بقع جيدة بنسبة 100٪، على الرغم من :-( لذلك قد تختلف المحامرة في الواقع.

قد تبحث عن نسخة "الفانيليا" من دول مجلس التعاون الخليجي على التوزيع الخاص بك، ربما تفعل الخدعة.

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

غليت إلى مؤشر غير مهم في مكان ما.

كان لديه رمز يشبه:

if(p == NULL) {
    p = f();
}

نظرا لأن P كان عضوا في الفصل الذي تم تخصيصه على كومة الكومة، فقد كانت القيمة بشكل فعال عشوائي وأحيانا كانت في الواقع فارغة، مما يجعل الشيء يعمل بشكل جيد ... كانت المشكلة ذلك بعض الأحيان و على بعض الآلات، كانت الذاكرة ل P NULL على بدء تشغيل البرنامج، ولكن على مربع البراءات، لم يكن كذلك. كان الإصلاح بالطبع لتهيئة p tp null بشكل صحيح وكان كل شيء على ما يرام.

قد تواجه شيئا مثل هذا. أو نوع من نوع السلوك غير محدد وهي طريقة خيالية لقول "قد تعمل أو لا تعمل كما هو متوقع لأي سبب أو بدون سبب على الإطلاق"

كطعنة في الظلام، كنت أبحث عن المتغيرات غير المهيمية. تأكد من تعيين جميع المتغيرات المحلية والعالمية قيمة. تحقق مضاعفا أن المصانعين لديهم مهيئين لجميع أعضاء البيانات.

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