نمایش نتایج 1 تا 7 از 7

نام تاپیک: فایل اجرایی

  1. #1

    فایل اجرایی

    ببخشید اگه این سوالو اینجا مطرح میکنم.اما خب ساخته شدن فایل اجرایی به هرحال بخشی از مسیر برنامه نویسی با هر زبانیه.
    ساختار فایل اجرایی ویندوز (exe) رو تا اونجا که من فهمیدم به این شکله که یه بخش شامل اطلاعات فایله و یه بخش شامل کد برنامه است و یه بخش شامل داده ها و یه بخش پشته و یه بخش توابع وapi های ویندوز که توسط برنامه قراره اجرا بشن و ... . و ویندوز وقتی میخواد برنامه رو اجرا کنه اول بخش کد رو از هارد میخونه و در رم قرار میده و به اندازه اون حافظه ای که تو بخش متغیر ها براش تعریف شده از سیستم حافظه میگیره و ادرس حافظه هارو جایگذاری میکنه و همینطور ادرس توابع و api هارو هم لینک میکنه.البته این چیزیه که من فهمیدم و اگر اشکال داره ممنون میشم اصلاحش کنید.
    حالا سوالم اینه اگه ما یه ابجکت کد داشته باشیم یا یه برنامه خیلی خیلی ساده رو به زبان ماشین مستقیما بنویسیم و بخوایم بدون استفاده از لینکر که ساختار فایل اجرایی رو برامون میساره به صورت دستی یه فایل اجرایی درست کنیم،یعنی با یه هگزادیتور یا یه چیزی مثل نوت پد یه فایل یسازیم و و با فرمت exe ذخیره کنیم.بیایم و قراردادهایی که ویندوز(یا هرسیستم عامل دیگه با فرمت مخصوص خودش و قاعده هاش)قرار داده رو رعایت کنیم.بعد بخش کد رو توی جای خودش قرار بدیم و حافظه مورد نیاز برنامه رو با همون ترتیبی که ویندوز میفهمه براش بنویسیم و توابع درون سیستم عامل مورد نیاز رو توش تعریف کنیم،آیا این کار عملا شدنیه؟
    البته هدف من اصلا این نیست که بدون لینکر برنامه نوشته شده رو به حالت اجرایی در بیارم چون که کار بیهوده ایه.بلکه میخوام ببینم ایا میتونم هر برنامه ای که باشه رو بخش کد اجرایی زبان ماشینش رو جدا کنم از فایل اجرایی؟و کلا ببینم نوشتن برنامه هایی مثل لینکرد یا دیس اسمبلر در توان من هست یا نه


  2. #2

    نقل قول: فایل اجرایی

    نقل قول نوشته شده توسط MAHDI.D.H.F مشاهده تاپیک
    ببخشید اگه این سوالو اینجا مطرح میکنم.اما خب ساخته شدن فایل اجرایی به هرحال بخشی از مسیر برنامه نویسی با هر زبانیه.
    ساختار فایل اجرایی ویندوز (exe) رو تا اونجا که من فهمیدم به این شکله که یه بخش شامل اطلاعات فایله و یه بخش شامل کد برنامه است و یه بخش شامل داده ها و یه بخش پشته و یه بخش توابع وapi های ویندوز که توسط برنامه قراره اجرا بشن و ... . و ویندوز وقتی میخواد برنامه رو اجرا کنه اول بخش کد رو از هارد میخونه و در رم قرار میده و به اندازه اون حافظه ای که تو بخش متغیر ها براش تعریف شده از سیستم حافظه میگیره و ادرس حافظه هارو جایگذاری میکنه و همینطور ادرس توابع و api هارو هم لینک میکنه.البته این چیزیه که من فهمیدم و اگر اشکال داره ممنون میشم اصلاحش کنید.
    حالا سوالم اینه اگه ما یه ابجکت کد داشته باشیم یا یه برنامه خیلی خیلی ساده رو به زبان ماشین مستقیما بنویسیم و بخوایم بدون استفاده از لینکر که ساختار فایل اجرایی رو برامون میساره به صورت دستی یه فایل اجرایی درست کنیم،یعنی با یه هگزادیتور یا یه چیزی مثل نوت پد یه فایل یسازیم و و با فرمت exe ذخیره کنیم.بیایم و قراردادهایی که ویندوز(یا هرسیستم عامل دیگه با فرمت مخصوص خودش و قاعده هاش)قرار داده رو رعایت کنیم.بعد بخش کد رو توی جای خودش قرار بدیم و حافظه مورد نیاز برنامه رو با همون ترتیبی که ویندوز میفهمه براش بنویسیم و توابع درون سیستم عامل مورد نیاز رو توش تعریف کنیم،آیا این کار عملا شدنیه؟
    البته هدف من اصلا این نیست که بدون لینکر برنامه نوشته شده رو به حالت اجرایی در بیارم چون که کار بیهوده ایه.بلکه میخوام ببینم ایا میتونم هر برنامه ای که باشه رو بخش کد اجرایی زبان ماشینش رو جدا کنم از فایل اجرایی؟و کلا ببینم نوشتن برنامه هایی مثل لینکرد یا دیس اسمبلر در توان من هست یا نه
    ساختار فایل اجرایی رو می توانید اینجا ببینید، مطلب خیلی مفصلی ئه : PE Format
    اگه با دقت بررسی اش کنید می بینید که ساختار ساده ای نداره و نوشتنش کار راحتی نیست.
    بخش هایی مثل پشته موقع اجرا شدن برنامه در حافظه ایجاد می شه، اندازه اش در فایل اجرایی مشخص میشه ولی خودش در فایل اجرایی نیست.
    سیستم عامل الزاما همه کد اجرایی رو در از ابتدا در حافظه قرار نمیده، یک بخش آغازین رو که حالا ممکنه چند page باشه فراخوانی می کنه و در ادامه اجرای برنامه بر اساس اینکه اجرا چطور باشه page های مورد نیاز فراخوانی می شوند. داده ها و حافظه مورد نیاز برنامه هم بر اساس درخواست خود کد به تدریج تخصیص پیدا می کنه.

    از طرف دیگه کد ماشین داخل فایل اجرایی بر اساس آدرس های نسبی ذخیره شده، آدرس های مطلق نیستند، یعنی مثلا نمیگه داده رو از آدرس x از حافظه RAM بخون، میگه داده رو از x بایت جلوتر از آدرس شروع حافظه خود برنامه بخون. آدرس شروع برنامه کجا است؟ هنوز مشخص نیست، موقع اجرای برنامه مشخص میشه. دلیل این ذخیره شدن آدرس بصورت نسبی اینه که موقع ساختن فایل اجرایی نمیدونیم که موقع اجرا در کدوم آدرس از حافظه فراخوانی میشه. هر بار در یک جای متفاوتی میتونه فراخوانی بشه.

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

    پیاده سازی همه چیزی که میخواهید کار خیلی سختی است، عملی است و ولی مدت خیلی طولانی باید وقت صرف مطالعه مستندات جور واجور کنید.
    پیشنهاد می کنم که کامپایلر زبان دیگری رو واسطه کنید، مثلا هدف رو این قرار بدید که بجای ساختن فایل اجرایی، برنامه یا کامپایلر تون نهایتا یک فایل کد اسمبلی (فایل متنی ASM) بسازه تا بتوانید برای ایجاد فایل EXE نهایی از اسمبلر ها و لینکر موجود برای ویندوز کمک بگیرید، وگرنه رعایت اصول نوشتن کد ماشین و ساختار فایل EXE کار تون رو خیلی خیلی سخت می کنه.
    برای درک فایل اجرایی ابزار هایی مثل PE Explorer و W32Dasm کمکتون می کنه.

  3. #3

    نقل قول: فایل اجرایی

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    ساختار فایل اجرایی رو می توانید اینجا ببینید، مطلب خیلی مفصلی ئه : PE Format
    اگه با دقت بررسی اش کنید می بینید که ساختار ساده ای نداره و نوشتنش کار راحتی نیست.
    بخش هایی مثل پشته موقع اجرا شدن برنامه در حافظه ایجاد می شه، اندازه اش در فایل اجرایی مشخص میشه ولی خودش در فایل اجرایی نیست.
    سیستم عامل الزاما همه کد اجرایی رو در از ابتدا در حافظه قرار نمیده، یک بخش آغازین رو که حالا ممکنه چند page باشه فراخوانی می کنه و در ادامه اجرای برنامه بر اساس اینکه اجرا چطور باشه page های مورد نیاز فراخوانی می شوند. داده ها و حافظه مورد نیاز برنامه هم بر اساس درخواست خود کد به تدریج تخصیص پیدا می کنه.

    از طرف دیگه کد ماشین داخل فایل اجرایی بر اساس آدرس های نسبی ذخیره شده، آدرس های مطلق نیستند، یعنی مثلا نمیگه داده رو از آدرس x از حافظه RAM بخون، میگه داده رو از x بایت جلوتر از آدرس شروع حافظه خود برنامه بخون. آدرس شروع برنامه کجا است؟ هنوز مشخص نیست، موقع اجرای برنامه مشخص میشه. دلیل این ذخیره شدن آدرس بصورت نسبی اینه که موقع ساختن فایل اجرایی نمیدونیم که موقع اجرا در کدوم آدرس از حافظه فراخوانی میشه. هر بار در یک جای متفاوتی میتونه فراخوانی بشه.

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

    پیاده سازی همه چیزی که میخواهید کار خیلی سختی است، عملی است و ولی مدت خیلی طولانی باید وقت صرف مطالعه مستندات جور واجور کنید.
    پیشنهاد می کنم که کامپایلر زبان دیگری رو واسطه کنید، مثلا هدف رو این قرار بدید که بجای ساختن فایل اجرایی، برنامه یا کامپایلر تون نهایتا یک فایل کد اسمبلی (فایل متنی ASM) بسازه تا بتوانید برای ایجاد فایل EXE نهایی از اسمبلر ها و لینکر موجود برای ویندوز کمک بگیرید، وگرنه رعایت اصول نوشتن کد ماشین و ساختار فایل EXE کار تون رو خیلی خیلی سخت می کنه.
    برای درک فایل اجرایی ابزار هایی مثل PE Explorer و W32Dasm کمکتون می کنه.

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

    اگه یه منبع کامل و فارسی میشناسید ممنون میشم معرفی کنید

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

    و سوال اخر هم اینکه فایل اجرایی لینوکس هم ساختارش به این پیچیدگیه؟اصلا ساختار خاصی داره؟

  4. #4

    نقل قول: فایل اجرایی

    نقل قول نوشته شده توسط MAHDI.D.H.F مشاهده تاپیک
    بعد یه سوال دیگه.api های سیستم عامل که قراره فراخوانی شن تو برنامه ایا در جایی از فایل لیستشون جداگونه قرار میگیره و بعد از این که سیستم عامل لودشون میکنه تو حافظه برنامه جامپ میکنه بهش؟
    از نظر فنی یک کد اجرایی میتونه در هر زمانی که اراده کنه هر کتابخانه و API ای که دلش بخواد رو به سیستم عامل درخواست بده و فراخوانی کنه، به همین جهت اینکه همه توابع و کتابخانه های مورد استفاده در فایل اجرایی مشخص بشن ضروری نیست، اما وجودشون کمک می کنه چون سیستم عامل میفهمه که موقع فراخوانی برنامه کدوم کتابخانه ها مورد نیاز هستند و باید فراخوانی بشوند و نباید فلان کتابخانه های مورد نیاز رو بدون استفاده فرض کنه و Unload کنه.
    هر کدوم از اون کتابخانه ها حالا چه جزو API ویندوز باشند و چه نباشند، یک حافظه مستقل برای خودشون دارند، و معمولا هم یک کتابخانه فراخوانی شده مورد استفاده چندین برنامه اجرایی قرار میگیره. سیستم عامل خودش دخالتی در جامپ هایی که میگید نداره، هر زمان که یک کتابخانه فراخوانی میشه مثل برنامه های عادی روتین اولیه ای مثل DllMain داره که مستقلا اجرا میشه و در حافظه برای اجرا شدن توابعش آماده میشه. هر زمان که برنامه شما بخواد تابع فلان از کتابخانه بهمان رو اجرا کنه، اولا بررسی میشه که اون کتابخانه قبلا فراخوانی شده یا نه، اگر نشده باشه با کمی تاخیر اینکار انجام میگیره. بعد آدرس اون تابع در کتابخانه بر اساس اطلاعات داخل خود کتابخانه پیدا میشه. حالا که آدرس بدست اومد اطلاعات پارامتر ها در پشته قرار میگیره، رجیستر ها تنظیم میشوند و پرش به اون آدرس صورت میگیره و ...

    نقل قول نوشته شده توسط MAHDI.D.H.F مشاهده تاپیک
    و سوال اخر هم اینکه فایل اجرایی لینوکس هم ساختارش به این پیچیدگیه؟اصلا ساختار خاصی داره؟
    صد البته. کلا یک سیستم عامل مدرن و پیچیده به یک فایل اجرایی پیچیده نیاز داره. مستندات Executable and Linkable Format (ELF) رو ببینید.

    ساده ترین فرمت اجرایی که میشناسم فایل های COM ئه که برای برنامه های کوچک در سیستم عامل 16 بیتی MS-DOS و ویندوز 95/98 مناسب بود و داده و کد اجرایی اش یکجا و قاطی هم ذخیره میشه و البته مدل حافظه خیلی ساده و کوچکی داره.

  5. #5

    نقل قول: فایل اجرایی

    درود
    پیشنهاد میکنم در ابتدا یک برنامه برا نمایش مشخصات فایل اجرایی بنویسید . صحت عملکرد برنامتون رو هم میشه با برنامه هایی مثل PE Explorer بررسی کنید. یک دفعه سراغ نوشتن اسمبلر نرید!
    البته فرض کردم کار با فایل رو کامل بلدین .راستی با چه زبانی کار میکنید؟

  6. #6

    نقل قول: فایل اجرایی

    نقل قول نوشته شده توسط pe32_64 مشاهده تاپیک
    درود
    پیشنهاد میکنم در ابتدا یک برنامه برا نمایش مشخصات فایل اجرایی بنویسید . صحت عملکرد برنامتون رو هم میشه با برنامه هایی مثل PE Explorer بررسی کنید. یک دفعه سراغ نوشتن اسمبلر نرید!
    البته فرض کردم کار با فایل رو کامل بلدین .راستی با چه زبانی کار میکنید؟
    حقیقتش بیشتر هدفم نوشتن اسمبلر و لینکر نبود.ولی خب اگه دقیق ساختار فایل اجرایی و کد های اجرایی رو بدونم فک کنم میتونم درک بهتری از ورودی خروجی و فزاخوانی های سیستمی،گرفتن حافظه،برگردوندن برنامه به اسمبلی یا زبان سطح بالاتر(که قطعا همیشه شدنی نیست)داشته باشم.
    شایدم به قول شما بتونم در حد نوشتن اسمبلر پیش برم

    با زبان سی.البته اسمبلی هم بلدم ولی نه در حد x86، اسمبلی میپس

  7. #7

    نقل قول: فایل اجرایی

    درود مجدد
    این موضوعات ربطی به هم ندارن !
    شما میتونید آموختن برنامه نویسی سیستمی ویندوز رو شروع کنید بدون نیاز به تسلط رو ساختار فایل اجرایی اون.
    اونی که شما باید دنبالش بری رفیق اسمش هست win32 programming که تازه یک قدم بزرگ هستش و کلی پیشن نیاز داره.

تاپیک های مشابه

  1. پاسخ: 1
    آخرین پست: پنج شنبه 08 اسفند 1398, 07:51 صبح
  2. پاسخ: 3
    آخرین پست: یک شنبه 14 دی 1393, 09:47 صبح
  3. آموزش: مقدمه ایی بر آشنایی با Language-Integrated Query یا همان Linq
    نوشته شده توسط alimanam در بخش VB.NET
    پاسخ: 4
    آخرین پست: جمعه 14 مهر 1391, 00:01 صبح
  4. پاسخ: 0
    آخرین پست: سه شنبه 09 اسفند 1390, 22:11 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •