برای اینکه یه برنامه بتونه اجرا بشه، لازمه تا کتابخانههای مورد نیازش رو صدا بزنه.
بیشتر برنامهها توی گنو/لینوکس معمولا به صورت پویا (dynamic) کامپایل شدند و از کتابخانههای اشتراکی استفاده میکنند. یعنی یه نسخه کتابخاته نصب میشه و هر برنامهای که به اون کتابخانه نیاز داشته باشه، اون رو صدا میزنه.
بعضی مواقع، برنامه به صورت static کامپایل شده. در این حالت، همه کتابخانههای مورد نیاز برنامه همراه خود فایل اجرایی هست و برنامه لازم نداره کتابخانههای جدا رو صدا بزنه.
بستههای deb اینجوری هستند که یه سری فایل به صورت فشرده کنار هم قرار گرفتند و یه سری فایلهای کنترلی و بعضی وقتا یه سری اسکریپت هم همراهش هست.
فایلهای کنترلی مشخص میکنند که اسم این بسته چی هست، به چه چیزهایی وابستگی داره، توضیح اون چیه، با چه استانداردی ایجاد شده و اینجور چیزها.
اون اطلاعات توسط توسعهدهنده مشخص شدند. ممکنه توسعهدهنده چیزهای اشتباهی اونجا نوشته باشه. مثلا ممکنه برنامه به نسخه خاصی از کتابخانه نیاز داشته باشه ولی توسعهدهنده اون رو ذکر نکرده باشه. اینکه چه اطلاعاتی اونجا هست، به تصمیم توسعهدهنده بستگی داره.
۱- فکر میکنم اگه الان بخوام روی مثلا اوبونتو 12.04 آخرین نسخه فایرفاکس.deb رو دانلود کنم و نصب کنم بخاطر نبود پیشنیازهاش در مخازن این نسخه نمیتونم این کار رو انجام بدم ، این درسته ؟
بستگی داره اون فایل deb رو از کجا بیارید.
ممکنه اصلا آخرین نسخه فعلی فایرفاکس نتونه با نسخه کتابخانههای اوبونتو ۱۲.۰۴ کار کنه و لازم باشه اون کتابخانهها رو هم بروزرسانی کنید. ممکن هم هست مشکلی با نسخه اون کتابخانهها نداشته باشه.
اگه مشکلی با اون نسخه کتابخانهها نداشته باشه، اونوقت باید بسته deb مناسب اوبونتو ۱۲.۰۴ پیدا کنید.
نصب یه فایل deb که مربوط به یه نسخه دیگه از اوبونتو هست، خیلی بعیده کار بده. به احتمال وابستگیهایی که توی فایلهای کنترلی ذکر شده، با چیزهایی که توی مخازن اوبونتو ۱۲.۰۴ هست هماهنگی نداره و اون فایل deb نصب نمیشه.
در این حالت میتونید خودتون آخرین نسخه فایرفاکس رو برای اوبونتو ۱۲.۰۴ بستهبندی و نصب کنید.
اولین شرط اینه که آخرین نسخه فایرفاکس، با نسخه کتابخانههای اوبونتو مشکلی نداشته باشه.
۲- در مثلا ویندوز 7 ولی میتونم چون پیشنیازهاش با خودشن و نصب میشن ، این هم درسته ؟
بله درسته. چون توی ویندوز، معمولا برنامهها کتابخانههای مورد نیاز رو همراه خودشون دارند.
معمولا برنامهها به صورت static کامپایل نشدند. بلکه فایل کتابخانهها همراه نرمافزار، توی پوشه مربوطه قرار میگیره.
۳- آیا تا بحال سیستم مستقلی که برنامه ها رو بدون وابستگی به مخازن نصب کنه ، در گنو/لینوکس وجود داشته ؟
بله. snap و flatpack و appimage برای این منظور ساخته شدند.
اگه یکم توی انجمن بگردید، میتونید بحثهای مربوط به snap رو پیدا کنید.
تصورم این هست که در گنو/لینوکس مثلا وقتی یه برنامه میخاد openGL رو صدا بزنه برای اجرا یه چیزی ، توی پوشه bin اون رو پیدا میکنه در زمان اجرا و یا کتابخانه هاش رو از lib ها
معمولا برنامهها وقتی موقع اجرا به چیزی نیاز دارند، اون رو از /lib/ یا /lib64/ یا /lib32/ یا /libexec/ یا دایرکتوری متناظر همینها توی /usr/ فرا میخونند. البته توی نسخه جدید بیشتر توزیعها، این دایرکتوریهای بالا، یه لینک به دایرکتوری متناظر توی /usr/ هستند.
معمولا وقتی چیزی از /bin/ اجرا میشه، یه برنامه مجزا هست، نه یه کتابخانه یا همچین چیزی.
و همچنین موقع نصبش از مخازش اگر این پیشنیازها نصب نباشن روی سیستم عامل ، مدیربسته اون ها رو نصب میکنه ، پس در این صورت اگه من برنامه ای رو خارج از مدیر بسته نصب یا اجرا کنم که مثلا به فلان کتابخانه نسخه ۵ نیاز داره ، ولی توی کتابخانه های سیستم عامل نیست یا نسخه کمتر با بیشترش هست ، اجرا نمیشه یا خطا میده ، ۴- این هم درسته ؟
ممکنه اون برنامهای که نصب میکنید، فقط به یه نسخه خاص از یه کتابخانه نیاز داشته باشه. در اینصورت چیزی که میگید درسته.
ممکن هم هست اون برنامه، با اون نسخه مورد نیاز کتابخانه و همینطور نسخههای جدیدتر اون درست کار کنه. معمولا برنامههای نوشته شده به c اینجوری هستند.
برنامههای پایتون خیلی کم پیش میاد اینجوری باشند. (معمولا با هر بار ارتقا نسخه پایتون، لازمه برنامه مجدد بررسی و تغییر داده بشه تا با نسخه جدید هم کار کنه. البته تغییرات مورد نیاز معمولا زیاد نیست)
دوباره تصورم اینه که با وجود اینکه در ویندوز هم همین کتابخانه ها و dll های جایگزین در پوشه windows و system32 هستن ، یه برنامه میتونه پیش نیازهاش رو از این دو پوشه صدا نزنه و از داخل پوشه خودش بخونه ، مثلا برنامه به کتابخانه فلان نسخه ۵ نیاز داره ، پس dll نسخه ۵ش رو توی پوشه خودش داره ، و اینطوری در زمان اجرا میتونه بدون مشکل و وابستگی دیگه ای اجرا بشه ، ۵- این هم درسته ؟
بله این هم درسته.
توی گنو/لینوکس هم چنین کاری ممکنه. میتونید با تغییر متغیر محیطی LD_LIBRARY_PATH، جایی که دنبال کتابخانههای مورد نیاز گشته میشه رو تغییر بدید.
برنامههایی که به صورت پویا (dynamic) برای گنو/لینوکس کامپایل شدند، موقع اجرا، یه interupter رو صدا میزنند تا کتابخانههای مورد نیاز رو براش پیدا و اجرا کنه.
این interupter معمولا ld هست. بسته به اینکه برنامه ۳۲ بیتی هست یا ۶۴ بیتی، ممکنه نسخههای مختلفی از ld فراخوانی بشه.
ld اول cache ها، پیکربندیهای خودش و متغیر LD_LIBRARY_PATH رو میخونه و بعد سعی میکنه کتابخانههایی که درخواست شده رو پیدا کنه.
البته اگه قراره برنامه با دسترسی روت اجرا بشه، متغیر LD_LIBRARY_PATH نادیده گرفته میشه. دلیلش اینه که ممکنه این متغیر منجر به انتخاب یه کتابخانه آلوده بشه و اون کتابخانه هم قراره با دسترسی روت اجرا بشه.
در واقعیت، وادار کردن ld به استفاده از کتابخانههای آلوده، یه راه برای نفوذ هست. این وادار کردن ممکنه از طریق تغییر پیکربندیهای ld، تغییر cache های اون و یا متغیر LD_LIBRARY_PATH باشه.
۶- این قابلیت ویندوز اسم خاصی داره ؟
تا جایی که میدونم، نه.
۷- چنین چیزی در گنو/لینوکس داریم ؟ نداریم ؟ چرا ؟
همون snap و appimage و flatpack که بالاتر معرفی کردند.
نحوه کار اونها اینجوریه که همه وابستگیهای یه برنامه، داخل خود بسته/فایل قرار داره.
این وابستگیها توی دایرکتوریهای اصلی سیستم قرار نمیگرین. در اصل فقط خود برنامه به اونها دسترسی داره.
برنامه هم دسترسی کمتری به سیستم داره. در واقعیت snap و appimage و flatpack یه جور container هستند.
snap و flatpack یه سری چیز توی پس زمینه سیستم اجرا میکنند تا درست کار بدند.
appimage ها فقط یه فایل هستند که دسترسی اجرایی بهشون میدید و اجراشون میکنید. همین. کار زیادی برای اجراشون لازم نیست.
دقت کنید appimage ها با برنامههای معمولی کامپایل شده به صورت static فرق دارند. appimage ها توی یه محیط نسبتا جدا از بقیه سیستم اجرا میشن در حالی که برنامههای static مثل همون برنامههای dynamic هستند و فقط کتابخانههای مورد نیازشون داخل خود فایل اجرایی قرار داره. توی چیزی شبیه container اجرا نمیشن.
پس با هرکدومشون میتونم مثلا فایرفاکس نسخه ۱۰۱ رو روی مثلا اوبونتو ۱۲.۰۴ اجرا کنم ؟
اول باید ببینید snap یا flatpack نصب میشن یا نه. خود اونها از کتابخانههای اشتراکی استفاده میکنند و ممکنه نسخه کتابخانه مورد نیاز اونها توی اوبونتو ۱۲.۰۴ موجود نباشه.
appimage ها فقط یه فایل هستند که دسترسی اجرایی بهشون میدید و اجراشون میکنید، همین. فکر نکنم اونها خیلی به نسخه کتابخانههای سیستم کاری داشته باشند، مطمئن نیستم.
در appimage ها سازگاری با تم شخصی دسکتاپ موجود نیست ؟
از اونجایی که برنامه توی یه فضای جدا اجرا میشه، ممکنه با تم میزکار هماهنگ نشه. در مورد بستههای snap و flatpack هم این قضیه تا حدودی صادقه. یعنی اونها هم ممکنه با تم سیستم هماهنگ نشن.