سؤال

وكيف يمكن للمرء أن يذهب حول ربط (بعض) رموز إلى عناوين ثابتة محددة باستخدام GNU دينار بحيث ثنائي لا يزال من الممكن تنفيذها بشكل طبيعي في لينكس (x86) و؟ لن يكون هناك أي محاولات الوصول إلى تلك الرموز، ولكن عناوينهم مهمة.

وعلى سبيل المثال، كنت قد الهيكل التالي:

struct FooBar {
    Register32 field_1;
    Register32 field_2;
    //...
};

struct FooBar foobar;

وأود أن ربط foobar لمعالجة 0x76543210، ولكن ربط المكتبات القياسية وباقي التطبيق بشكل طبيعي. سيقوم التطبيق ثم الاستفادة من عنوان foobar، ولكن لن مرجع (ربما غير موجودة) ذاكرة وراء ذلك.

والأساس المنطقي لهذا الطلب هو أن هذا المصدر نفسه يمكن استخدامها على منصتين: على منصة الأم، يمكن Register32 تكون مجرد volatile uint32_t، ولكن على لينكس Register32 هو C ++ الاعتراض مع نفس حجم uint32_t التي تحدد على سبيل المثال operator=، والتي سوف ثم استخدام عنوان الكائن ويرسل الطلب إلى إطار التواصل مع هذا العنوان (والبيانات) لأداء الوصول الفعلي على الأجهزة عن بعد. رابط بالتالي ضمان المجالات Register32 من البنية تشير إلى "عناوين" الصحيحة.

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

المحلول

وهذا الاقتراح من قبل litb لاستخدام --defsym symbol=address يعمل، ولكن مرهقة قليلا عندما يكون لديك بضع عشرات من هذه الحالات إلى الخريطة. ومع ذلك، --just-symbols=symbolfile لا مجرد خدعة. استغرق الأمر مني بعض الوقت لمعرفة بناء الجملة للsymbolfile، وهو

symbolname1 = address;
symbolname2 = address;
...

ويبدو أن المساحات لازما، كما ld خلاف ذلك تقارير file format not recognized; treating as linker script.

نصائح أخرى

وحاول مع

--defsym symbol=expression

وكما هو الحال مع هذا:

gcc -Wl,--defsym,foobar=0x76543210 file.c

وجعل foobar في التعليمات البرمجية إعلانا خارجي ...:

extern struct FooBar foobar;

وهذه تبدو واعدة. ومع ذلك، انها فكرة سيئة للقيام شيء من هذا القبيل (إلا إذا كنت <م> حقا تعرف ما تفعله). لماذا كنت في حاجة إليها؟

وسأعطيك الطرف الساخن ... GNU LD يمكن القيام بذلك (على افتراض يبس نظام لا يحتاج العنوان الذي تريد). كل ما تحتاجه لبناء النصي رابط الخاصة بك بدلا من استخدام واحد يتم إنشاؤه تلقائيا المترجم ل. اقرأ صفحة والرجل للدينار. أيضا، بناء نصي رابط للحصول على قطعة معقدة من البرمجيات ليست مهمة سهلة عند إشراك سي العمومية للغاية.

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