ก่อนทำไมมีแยก/lib
และ/lib64
:
ระบบแฟ้มลำดับชั้นมาตรฐาน
กล่าวว่าแยกต่างหาก/lib
และ/lib64
อยู่เพราะ:
10.1 อาจมีตัวแปรหนึ่งตัวหรือมากกว่าของไดเร็กทอรี / lib บนระบบที่สนับสนุนรูปแบบไบนารีมากกว่าหนึ่งรูปแบบที่ต้องการไลบรารีแยกต่างหาก (... ) วิธีนี้ใช้สำหรับการสนับสนุน 64- บิตหรือ 32- บิตบนระบบที่รองรับรูปแบบไบนารี่หลายรูปแบบ แต่ต้องการไลบรารีที่มีชื่อเดียวกัน ในกรณีนี้ / lib32 และ / lib64 อาจเป็นไดเรกทอรีไลบรารีและ / lib เป็น symlink หนึ่งในนั้น
ใน Slackware 14.2 ของฉันมี/lib
และ/lib64
ไดเรกทอรีสำหรับไลบรารี 32- บิตและ 64- บิตตามลำดับแม้ว่า
/lib
จะไม่ได้เป็น symlink ตามที่ข้อมูลโค้ด FHS แนะนำ:
$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib/libc.so.6 -> libc-2.23.so
$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib64/libc.so.6 -> libc-2.23.so
มีสองเป็นlibc.so.6
ห้องสมุดในและ/lib
/lib64
แต่ละเอลฟ์ไบนารีที่สร้างขึ้นแบบไดนามิก
มีเส้นทางฮาร์ดโค้ดไปที่ล่ามในกรณีนี้อย่างใดอย่างหนึ่ง
/lib/ld-linux.so.2
หรือ/lib64/ld-linux-x86-64.so.2
:
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
$ readelf -a main | grep 'Requesting program interpreter'
[Requesting program interpreter: /lib/ld-linux.so.2]
$ file ./main64
./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ readelf -a main64 | grep 'Requesting program interpreter'
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
งานของล่ามคือการโหลดไลบรารีที่ใช้ร่วมกันที่จำเป็น คุณสามารถถามล่าม GNU ว่าจะโหลดไลบรารีใดโดยไม่ต้องใช้ไบนารีโดยใช้LD_TRACE_LOADED_OBJECTS=1
หรือldd
wrapper:
$ LD_TRACE_LOADED_OBJECTS=1 ./main
linux-gate.so.1 (0xf77a9000)
libc.so.6 => /lib/libc.so.6 (0xf760e000)
/lib/ld-linux.so.2 (0xf77aa000)
$ LD_TRACE_LOADED_OBJECTS=1 ./main64
linux-vdso.so.1 (0x00007ffd535b3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f568347c000)
ในขณะที่คุณสามารถเห็นล่ามที่กำหนดจะรู้ว่าจะหาไลบรารี่ได้ที่ไหน - เวอร์ชั่น 32 บิตค้นหาไลบรารี่ใน/lib
และ 64- บิตมองหา/lib64
ไลบรารี่ใน
มาตรฐาน FHS บอกเกี่ยวกับสิ่งต่อไปนี้/bin
:
/ bin มีคำสั่งที่อาจใช้โดยทั้งผู้ดูแลระบบและผู้ใช้ แต่จำเป็นต้องใช้เมื่อไม่มีการติดตั้งระบบไฟล์อื่น (เช่นในโหมดผู้ใช้คนเดียว) มันอาจมีคำสั่งที่ใช้งานโดยอ้อมโดยสคริปต์
IMO เหตุผลที่ว่าทำไมไม่มีการแยกจากกัน/bin
และ/bin64
ก็คือว่าถ้าเรามีไฟล์ที่มีชื่อเดียวกันทั้งในไดเรกทอรีเหล่านี้เราไม่สามารถเรียกหนึ่งของพวกเขาทางอ้อมเพราะเราจะต้องใส่/bin
หรือเป็นครั้งแรกใน/bin64
$PATH
แต่แจ้งให้ทราบว่าข้างต้นเป็นเพียงการประชุม - ลินุกซ์เคอร์เนลไม่สนใจจริงๆถ้าคุณมีแยกต่างหากและ/bin
/bin64
หากคุณต้องการคุณสามารถสร้างและติดตั้งระบบของคุณได้
คุณยังกล่าวถึง Android - โปรดทราบว่ายกเว้นการใช้เคอร์เนล Linux ที่แก้ไขแล้วมันไม่มีส่วนเกี่ยวข้องกับระบบ GNU เช่น Ubuntu - ไม่มี glibc ไม่มีการทุบตี (โดยค่าเริ่มต้นแน่นอนคุณสามารถรวบรวมและปรับใช้ด้วยตนเอง) และโครงสร้างไดเรกทอรี แตกต่างอย่างสิ้นเชิง
/bin
และ/sbin
มี คำถามคืออะไร? คุณถามถึงความแตกต่างระหว่าง/lib
และ/lib64
?