انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: 🇬🇧بریتانیای کبیر🇬🇧 در 04 شهریور 1401، 12:03 ب‌ظ

عنوان: تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس( ۵۰٪ حل شد)
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 04 شهریور 1401، 12:03 ب‌ظ
چرا در ویندوز  همه ی برنامه های اجرایی که درست می‌کنم ۳۲۴ kb هست و تفاوتی در اندازه ندارند  با اینکه یکیش مثلا خیلی برنامه ساده ای هست ولی دیگری کمی پیچیده تره.
در لینوکس  هم همه برنامه ها ۱۶.۱ kb هست،
چرا تغیری در اندازه برنامه ها با اینکه باهم فرق فاحشی رو دارند ایجاد نمیشه؟ و البته می‌دونم که باینری لینوکس  با ویندوز  فرق داره ولی باید اینقدر اختلاف داشته باشند؟
عنوان: پاسخ : تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس
ارسال شده توسط: دانیال بهزادی در 04 شهریور 1401، 02:24 ب‌ظ
یعنی چی؟
عنوان: پاسخ : تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 04 شهریور 1401، 04:39 ب‌ظ
یعنی اینکه من در ویندوز  یک برنامه با سی که فقط چاپ می‌کنه سلام دنیارا کامپایل می‌کنم. حجم فایل اجرایی برنامه شده ۳۲۲ kb. بعدش یک برنامه دیگری که مثلا یک ماشین حسابه رو کامپایل  می‌کنم و برنامه تولید شده باز ۳۲۲kb هست! چرا؟ هرچی برنامه اجرایی با زبان سی تولید می‌کنم در ویندوز  ۳۲۲kb هست و همین قصه در لینوکس  هم هست با اینکه حجن برنامه ها در لینوکس  ۱۶.۱ kb هست. چرا حجم برنامه ها با اینکه  کار مختلفی رو انجام می‌دن فرقی  با هم نداره و چرا اندازه پیش‌فرض‌ برنامه ها در ویندوز  و در لینوکس  اینقدر اختلاف داره؟
عنوان: پاسخ : تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس
ارسال شده توسط: دانیال بهزادی در 04 شهریور 1401، 05:53 ب‌ظ
این احتمالاً به خاطر اندازهٔ پرونده در سامانه‌پرونده‌های NTFS و EXT4 است. درواقع هیچ کدوم از برنامه‌هات، به اندازهٔ کم‌ترین اندازهٔ ممکن نمی‌رسه.
عنوان: پاسخ : تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس( ۵۰٪ حل شد)
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 06 شهریور 1401، 06:54 ب‌ظ
الآن رفتم در یکی از پوشه های نصب شده در ویندوز و دیدم  که حجم بکیشون ۱۶ kb هست، ولی طبق گفته شما حداقل اندازه یک فایل درntfs 322 kb هست! چطوری این فایل اجرایه حجمش از ۳۲۲ kb کمتر شده؟
عنوان: پاسخ : تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس
ارسال شده توسط: farooqkz در 15 آبان 1401، 09:34 ب‌ظ
یعنی اینکه من در ویندوز  یک برنامه با سی که فقط چاپ می‌کنه سلام دنیارا کامپایل می‌کنم. حجم فایل اجرایی برنامه شده ۳۲۲ 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




البته این باینری همونطور که میبینی به صورت ایستا لینک شده که باعث میشه حجیم باشه. الآن یادم نمیاد چطور به صورت پویا لینکش کنم ولی قبلا اینکار رو انجام داده بودم یادم میاد یه باینری «سلام دنیا» حجمش کمتر از ۱ کیلوبایت بود.