یعنی اینکه من در ویندوز یک برنامه با سی که فقط چاپ میکنه سلام دنیارا کامپایل میکنم. حجم فایل اجرایی برنامه شده ۳۲۲ kb. بعدش یک برنامه دیگری که مثلا یک ماشین حسابه رو کامپایل میکنم و برنامه تولید شده باز ۳۲۲kb هست! چرا؟ هرچی برنامه اجرایی با زبان سی تولید میکنم در ویندوز ۳۲۲kb هست و همین قصه در لینوکس هم هست با اینکه حجن برنامه ها در لینوکس ۱۶.۱ kb هست. چرا حجم برنامه ها با اینکه کار مختلفی رو انجام میدن فرقی با هم نداره و چرا اندازه پیشفرض برنامه ها در ویندوز و در لینوکس اینقدر اختلاف داره؟
توی لینوکس اگر برنامه سی رو با gcc کامپایل میکنی به ناچار یه حجمی رو میگیره(اگر درست به یاد بیارم جیسیسی یه چیزی رو به همه برنامهها اضافه میکنه) به علاوه اینکه debug symbol ها هم توی برنامه سی یا سیپلاسپلاس وجود دارن که برای دیباگ مفید هستن ولی توی اجرا تاثیری ندارن. مثلا کد زیر رو در نظر بگیر:
#include <stdio.h>
int fibo(int n) {
if (n <= 2) {
return 1;
} else {
return fibo(n-1) + fibo(n-2);
}
}
int main() {
printf("%d", fibo(40));
}
وقتی اینجوری کامپایلش میکنم:
gcc -O 2 fibo.c
این حجم رو داره:
[21:24:43]:~/c$ ls -lh a.out
-rwxrwxr-x 1 farooqkz farooqkz 17K Nov 6 21:24 a.out
ولی اگر با برنامه file نگاهش کنیم میبینیم استریپ نشده:
[21:24:47]:~/c$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=96f2716a8ac526732341679382d8209559acb06c, for GNU/Linux 3.2.0, not stripped
حالا اگر استریپش کنیم، حجمش کمتر میشه:
[21:25:45]:~/c$ strip a.out
[21:26:25]:~/c$ ls -lh a.out
-rwxrwxr-x 1 farooqkz farooqkz 15K Nov 6 21:26 a.out
ولی اون خرت و پرتهایی که کامپایلر همراه هر برنامه میزنه رو داره. حالا اگر برنامهات رو مستقیم به اسمبلی بنویسی. مثلا همچین چیزی:
.global _start
.text
_start:
mov $1, %RCX # counter
mov $1, %RAX # factorial result
loop:
mul %RCX
inc %RCX
cmp $30, %RCX
میبینی که با وجود استریپ نشدن حجمش خیلی کمتره:
[21:28:52]:~/asm$ as fact10e5.s
[21:28:54]:~/asm$ ls
a.out avr fact10e5.s isprime.s m.c
[21:28:54]:~/asm$ ld -o a a.out
[21:29:00]:~/asm$ ls -lh a
-rwxrwxr-x 1 farooqkz farooqkz 4.6K Nov 6 21:29 a
[21:29:04]:~/asm$ file a
a: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
البته این باینری همونطور که میبینی به صورت ایستا لینک شده که باعث میشه حجیم باشه. الآن یادم نمیاد چطور به صورت پویا لینکش کنم ولی قبلا اینکار رو انجام داده بودم یادم میاد یه باینری «سلام دنیا» حجمش کمتر از ۱ کیلوبایت بود.