از کجا بفهمم که یک تابع در سی جزو چه دسته ایی هست؟ مثلا تابع ریاضی سینوس در سی جزو کدوم دسته از توابع هست؟
اگر کتابخانهٔ دینامیک سی مورد استفاده قرار میگیرد، پس توابع بکار رفته در برنامه (مثلا تابع printf) به سورس برنامه اضافه نمیشود. اگر کتابخانهٔ استاتیک سی مورد استفاده قرار گیرد، چنین توابعی در سورس برنامه اضافه میشود. البته نباید بگوییم که تابع به سورس اضافه میشود، بلکه این کد ماشین این توابع بعد از کامپایل برنامه در آن جای میگیرند (پس در واقع سورس برنامه تغییر نمیکند این کد ماشین است که به برنامهٔ نهایی (کامپایل شده) اضافه میشود).
پس ممکن است شما کتابخانهٔ دینامیک را مورد استفاده قرار میدهید و شاید هم کتابخانهٔ استاتیک را... در سیستمعاملهایی مثل اکثر توزیعهای گنو/لینوکس، هر دو نوع کتابخانهٔ سی (منظورم کتابخانهٔ استاندارد است) وجود دارند هم دینامیک (فایلهایی با پسوند so) و هم استاتیک (فایلهایی با پسوند a)... اما در ویندوز تا جایی که میدانم فقط میتوان از کتابخانهٔ استاندارد بصورت استاتیک استفاده کرد زیرا فایل DLL آنها وجود ندارد (برای کامپایلر ++MSVC). در گنو/لینوکس نیز چون هر دو نوع کتابخانهٔ استاندارد سی موجود است، بطور پیشفرض از کتابخانهٔ دینامیک استفاده میشود مگر اینکه برنامهنویس به لینکر بفهماند که میخواهد بصورت استاتیک از توابع استفاده کند.
در مورد اونی که گفتم توابع به سورس سی برنامه مون اضافه بشه از اونجایی حدس زدم که تو پیش پردازند مینویسیم
include#
یعنی بگنجان.
در این حالت، توسط include مشخص میشود که چه کلاسها و توابعی را میخواهیم استفاده کنیم. در واقع استفاده از include برای زمان کامپایلر است ولی نوع کتابخانه (دینامیک یا استاتیک) مورد استفاده را لینکر است که تعیین میکند تا در نهایت آیا کدهای ماشین (تابع) به برنامهٔ نهایی (کامپایل شده) اضافه شود یا خیر.
میشه در مورد نحوه عملکرد DLL ها یه توضیح (حتی اگه کپی پیست از جای دیگه باشه) بزارید.
بطور کلی، DLLها یکبار در حافظه قرار میگیرند، سپس سایر برنامهها، توابع و کدهای موجود در آن DLL را به اشتراک میگذارند و از آنها در زمان اجرا استفاده میکنند. به همین خاطر است که لینکر (linker بعد از کامپایلر) باید در مورد استفاده از کتابخانههای دینامیک یا استاتیک تصمیم بگیرد. اگر کتابخانه بصورت استاتیک است که هیچ... ولی اگر کتابخانه بصورت دینامیک است، آدرس توابع موجود در DLL باید توسط برنامهها در زمان اجرا مورد استفاده و در دسترس قرار بگیرد.
ولی میخام بدونم وقتی برنامه EXE تحت سیستم عامل اجرا میشه آیا باز هم تحت نظارت سیستم عامل هست که اجرا میشه یا نه سیستم عامل(اینجا منظورم داس هست) کاملا متوقف شده و کنترل کامپیوتر رو به برنامه ما میده؟
باز هم تحت نظارت سیستمعامل اینکار صورت میگیرد، سیستمعامل فایلهای EXE معمولی را در حالت user mode اجرا میکند. برنامهها نمیتوانند بطور مستقیم به سختافزار دسترسی داشته باشند (مگر اینکه سیستمعامل اجازه دهد).
برنامههایی که بدون نیاز به سیستمعامل کار میکنند، در واقع نه از توابع سیستمعامل و نه از سایر کتابخانههای کمکی سی (مثل ;کتابخانهٔ استاندارد سی) سود نمیبرند. بلکه باید بطور مستقیم با جزئیات سختافزار کار کنند و با آن کنار بیایند (کاری که سیستمعامل میکند).
متاسفانه من ویندوز را خوب نمیشناسم
در مورد فایلهای com اطلاعاتی ندارم و تنها میتوانم جستجو کنم:
The COM files are raw binary executables and are a leftover from the old CP/M
machines with 64K RAM. A COM program can only have a size of less than one
segment (64K), including code and static data since no fixups for segment
relocation or anything else is included. One method to check for a COM file is
to check if the first byte in the file could be a valid jump or call opcode, but
this is a very weak test since a COM file is not required to start with a jump
or a call. In principle, a COM file is just loaded at offset 100h in the segment
and then executed.
OFFSET Count TYPE Description
0000h 1 byte ID=0E9h
ID=0EBh
Those are not safe ways to determine wether a
file is a COM file or not, but most COM files
start with a jump.
این اطلاعاتی بود که من در این مورد داشتم، اگر احیاناً غلط بودند، ممنون میشوم دیگر دوستان اصلاح کنند.