برنامه نویسی

چرا من همان آدرس دستورالعمل را در جداسازی GDB دریافت می کنم؟

هنگامی که بعد از تهیه کد C ، یک تابع را با استفاده از GDB جدا می کنید ، ممکن است توجه داشته باشید که آدرس های دستورالعمل و آدرس های ثابت هر بار که جدا می شوید به نظر می رسد. این رفتار یک سؤال جالب در مورد چگونگی ساختار اجرایی و پیامدهای تدوین برای آدرس ها ایجاد می کند.

درک جداسازی در GDB

دستور جداسازی در GDB به توسعه دهندگان این امکان را می دهد تا کد مونتاژ تولید شده از کد منبع C یا C ++ را مشاهده کنند. هنگامی که یک برنامه را با اطلاعات اشکال زدایی با استفاده از یک دستور مانند:

gcc -o hello hello.c -ggdb

این دستور یک اجرایی باینری به نام ایجاد می کند hello، که حاوی نقشه برداری بین کد منبع سطح بالاتر و دستورالعمل های مونتاژ مربوطه است.

چرا آدرس ها سازگار هستند؟

آدرس های برگشتی توسط GDB در هنگام جداسازی به دلیل نحوه برخورد پیوند دهنده و کامپایلر در قرارگیری دستورالعمل ها و ثابت ها ، سازگار هستند:

  1. آدرس استاتیک: باینری کامپایل شده به طور کلی از آدرس دهی استاتیک برای دستورالعمل و ثابت استفاده می کند. این بدان معنی است که مکان های حافظه اختصاص داده شده به توابع و ثابت ها پس از گردآوری باینری تغییر نمی کنند و منجر به یک ساختار قابل پیش بینی می شوند.

  2. قالب قابل اجرا: بیشتر کامپایلرها ، از جمله GCC ، باینری های خروجی در قالب اجرایی و پیوند دهنده (ELF) یا یک قالب استاندارد دیگر که دقیقاً چگونگی ذخیره اجزای مختلف یک برنامه (دستورالعمل ها ، ثابت ها و غیره) را مشخص می کند. این قالبها برای مؤلفه های برنامه به موقعیت های ثابت متکی هستند مگر اینکه از پرچم های خاص برای معرفی تصادفی استفاده شود ، مانند تصادفی کردن طرح بندی فضای آدرس (ASLR).

  3. بهینه سازی کامپایلر: هنگامی که کد خود را کامپایل می کنید ، بهینه سازی ها ممکن است بر ترتیب دستورالعمل ها تأثیر بگذارد. با این حال ، نمادهای اشکال زدایی (مانند -ggdb) موجود هستند ، و نقشه های دقیقی را برای توسعه دهندگان فراهم می کنند تا از طریق مونتاژ به کد C اصلی ردیابی کنند. در صورت عدم استفاده از بهینه سازی (استفاده از -O0) ، ترتیب دستورالعمل ها در بین تالیفات پایدار خواهد بود و منجر به نتایج جداسازی مداوم می شود.

راهنمای گام به گام برای جداسازی در GDB

برای دیدن این موضوع در عمل ، بیایید از طریق روند جداسازی GDB قدم به قدم قدم بزنیم:

  1. کد C خود را بنویسید و کامپایل کنید: در اینجا یک مثال ساده از یک برنامه C وجود دارد:
#include 

int main() {
    const int constant_value = 42;
    printf("The value is %d\n", constant_value);
    return 0;
}
  1. کد را با اطلاعات اشکال زدایی کامپایل کنید:
gcc -o hello hello.c -ggdb
  1. GDB را شروع کرده و جدا کنید:
gdb hello
(gdb) disassemble main
  1. خروجی را بررسی کنید: برای دستورالعمل و ثابت ، خروجی را با آدرس های ثابت مشاهده خواهید کرد. حتی اگر از GDB خارج شوید و مجدداً وارد جداسازی شوید ، خروجی همان است که باینری کامپایل شده بدون تغییر باقی می ماند.

آدرس تصادفی طرح فضایی (ASLR)

در حالی که آدرس ها معمولاً استاتیک هستند ، به خاطر داشته باشید که اگر شما روی برنامه ای مشمول ASLR کار می کردید ، مانند یک اجرایی پویا ، رفتار ممکن است متفاوت باشد. ASLR برای جلوگیری از انواع خاصی از حملات ، آدرس بارگذاری پرونده ها و کتابخانه های اجرایی در حافظه را تصادفی می کند ، اما این در درجه اول بر نحوه اجرای باینری در حافظه تأثیر می گذارد ، و نه نحوه نمایش جداسازی از دیسک.

سوالات متداول

چرا جداسازی حتی پس از خروج و ورود مجدد به GDB تغییر نمی کند؟
قوام شما مشاهده می کنید به این دلیل است که باینری نقشه برداری ثابت از دستورالعمل ها و ثابت های کامپایل شده خود را حفظ می کند ، مگر اینکه کد منبع یا گزینه های کامپایل تغییر کند.

آیا می توانم آدرس های تغییر پویا را در GDB ببینم؟
بله ، شما می توانید. اجرای برنامه ای که از نشانگرها یا تعامل با حافظه استفاده می کند ، می تواند منجر به تغییر آدرس در هنگام اجرا شود ، به خصوص هنگام استفاده از ASLR.

برای دیدن آدرس های مختلف برای جداسازی خود چه کاری باید انجام دهم؟
برای مشاهده آدرسهای مختلف حافظه ، کد را با بهینه سازی غیرفعال یا فعال کردن ASLR ، که ممکن است موقعیت قطعات قابل اجرا در حافظه را تغییر دهد ، کامپایل کنید. با این حال ، به خاطر داشته باشید که آدرس های استاتیک واقعی در بازده جداسازی با توجه به فرمت کامپایل شده ، همچنان سازگار خواهند بود.

پایان

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

نوشته های مشابه

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

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

دکمه بازگشت به بالا