View Full Version : سوال بسیار ساده درباره لینکر
lukaskain
شنبه 18 خرداد 1392, 15:04 عصر
با سلام خدمت دوستان عزیز
آیا در فایل هایی که Cross Platform نیستند یا به عبارتی کامپایلر دارند برای استفاده در سیستم عامل های دیگر باید لینکر آن و بخش لنکینگ را تغییر داد؟
به عبارت دیگر اینکه فایل های ترجمه شده قابلیت اجرا روی چند سیستم عامل را ندارند و برای هر سیستم عامل باید مجزا کامپایل شوند مربوط به قسمت لینکینگ آنهاست؟
یوسف زالی
شنبه 18 خرداد 1392, 15:48 عصر
سلام.
معمولا نخیر.
این بستگی با کامپایلر داره که خروجی اسمبلیش چجوری باشه و روی چه سیستم هایی ران شه.
ممکنه اصلا خروجی اسمبلیش استاندارد ویندوز نباشه یا بایت کد باشه یا ...
lukaskain
شنبه 18 خرداد 1392, 20:15 عصر
دوست عزیز Bytecode و Abstract Syntax Tree و Just-in-time compilation ترکیبی از کامپایلر و مفسر هست، و همگی cross platform هستند و فقط کافی است مفسر RunTime مربوط به OS را داشته باشید.
سوال بنده در خصوص صرفاً کامپایلر ها هست، در مراحل کامپایل پس از چهار مرحله تبدیل، سورس کد به کد ماشن تبدیل می شود و در یک فایل مجزا ذخیره می شود، این فایل اجرایی نیست تا زمانی که لینکینگ انجام شود.
لینکر در واقع پیوند توابع OS با برنامه هست، تا اینجای موضوع را می دانم و صحیح است سوال بنده این هست که آیا برای cross platform از مرحله کامپایل، لینکینگ باید تغییر کند؟ فکر می کنم همین هست چون کامپایل که فقط یک ترجمه بیشتر نیست.
با تشکر
یوسف زالی
شنبه 18 خرداد 1392, 23:10 عصر
خب من هم همین رو می گم. نه.
نحوه ی کامپایل شدن هم شرطه. فکر می کنی لینکر چی رو به هم لینک می کنه؟ یک سری فایل کامپایل شده. لینکر فقط آدرس ها رو برای اتصالات تصحیح می کنه و اونها رو به هم می چسبونه.
نمی دونم پاسکال یا دلفی بلدید یا نه. من مثالم رو روی این زبان می زنم.
اگر چند تا یونیت داشته باشید، کامپایلر اونها رو تبدیل به چند فایل dcu می کنه که همگی خواص همون فایل exe رو دارند. اما مثل dll قابلیت اجرای مستقل ندارند.
حتی من یکی از همین فایل های dcu رو کرک هم کردم. یعنی توش اسمبلی بود.
لینکر میاد می گه مثلا آدرس ها از کجا شروع می شن و ... که از من بهتر می دونید.
من داشتم یک کامپوننت رو کرک می کردم، ترتیبش این طوری بود:
یک برنامه ساختم با استفاده از کامپوننت، برنامه exe رو کرک کردم
برگشتم و دستورات جایی رو که کرک کردم در فایل های کامپوننت (در دلفی bpl) پیدا کردم و کرک کردم. (bpl نوعی از dll در دلفی هست)
و در آخر هم به سراغ قایل های dcu (یونیت های کامپایل شده ولی لینک نشده) رفتم و اونها رو هم به همون ترتیب کرک کردم.
این روند نشون می ده در مرحله ی قبل از لینک همه چیز آماده هست..
شاید من دارم اشتباه می کنم و با وجود لینکر مناسب، بشه یک برنامه رو XPlatform کرد. اما به این مشکوکم که چرا مثلا روی همین ویندوز ورژن های 32 بیتیش با 64 بیتی فرق داره..
Linking is the process of connecting all the compiled objects to each other to form the final executable. When you call a function in one piece of code, it's the job of the linker to hook the code that calls the function to the code that implements the function.
StackOverFlow
lukaskain
یک شنبه 19 خرداد 1392, 00:12 صبح
از پاسخ شما ممنون، صحبت های شما تقریباً درست است، لینکر آبجکت فایل های یک برنامه را به هم لینک می کند. اما خب موضوع این هست که آیا API ویندوز هم هست در همین بخش افزوده می شود؟
شما یک برنامه که با دلفی 7 می نویسی win32 بیلد میشه، حالا همین را بخوایم ببریم در لینوکس کامپایلش که نباید تفاوتی بکنه چون به هر حال برای اجرا باید ماشین کد بشود و روی RAM بارگذاری بشود. نکته دقیقاً بعد از ترجمه هست و اجرایی نمودن فایل، که من فکر می کنم پیوند API مثلاً تابع جمع در لینکینگ انجام میشه؟؟؟!!! اینجا Compatibility OS در اجرای فایل مشخص می شه، وقتی لینکر با API جمع ویندوز پیوند ارجاع داده شود در لینوکس این API نیست در نتیجه error!
ببینید شما خودتون می تونید یک کامپایلر طراحی کنید، اما فایل نهایی اجرایی نیست، همه چیز از بعد از لینکر هست، خب طبیعتاً بحث Cross Platform هم همینجا باید اتفاق نیافته!
یوسف زالی
یک شنبه 19 خرداد 1392, 00:30 صبح
بخشی از همین انطباق پذیری زیر سر لینکر هست اما نه همش.
مثلا در سیستم هایی اسمبلی ای که می فهمن دارای OpCode سه قسمتی هست. مثلا درجا می تونید بگید A رو با B جمع کن و بریز تو C. اما در پردازنده های معمولی دو قستمی هست.
همین جمع ساده API نداره و مستقیم در همون DCU می تونه جود داشته باشه.
اما در خصوص API ها حق با شماست. شاید لینکر در سیستم های یونیکس API های دیگه ای جایگذاری کنه.
فکر می کنم این حرف که حدفاصل XPlatform شدن لینکر هست، در خصوص سیستم هایی صدق کنه که دارای استاندارد اسمبلی مشابهی باشن. البته فقط فکر می کنم این طور باشه.
در حین نوشتن متوجه شدم ممکنه شما درست بگید.
اگر سیستم های کامپیوتری دارای سخت افزار یکسانی باشند، ممکنه لینکر عامل تعیین کننده باشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.