ทำไมถึงมี `/ lib` และ` / lib64 'แต่มีเพียง `/ bin'?


27

ในแล็ปท็อปของฉัน:

$ cat /etc/issue  
Ubuntu 18.04 LTS \n \l

มีสองโฟลเดอร์ที่แตกต่างกันสำหรับไลบรารีx86และx86_64:

~$ ls -1 /  
bin
lib
lib64
sbin
...

ทำไมไบนารีจึงมีเพียงไดเรกทอรีเดียว?

ป.ล. ฉันสนใจ Android ด้วย แต่ฉันหวังว่าคำตอบนั้นควรเหมือนกัน


1
หนึ่งเดียว ฉันเห็นทั้งสอง/binและ/sbinมี คำถามคืออะไร? คุณถามถึงความแตกต่างระหว่าง/libและ/lib64?
Kusalananda

2
@ Kusalananda ฉันหมายถึงไม่มีโฟลเดอร์อิสระสำหรับx86_64(ไม่ใช่สำหรับ/binไม่มี/sbin)
Gluttton

7
IMO OP /bin64ต้องการที่จะรู้ว่าทำไมไม่มี
Arkadiusz Drabczyk

แอปพลิเคชั่นโดยประมาณหนึ่งตัวที่ได้รับประโยชน์จากการมีทั้งรุ่น 32 บิตและ 64 บิต (WINE) จะได้รับประโยชน์โดยมีไบนารีที่ต่างกัน ( wine*32และwine*64)
Ignacio Vazquez-Abrams

1
@ IgnacioVazquez-Abrams: ต้องบอกว่าคุณเชื่อมโยงไบนารีกับห้องสมุดไม่ใช่ในทางกลับกัน ดังนั้นไบนารีไม่จำเป็นต้องถูกแบ่งพาร์ติชันด้วย 32/64-bitness
smci

คำตอบ:


25

ก่อนทำไมมีแยก/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หรือlddwrapper:

$ 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 ไม่มีการทุบตี (โดยค่าเริ่มต้นแน่นอนคุณสามารถรวบรวมและปรับใช้ด้วยตนเอง) และโครงสร้างไดเรกทอรี แตกต่างอย่างสิ้นเชิง


ls -lตัวอย่างของคุณไม่ได้เป็นสิ่งที่เลวร้าย สิ่งที่จะเป็นประโยชน์คือผลลัพธ์ของls -l /lib /lib64ซึ่งอาจแสดงให้เห็นว่า/libตัวเองเป็น symlink
chrylis -on strike-

คุณหมายถึงls -ldและ/libไม่ใช่ไม่ใช่ symlink ในSlackware 14.2ระบบของฉัน
Arkadiusz Drabczyk

ไลบรารีมี md5sums: dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6, 987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6.
Arkadiusz Drabczyk

2
ในกรณีดังกล่าวการแสดง symlink ในไดเรกทอรีจะไม่เชื่อมต่อกับการอ้างอิง
chrylis -on strike-

1
LD_TRACE_LOADED_OBJECTS = 1 ล้าสมัยเนื่องจากช่องโหว่ความปลอดภัยและ ldd ไม่ได้ใช้อีกต่อไป เหตุผล: ldd / path / to / static-static-binary ถูกใช้เพื่อรับช่วงระบบเนื่องจาก sysadmins คาดว่า ldd จะดูเฉพาะไบนารีที่ไม่ได้รัน นอกจากนี้การตรวจสอบสแตติกหรือไม่ไม่เพียงพอเนื่องจากไบนารีสามารถสร้างขึ้นเพื่อใช้ตัวโหลดที่เป็นอันตรายแทน
Joshua

22

เหตุผลคือไดเร็กทอรี lib / lib64 สามารถมีไฟล์ที่มีชื่อเหมือนกันเพราะเป็นไลบรารีที่แบ่งใช้กับโปรแกรมที่หลากหลาย วางพวกเขาในไดเรกทอรีแยกกันแก้ข้อขัดแย้ง มี (โดยปกติ ... ) ไม่มีเหตุผลที่ดีสำหรับการแจกจ่ายโปรแกรมปฏิบัติการที่มีชื่อเหมือนกันบนระบบเดียวกันซึ่งเป็น 32/64 บิต แต่เนื่องจากอาจมีการผสมผสานของโปรแกรมปฏิบัติการต่างๆดังนั้นจึงต้องมีการแชร์ไลบรารีให้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.