Tại sao có `/ lib` và` / lib64` mà chỉ có` ​​/ bin`?


27

Trong máy tính xách tay của tôi:

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

Có hai thư mục khác nhau cho các thư viện x86x86_64:

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

Tại sao cho nhị phân chỉ tồn tại một thư mục?

PS Tôi cũng quan tâm đến Android nhưng tôi hy vọng câu trả lời đó sẽ giống nhau.


1
Chỉ trong một? Tôi thấy cả hai /bin/sbinở đó. Câu hỏi là gì? Bạn đang hỏi về sự khác biệt giữa /lib/lib64?
Kusalananda

2
@Kusalananda, ý tôi là không có thư mục độc lập cho x86_64(không cho /binkhông cho /sbin).
Gluttton

7
IMO OP muốn biết tại sao không có /bin64.
Arkadiusz Drabchot

Ứng dụng xấp xỉ một ứng dụng có lợi từ việc có cả phiên bản 32 bit và 64 bit (WINE) xung quanh nó bằng cách có các nhị phân có tên khác nhau (wine*32wine*64).
Ignacio Vazquez-Abrams

1
@ IgnacioVazquez-Abrams: cũng cần phải nói rằng bạn liên kết nhị phân với các thư viện, chứ không phải ngược lại. Vì vậy, các nhị phân không cần phải được phân vùng theo 32/64-bit.
smci

Câu trả lời:


25

Đầu tiên, tại sao có riêng biệt /lib/lib64:

Các hệ thống tập tin tiêu chuẩn cấp bậc nói rằng riêng biệt /lib/lib64tồn tại bởi vì:

10.1. Có thể có một hoặc nhiều biến thể của thư mục / lib trên các hệ thống hỗ trợ nhiều định dạng nhị phân yêu cầu các thư viện riêng biệt. (...) Điều này thường được sử dụng để hỗ trợ 64 bit hoặc 32 bit trên các hệ thống hỗ trợ nhiều định dạng nhị phân, nhưng yêu cầu các thư viện cùng tên. Trong trường hợp này, / lib32 và / lib64 có thể là các thư mục thư viện và / lib một liên kết tượng trưng đến một trong số chúng.

Trên Slackware tôi 14,2 ví dụ có /lib/lib64 danh bạ cho 32-bit và 64-bit thư viện tương ứng mặc dù /libkhông phải là một liên kết tượng trưng như đảm bảo VSATTP đoạn mã sẽ đề nghị:

$ 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

Có hai libc.so.6thư viện trong /lib/lib64.

Mỗi nhị phân ELF được xây dựng động chứa một đường dẫn được mã hóa cứng tới trình thông dịch, trong trường hợp này hoặc là /lib/ld-linux.so.2 hoặc /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]

Công việc của trình thông dịch là tải các thư viện chia sẻ cần thiết. Bạn có thể hỏi một trình thông dịch GNU những thư viện nào nó sẽ tải mà không cần chạy nhị phân bằng cách sử dụngLD_TRACE_LOADED_OBJECTS=1 hoặc lddtrình bao bọc:

$ 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)

Như bạn có thể thấy một trình thông dịch đã cho biết chính xác nơi cần tìm thư viện - phiên bản 32 bit tìm thư viện trong /libvà phiên bản 64 bit tìm thư viện trong /lib64.

Tiêu chuẩn FHS cho biết như sau về /bin :

/ bin chứa các lệnh có thể được sử dụng bởi cả người quản trị hệ thống và người dùng, nhưng được yêu cầu khi không có hệ thống tệp nào khác được gắn kết (ví dụ: trong chế độ người dùng đơn). Nó cũng có thể chứa các lệnh được sử dụng gián tiếp bởi các tập lệnh.

IMO lý do tại sao không có riêng biệt /bin/bin64là nếu chúng ta có tệp có cùng tên trong cả hai thư mục này, chúng ta không thể gọi một trong số chúng một cách gián tiếp vì chúng ta phải đặt/bin hoặc nhập /bin64trước $PATH.

Tuy nhiên, lưu ý rằng ở trên chỉ là quy ước - nhân Linux không thực sự quan tâm nếu bạn tách riêng /bin/bin64. Nếu bạn muốn chúng, bạn có thể tạo chúng và thiết lập hệ thống của bạn phù hợp.

Bạn cũng đã đề cập đến Android - lưu ý rằng ngoại trừ việc chạy kernel Linux đã sửa đổi, nó không liên quan gì đến các hệ thống GNU như Ubuntu - không glibc, không bash (theo mặc định, tất nhiên bạn có thể biên dịch và triển khai thủ công), và cả cấu trúc thư mục là hoàn toàn khác nhau.


ls -lVí dụ của bạn không đặc biệt là đức. Những gì sẽ hữu ích là đầu ra của ls -l /lib /lib64, mà có lẽ cho thấy rằng /libchính nó là một liên kết tượng trưng.
chrylis -on đình công-

Ý bạn là ls -ld, và không, /libkhông phải là một liên kết tượng trưng trên Slackware 14.2hệ thống của tôi .
Arkadiusz Drabchot

Thư viện có md5sums khác nhau: dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6, 987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6.
Arkadiusz Drabchot

2
Trong trường hợp đó, hiển thị các liên kết tượng trưng trong thư mục không kết nối với trích dẫn.
chrylis -on đình công-

1
LD_TRACE_LOADED_OBJECTS = 1 đã lỗi thời do lỗ hổng bảo mật và ldd không sử dụng nó nữa. Lý do: ldd / path / to / tox-static-binary được sử dụng để tiếp quản các hệ thống vì các hệ thống quản trị hệ thống đang mong đợi ldd chỉ nhìn vào nhị phân không chạy nó. Ngoài ra, việc kiểm tra tĩnh hay không là không thỏa đáng vì nhị phân có thể được xây dựng để sử dụng trình tải độc hại thay thế.
Joshua

22

Lý do là các thư mục lib / lib64 có thể chứa các tệp có cùng tên vì đó là các thư viện được chia sẻ với các chương trình khác nhau. Đặt chúng trong các thư mục riêng biệt giải quyết xung đột. Không có lý do chính đáng để phân phối các tệp thực thi cùng tên trên cùng một hệ thống là 32/64-bit, nhưng vì có thể có một hỗn hợp các tệp thực thi, nên các thư viện dùng chung phải được cung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.