Tại sao /lib/libc.so.6 bị thiếu?


20
find | grep libc.so.6

tiết lộ rằng nó nằm trong /lib/i386-linux-gnu/libc.so.6, nhưng một kịch bản mà tôi đang chạy dự kiến ​​sẽ được đặt trực tiếp /lib, vậy tại sao không có ít nhất một liên kết tượng trưng?

Tôi có nguy cơ phá vỡ bất cứ điều gì nếu tôi đặt một liên kết tượng trưng ở đó?

Câu trả lời:


22

libc.sođã được chuyển đi như một phần của công việc multiarch trong Ubuntu 11.04. Lý do không thể có một liên kết tượng trưng là vì mục đích của multiarch là để có thể cài đặt cả phiên bản i386amd64phiên bản libccùng một lúc để bạn có thể chạy nhị phân 32 bit dễ dàng hơn trên các hệ thống 64 bit và ngược lại (và các tình huống tương tự khác). Nếu libc6gói chứa một liên kết tượng trưng đến vị trí mới, thì các phiên bản của gói đó cho các kiến ​​trúc khác nhau sẽ không thể cài đặt cùng một lúc (phiên bản nào của liên kết tượng trưng sẽ dpkgchọn?), Đánh bại toàn bộ điểm của bài tập.

Bất cứ điều gì mã hóa đường dẫn libc.sophải được cập nhật để hoạt động chính xác từ Ubuntu 11.04 trở đi. Nếu đoạn script bạn đang nói là một phần của Ubuntu, vui lòng báo cáo lỗi về nó và thêm multiarchthẻ.


1
Câu trả lời hay, đã học được điều gì đó mới hôm nay (một lần nữa) :)
Lekensteyn

1
Bộ xử lý tôi đang sử dụng thậm chí không hỗ trợ các hướng dẫn 64 bit. Bạn có nói rằng có bất kỳ rủi ro nào liên quan đến việc thêm thủ công symlink không? Không chắc chắn tôi cần phải làm điều đó, nhưng nếu. Dù sao, đây dường như là câu trả lời chính xác. Cảm ơn.
Erik B

@Erik B: gì? Bạn đang nói với tôi rằng bạn đang cố gắng sử dụng ứng dụng 64 trên bộ xử lý 32 bit? Điều đó chắc chắn sẽ không đi làm. Ứng dụng 32 bit hoạt động tốt trên bộ xử lý 64 bit, nhưng ngược lại.
Lekensteyn

@Lekensteyn đó chắc chắn không phải là điều tôi đang nói. Điều tôi đang nói là tôi không sử dụng thư viện 64 bit. Vì vậy, trên hệ thống cụ thể của tôi sẽ không có bất kỳ sự nhầm lẫn nào về việc /lib/libc.so.6thư viện 32 hay 64 bit.
Erik B

3
Nếu bạn sẽ không bao giờ sử dụng các gói 64 bit, tôi nghi ngờ có bất kỳ rủi ro đáng kể nào khi thêm liên kết tượng trưng, ​​không.
Colin Watson

10

Các thư viện động được tải bởi kernel, các đường dẫn không được mã hóa cứng trong một chương trình. Một chương trình chỉ nói "Tôi cần libc.so.6". Hệ thống sau đó tìm kiếm trong các đường dẫn thư viện như được định nghĩa trong /etc/ld.so.conf, bao gồm /usr/lib/libtheo mặc định. Tập tin này bao gồm các tập tin cấu hình bổ sung trong /etc/ld.so.conf.d.

Trên hệ thống 64 bit của tôi, libc.so.6có thể được tìm thấy /lib/x86_64-linux-gnu/libc.so.6do đường dẫn được xác định trong /etc/ld.so.conf.d/x86_64-linux-gnu.conf:

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Để tìm hiểu thư viện nào được tải bởi một chương trình, sử dụng lddnhư trong ldd /bin/bash:

    linux-vdso.so.1 =>  (0x00007ffff1dff000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00007f9d8b3b8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d8b1b4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d8ae1f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d8b61c000)

Đặt symlink sẽ không phá vỡ bất cứ điều gì.

Để có danh sách các thư mục được tìm kiếm, hãy chạy:

ldconfig -v -N | grep '^/'

-vlàm cho một danh sách các tập tin + thư mục được hiển thị, -Nngăn bộ đệm ( /etc/ld.so.cache) được tạo lại.


Đặt liên kết tượng trưng sẽ không phá vỡ bất cứ điều gì, nhưng nó thực sự sẽ không làm gì tốt, phải không?
Erik B

@Erik B: bạn đang đề cập đến chương trình / kịch bản nào? Tôi có thể hiểu rằng một tập lệnh bị nhầm lẫn vì đường dẫn được mã hóa cứng. Nhưng một chương trình không phải biết đường dẫn.
Lekensteyn

nó vận hành như vậy sao? Tôi dường như có vấn đề đôi khi các chương trình không thể tìm thấy các thư viện được cài đặt /usr/local/lib, nhưng chúng hoạt động tốt nếu tôi tạo một liên kết tượng trưng từ đó /usr/lib. Điều gì gây ra hành vi này?
crazy2be

@ crazy2be: bạn có thể đăng đầu ra của ldconfig -v -N | grep '^/'?
Lekensteyn

@Lekensteyn: Chắc chắn: pastebin.com/dtfnw2Tv . Tuy nhiên, điều đó đã xảy ra với một số chương trình trên hầu hết mọi hệ thống tôi đã sử dụng, vì vậy tôi cho rằng nó không liên quan đến cấu hình hệ thống.
crazy2be

5

Chỉ cần thêm symlink vào tệp libc.so.6 như sau:

sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/libc.so.6

Điều tương tự cũng xảy ra với các tệp bị thiếu khác vẫn còn trên hệ thống, trong trường hợp của tôi, Matlab bị thiếu tệp, vấn đề đã biến mất ngay bây giờ.

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.