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

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

از نرم‌افزار تا سخت‌افزار – قسمت چهارم – فایل Linker و فرآیند Locating
از نرم‌افزار تا سخت‌افزار – قسمت چهارم – فایل 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 و نکات مرتبط باهاش!

0 نفر

پــــســنــدیـده انـد

توجه

سعید حقیقی پور
سعید حقیقی پور

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

دیدگاه ها

2 دیدگاه

  • محمدرضا عابدینی
    محمدرضا عابدینی
    ۲ تیر ۱۳۹۹

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

  • حسین
    ۲ تیر ۱۳۹۹

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

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

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 3 سال پیش
راه اندازی LCD گرافیکی Nokia 1661

راه اندازی LCD گرافیکی Nokia 1661

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش
ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش
همه چیز درباره ریموت کنترل‌های هاپینگ

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش
مسابقه سوم: استخراج داده از رشته ها در زبان C

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش
مسابقه ششم: بزن میکروکنترلر را بسوزون!

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 12 ماه پیش
آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش
ساخت ماینر با FPGA و ARM

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش
مسابقه چهارم: کدام حلقه سریع‌تر است؟

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک