با قسمت دوازدهم از دوره ورود به دنیای امبدد لینوکس که دوره مقدماتی آموزش امبدد لینوکس می باشد همراه ما باشید.
در قسمت قبل به بررسی busybox که یکی از بخشهای سیستم فایل بود پرداختیم، در این قسمت به بررسی کتابخانه های فایل سیستم میپردازیم.
کتابخانههای مورد نیاز در روت
یه راه ساده این هست که هر فایلی با پسوند so. توی sysroot تولچین هست رو بریزیم توی روتمون، خیلی خوب و شیک و مجلسی هست بهشرط اینکه محدودیت فضا نداشته باشیم. یه راه دیگهش هم این هست که ببینیم برنامههایی که داریم و میخوایم اجرا بشن به چه کتابخانههایی نیاز دارن همونها رو بریزیم.
با این دوتا دستور میتوینم بفهمیم برنامهمون چیا رو لازم داره:
1 2 3 4 5 6 7 8 9 10 11 | cd ~/EmbeddedLinux/RPI3BP/sysapps/busybox aarch64-linux-gnu-readelf -a ./busybox | grep "program interpreter" [Requesting program interpreter: /lib/ld-linux-aarch64.so.1] aarch64-linux-gnu-readelf -a ./busybox | grep "Shared library" 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libresolv.so.2] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] |
sysroot تولچین ما کجاست؟ کیا یادشون هست؟
اگه یادتون رفته با این دستور آدرسش رو باز میگیریم:
1 2 | $GCC -print-sysroot /home/at00/EmbeddedLinux/RPI3BP/build-tools/at00toolchain/bin/../aarch64-linux-gnu/libc |
حالا من این دستور رو اجرا میکنم تا ببینم چه کتابخانههایی داریم:
1 | ls -l $($GCC -print-sysroot)/lib |
همینطور که توی تصویر میبینید خیلی از کتابخانهها در حقیقت یه لینک هستن به کتابخانه اصلی.
برای راحتی کار من یه متغیر رو به shell اضافه میکنم و کتابخانههایی که باید رو کپی میکنم داخل روت خودم:
1 2 | cd ~/EmbeddedLinux/RPI3BP/rootfs/ export SYSROOT=$($GCC -print-sysroot) |
حالا تک تک چیزهایی که میخوایم رو همراه با لینکهاشون کپی میکنیم توی روتمون:
1 2 3 4 5 6 7 8 9 10 11 12 | cp -a $SYSROOT/lib/ld-linux-aarch64.so.1 ./lib cp -a $SYSROOT/lib/ld-2.25.so ./lib cp -a $SYSROOT/lib/libm.so.6 ./lib cp -a $SYSROOT/lib/libm-2.25.so ./lib cp -a $SYSROOT/lib/libresolv.so.2 ./lib cp -a $SYSROOT/lib/libresolv-2.25.so ./lib cp -a $SYSROOT/lib/libc.so.6 ./lib cp -a $SYSROOT/lib/libc-2.25.so ./lib |
میتونید این کار رو برای تمام برنامههاتون تکرار کنید! شاید بگید آدم پیر میشه، چه کاریه همه رو بریزیم کلش مگه چند مگ هست اصلا؟
حق با شماست الان که ما چند گیگ حافظهداریم منطقی نیست این کار، ولی اگه کل حافظه ما یک فلش ۱۶ مگابایتی باشه اون وقت چی؟
البته این کار یه ریسک هم داره ممکنه بعضی از کتابخانهها رو از قلم بندازیم بعداً موقع اجرا به مشکل بربخوریم.
کاهش حجم کتابخانهها
وقتایی که با محدودیت فضا مواجه هستیم میشه کتابخانهها روباز کمترشون کرد.
بهجز کارهایی که توی فصل تولچین گفتیم، میتونید درنهایت با استفاده از strip اطلاعات اضافی رو پاککنید و کتابخانه رو کمحجمتر کنید:
1 2 3 4 | aarch64-linux-gnu-strip ./lib/ld-2.25.so aarch64-linux-gnu-strip ./lib/libc-2.25.so aarch64-linux-gnu-strip ./lib/libm-2.25.so aarch64-linux-gnu-strip ./lib/libresolv-2.25.so |
با این کار حجم کتابخانهها از حدود ۳۰ مگابایت به ۲ مگابایت رسید!
هشدار! همه برنامهها رو استریپ نکنید مخصوصاً ماژولهای کرنل رو!
در این قسمت کتابخانه های فایل سیستم را یاد گرفتیم و در ادامه (قسمت بعدی) قرار است ساختن initramfs را آموزش بدهیم.
درود و سپاس
مشتاقانه منتظریم بزرگوار
🙏🙏🙏🙏
سلام وقتتون بخیر
ممنون از همراهی شما