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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: تفاوت اندازه برنامه های اجرایی در ویندوز و لینوکس( ۵۰٪ حل شد)  (دفعات بازدید: 807 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
چرا در ویندوز  همه ی برنامه های اجرایی که درست می‌کنم ۳۲۴ kb هست و تفاوتی در اندازه ندارند  با اینکه یکیش مثلا خیلی برنامه ساده ای هست ولی دیگری کمی پیچیده تره.
در لینوکس  هم همه برنامه ها ۱۶.۱ kb هست،
چرا تغیری در اندازه برنامه ها با اینکه باهم فرق فاحشی رو دارند ایجاد نمیشه؟ و البته می‌دونم که باینری لینوکس  با ویندوز  فرق داره ولی باید اینقدر اختلاف داشته باشند؟
« آخرین ویرایش: 06 شهریور 1401، 06:52 ب‌ظ توسط UNITED KINGDOM »
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
یعنی چی؟
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
یعنی اینکه من در ویندوز  یک برنامه با سی که فقط چاپ می‌کنه سلام دنیارا کامپایل می‌کنم. حجم فایل اجرایی برنامه شده ۳۲۲ kb. بعدش یک برنامه دیگری که مثلا یک ماشین حسابه رو کامپایل  می‌کنم و برنامه تولید شده باز ۳۲۲kb هست! چرا؟ هرچی برنامه اجرایی با زبان سی تولید می‌کنم در ویندوز  ۳۲۲kb هست و همین قصه در لینوکس  هم هست با اینکه حجن برنامه ها در لینوکس  ۱۶.۱ kb هست. چرا حجم برنامه ها با اینکه  کار مختلفی رو انجام می‌دن فرقی  با هم نداره و چرا اندازه پیش‌فرض‌ برنامه ها در ویندوز  و در لینوکس  اینقدر اختلاف داره؟
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
این احتمالاً به خاطر اندازهٔ پرونده در سامانه‌پرونده‌های NTFS و EXT4 است. درواقع هیچ کدوم از برنامه‌هات، به اندازهٔ کم‌ترین اندازهٔ ممکن نمی‌رسه.
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
الآن رفتم در یکی از پوشه های نصب شده در ویندوز و دیدم  که حجم بکیشون ۱۶ kb هست، ولی طبق گفته شما حداقل اندازه یک فایل درntfs 322 kb هست! چطوری این فایل اجرایه حجمش از ۳۲۲ kb کمتر شده؟
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین farooqkz

  • Full Member
  • *
  • ارسال: 112
  • جنسیت : پسر
    • وب‌سایت شخصی
یعنی اینکه من در ویندوز  یک برنامه با سی که فقط چاپ می‌کنه سلام دنیارا کامپایل می‌کنم. حجم فایل اجرایی برنامه شده ۳۲۲ 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




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