مقاله های سیسوگ, توصیه شده

از نرم‌افزار تا سخت‌افزار – قسمت چهارم – فایل Linker و فرآیند Locating

از نرم‌افزار تا سخت‌افزار - قسمت دوم - انواع کامپایلر

در قسمت سوم در رابطه با هدر فابل صحبت کردیم و از اصول نوشتن آن گفتیم. اکنون داریم به آخرین مراحل آماده‌سازی کد برای پیاده‌سازی روی سخت‌افزار می‌رسیم. تا اینجا یه سری فایل‌های باینری از جاهای مختلف رسیده دستمون که می‌خواهیم همه رو تبدیل به یه فایل کرده و تقدیم سخت‌افزار کنیم! این کار وظیفه اصلی Linker هستش. برای انجام این مرحله یک فایل Linker هم در کنار بقیه فایل‌ها در اختیار لینکر قرار می‌گیره تا با کمک این فایل بتونه این مسئولیت رو انجام بده. ما میتونیم از طریق ترمینال این فایل رو با فلگ T- بهش بدیم.

سؤالی که ممکنه پیش بیاد اینه که داخل فایل Linker چیا قرار می‌گیره؟

به صورت مختصر موارد زیر رو میتونیم داخل این فایل ببینیم:

  • مپ کردن بخش‌های کد به نواحی مختلف حافظه
  • آدرس شروع و اندازه نواحی حافظه
  • پارامترهای دسترسی برای نواحی مختلف حافظه
  • بررسی اینکه مساله over allocation رخ نداده باشه و در صورت رخداد اطلاع دادن
  • مشخص کردن نقطه شروع برنامه

 

عملیات لینکر در فایل Linker

نکته جالب اینه که تو فرآیند لینک کردن به تشخیص خود لینکر یه سری کتابخونه‌ها به پروژه اضافه میشه که برای بعضی قسمتا ضروریه. مثلاً اینکه برنامه از تابع main شروع به اجرا کنه و در پایان این تابع هم متوقف بشه چیزی هست که تو یکی از همین کتابخونه‌ها معرفی شده به نحوی که اگه شما این کتابخونه رو به لینکر بگید اضافه نکنه (دیفالت اضافه می کنه خودش) تو اجرای برنامه با ارور مواجه میشین چون برنامه نمیدونه دقیقاً از کجا باید شروع کنه به اجرا:)
بعضی از فلگ‌های مورد استفاده برای لینکر رو میتونید تو تصویر زیر ببینید:

فلگ لینکر در فایل Linker

 

راجع به دو فلگ آخر این جدول نحوه استفاده ازشون به صورت زیر هستش:

فلگ لینکر در فایل Linker

در نهایت وارد فرایند locating میشیم که منابع سخت‌افزاری رو (عمدتاً فضای حافظه) در اختیار برنامه میذاره تا ازش استفاده کنه. خب طبیعتاً این مرحله وابستگی زیادی به معماری سخت افزار پیدا می کنه. در وهله اول این اختصاص منابع به صورت نمادهایی (symbols) برای قسمت‌های مختلف حافظه صورت می‌گیره و در مرحله نهایی این نمادها به آدرس مستقیم حافظه مورد نظر تبدیل میشه و خب تو این مرحله تقریباً فرایند ما به اتمام میرسه!
فایل اجرایی که در نهایت تولید میشه میتونه به فرمت‌های مختلفی باشه:

⦁ executable and linker format (ELF)
⦁ common object file format (COFF)
⦁ Intel Hex Record
⦁ Motorola S Record (SREC)
⦁ ARM Image file (AIF)

 

خب فکر کنم تا همین جا کافی باشه. ایشالا در قسمت پنجم میریم سراغ ابزار Make و نکات مرتبط باهاش!

author-avatar

درباره سعید حقیقی پور

تا حالا به این فکر کردین که تو یه سیستم کامپیوتری GPU چقدر کارآمد و مهمه ولی به اندازه CPU شناخته شده نیست.یه جورایی همون "مجهولون فی الارض معروفون فی السماء" که میگن! یه حسی بهم میگه کاش بتونم مثه GPU باشم :)

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

2 دیدگاه در “از نرم‌افزار تا سخت‌افزار – قسمت چهارم – فایل Linker و فرآیند Locating

  1. Avatar photo محمدرضا عابدینی گفت:

    سلام مطالب بسیار عالی ومفیدی بود ممنون. مهندس در رابطه با فایل های خروجی که در اخر مطلب فرمودید مثال هایی میزنید مثلا دیدم برای دیباگ کردن داخل نرم افزار پروتئوس ازcof استفاده میشه یا elf برای دیباگ کردن تو gcc . اگر درمورد خروجی های زیر توضیحات بیشتری بدید ممنون میشم

  2. Avatar for حسین حسین گفت:

    سلام .
    بسیار سپاسگزارم . بابت نوشتن این سری مطالب بخصوص این قسمت .
    من خیلی دوست دارم بدونم که پارامترهای کمپایلری که باهاش کار میکنم چه چیزهایی هست .
    چند تا سوال هم دارم .
    1 – اول اینکه گفته بودید لینکر برای لینک کردن فایلها ( که اگر اشتباه نکنم object ها) به یک فایل کمکی احتیاج داره .
    اون فایل رو چطور باید تهیه کرد ؟ خودمون باید بنویسیمش ( یعنی کلا چیز دست نویس هست ) یا یک چیز ثابت هست ؟
    2- این (symbols) ها که برای locating برای منابع سخت افزاری استفاده میشه چه نامهایی دارند؟ آیا اینها را لینکراستفاده میکنه ؟
    کجا تعریف میشن ؟

    3 – من با یک نرم افزار برای gcc و هسته ARM کدنویسی میکنم که یک فایل با پسوند ld تولید میکنه ، این چی هست؟
    راستش رو بخواهید در یکی از مطالب همین سایت در مورد برنامه نویسی رزبری بدون سیستم عامل مطلب هست . و یک کد نمونه را با gcc از طریق خط فرمان کمپایل کرده ، من میخوام با نرم افزار خودم اینکار را انجام بدم ( البته توی قسمتهای بعدی مطلب از طریق نصب پلاگینهایی برای eclips این کار انجام شده ولی چون روی نرم افزار من از قبل پلاگینهایی نصب هست و نمیدونم که نصب پلاگینهای جدید چه تاثیری میزاره ) نیاز دارم دقیقا بدونم کمپایل و لینک به صورت دستی چطور باید انجام بشه با توجه به اینکه توی مطلب قسمت سوم رزبری ،فقط یک فایل که از طریق خط فرمان کمپایل شد و اون موضوع لینک کردن چندتا فایل با لینکر مشهود نیست .البته وقتی طبق مطالب سایت کد رو از طریق خط فرمان کمپایل کردم کمپایلر یک اخطار با موضوع:
    cannot find entry symbol _start; defaulting to 0000800c را صادر کرد .
    که فکر میکنم به همون نمادهای مربوط به تخصیص سخت افزار که فرمودید ، مربوط میشه .
    ببخشید یکم طولانی شد ام اگر در مورد اینها توضیحاتی با جزئیات زیاد بدید خیلی خوب خواهد بود .

    سپاس فراوان بابت مطلب بسیار خوب شما.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *