Đầu tiên, tại sao có riêng biệt /lib
và /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
và /lib64
tồ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
và /lib64
danh bạ cho 32-bit và 64-bit thư viện tương ứng mặc dù
/lib
khô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.6
thư viện trong /lib
và /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 ldd
trì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 /lib
và 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
và /bin64
là 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 /bin64
trướ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
và /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.
/bin
và/sbin
ở đó. Câu hỏi là gì? Bạn đang hỏi về sự khác biệt giữa/lib
và/lib64
?