كيف يمكنني العثور على البرنامج الرئيسي(...) وظيفة ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا حاليا ترقية مشروع مع بضع مئات من ملفات التعليمات البرمجية و تبعيات على عدة مكتبات طرف ثالث لنظام التشغيل Mac Os.لقد حصلت أخيرا إلى نقطة حيث البرنامج برمجيا دون تحذيرات أو أخطاء, ولكن لا يبدو لتنفيذ بلدي الوظيفة الرئيسية.

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

(gdb) continue
Current language:  auto; currently c++
//
// This is an automatically generated file.
// Do not edit.
//

const unsigned short expTable[] =
{
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
...
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
};

Debugger stopped.
Program exited with status value:0.

لا أستطيع استخدام مصحح الأخطاء لمعرفة أين هذه الوظيفة الرئيسية تكمن لأنه في حين تتبع المكدس يبدو صالحة ، gdb لا تظهر لي الصحيحة رقم السطر واسم الملف لكل كومة دخول (انظر هذا حل السؤال لمزيد من التفاصيل).

البحث استغرق عدة دقائق كاملة ، ولكن لم ترجع أية نتائج.

مشروعي هو استخدام SDL بين المكتبات الأخرى, ولكن أنا على جائزة SDL_Main() و المشاكل الكامنة و قد بنيت بلدي المشروع على رأس بخير العامل SDL قالب المشروع.لذلك أنا متأكد تماما أن المهمة الرئيسية هي صالحة.

هل لديك أي فكرة عما يمكن أن يحدث خطأ ؟ أنا حاليا من الأفكار حول كيفية العثور على وإزالة المارقة الوظيفة الرئيسية.

شكرا

أدريان

تحرير: كما اكتشفت أنني أخطأت حين البحث عن الملفات مع ملف السلسلة "هذا هو تلقائيا".أنا فقط وجدت عشرات الملفات مع نفس السلسلة, جميع المنتمين إلى FreeImage واحد من طرف ثالث المكتبات أنا باستخدام.لذا يبدو أن المشكلة تتعلق FreeImage, ولكن أنا لا تزال غير متأكد من كيفية المضي قدما منذ أن كنت قد جمعت Freeimage كمكتبة المغلقة مع ماك makefile وشملت فقط المكتبة.سأحاول إعادة إصدار أحدث من FreeImage و أرى أنه إذا كان هذا ثابت مشكلتي.

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

المحلول

يمكن أن يكون مهيئ عن ثابت الكائن الذي فشل قبل الرئيسي الخاص بك () ؟

نصائح أخرى

هل لديك عدة الرئيسية في ثنائي ؟ حاول استخدام nm على ذلك. (يجب أن لا يكون ممكن ld لن الارتباط مع مكررة ، ولكن تذهب إلى الديناميكية يبس والبحث عن _main هناك)

nm a.out | grep -5 _main

هذا يجب أن تعطي 5 خطوط قبل وبعد أي _main وجدت في الثنائية a.out

إذا كان لديك عدة ، انظر المحيطة بها رموز تلميحات الأجزاء التي هي في...

الخطوة التالية يمكن أن تفعل الشيء نفسه في كل ديناميكية lib التي يتم استخدامها.للحصول على قائمة من استخدام المكتبات الديناميكية استخدام otool

otool -L a.out

أنا غير متأكد من كيفية العثور على واحدة أخرى, لكن يمكنك تحديد نقطة دخول صراحة وجعل الآخر غير المستخدمة.يمكنك استخدام جنو رابط ld -e الخيار لتعيين نقطة دخول.

-e الدخول

--الدخول=دخول

استخدام الإدخال كما صريحة الرمز من أجل بداية تنفيذ الخاص بك البرنامج بدلا من الافتراضي نقطة الدخول.إذا كان هناك أي sym- بول اسمه إدخال رابط فسيحاول دخول عدد ، واستخدام ذلك إدخال عنوان (عدد سيتم تفسير في قاعدة 10;يمكنك استخدام الرائدة 0x على قاعدة 16 ، أو رائد 0 على قاعدة 8).

المستقبل القراء ، إذا كان لديك هذه المشكلة في نظام التشغيل Windows.أي ما يعادل الخيار linker هو /دخول.

هل حاولت تشغيل الملف القابل للتنفيذ من خلال nm?قد تكون قادرة على إعطائك بعض النصائح.أنا لا أعتقد أنه سيكون من الممكن ربط البرنامج مع أكثر من واحد عالميا مرئية وظيفة اسمه main(), لست متأكدا كيف تمكن يحدث.

ننظر من خلال رأس الملفات التي تشمل وانظر إذا لم يكن هناك تحديد أن remaps main إلى شيء آخر.هذا هو خدعة قديمة لضمان المكتبة وظيفتها الرئيسية هي أول من دعا إلى القيام ببعض اقامة.عموما, في نهاية المطاف دعوة المهمة الرئيسية الخاصة بك من خلال الإشارة إلى تعريف القيمة.

سريع هاك:

readelf -s -w my_bin_file > temp.txt

فتح temp.txt البحث الرئيسية (مع وظائفها في عمود واحد) ترتفع حتى تجد الملف الأول عمود - هذا هو الملف مع ربط الرئيسية.

تحرير: هذا يعمل فقط على جنو ليونكس النكهات والأصدقاء.OS X يستخدم ماخ-O الشكل و لا العفريت.

وأنا أعلم أن في ج ، هل يمكن أن يكون مختلف entrypoint يسمى قبل الدالة الرئيسية, يمكن أن تكون فكرة.رمز عادة ما تبدو مثل :

void __attribute__ ((constructor)) my_main(void);

ربما يمكنك البحث عن شيء مثل هذا في التعليمات البرمجية الخاصة بك.

في ج ، هناك أيضا طرق مختلفة للقبض على وظيفة الرئيسية نسميها بعد "ريال مدريد" الرئيسية.بعض المواضيع المكتبة لديها هذا النوع من الخارقة من أجل "إعداد" environnement, جدولة وأشياء من هذا القبيل.

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

ويساعد هذا الأمل!

ملاحظة أخرى.

WxWidgets أيضا تعريف الخاصة بهم main

من هنا

كما هو الحال في جميع البرامج يجب أن يكون هناك "الرئيسية" وظيفة.تحت wxWidgets الرئيسي هو تنفيذ استخدام هذا الماكرو ، مما يخلق مثيل التطبيق ويبدأ البرنامج.

IMPLEMENT_APP(MyApp)

يبدو أنك يمكن أن يكون ملف يسمى b44ExpLogTable.cpp جمعت في الثنائية أو بعض thirdpart المكتبة.يبدو أن هذا البرنامج هو توليد exp() الجدول ولكن قد تأتي على نحو ما يمكن استيرادها إلى المشروع الخاص بك(ق)

انظر هذا و هذا في FreeImage مصادر

توليد خريطة الملف.معظم البرامج لا تبدأ فعلا في الرئيسية.أ mapfile من دول مجلس التعاون الخليجي يجب أن أقول لك عنوان __ابدأ أو __للتنفيذ_البدء ، والتي يجب أن تكون قادرة على كسر في خطوة من خلال رؤية ما تسبب البرنامج إلى الخروج.

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