Thứ tự mà trình liên kết động của Linux tìm kiếm đường dẫn là gì?


11

Đây không phải là một bản sao bởi vì điều này là đối phó với một đặc thù tôi nhận thấy khi tôi sử dụng /etc/ld.so.conf.

Để có được các đường dẫn mà trình liên kết động tìm kiếm trong các thư viện, tôi chạy lệnh ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Khi /etc/ld.so.confkhông có đường dẫn được liệt kê trong đó. Đầu ra từ lệnh trước là

/lib
/usr/lib

Tôi đoán rằng nó tìm kiếm /libđầu tiên và sau đó /usr/lib. Khi tôi thêm một đường dẫn mới, chẳng hạn như /usr/local/lib, /etc/ld.so.confsau đó làm lại /etc/ld.so.cache, đầu ra từ ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"trở thành

/usr/local/lib
/lib
/usr/lib

Tôi thấy điều này lạ bởi vì nếu tôi đúng rằng thứ tự mà các thư mục được liệt kê được tìm kiếm là từ trên xuống dưới, thì các thư mục bổ sung được tìm kiếm trước /lib/usr/lib. Rằng các thư mục bổ sung được tìm kiếm trước các thư mục đáng tin cậy không phải là lạ, nhưng khi /libđược tìm kiếm trước đó /usr/lib, điều đó thật lạ vì /bin& /sbinđược tìm kiếm sau /usr/bin& /usr/sbinin PATH.

Ngay cả khi các đường dẫn được liệt kê bởi ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"được tìm kiếm từ dưới lên trên, nó vẫn sẽ là một thứ tự sai lệch bởi vì các thư mục bổ sung sẽ được tìm kiếm sau những người đáng tin cậy trong khi /libsẽ được tìm kiếm sau /usr/lib.

Vì vậy, thứ tự ld.sotìm kiếm đường dẫn cho các thư viện là gì? Tại sao được /libtìm kiếm trước /usr/lib? Nếu không, tại sao các thư mục bổ sung được tìm kiếm sau /lib?

Câu trả lời:


13

Thứ tự được ghi lại trong hướng dẫn của trình liên kết động, đó là ld.so. Nó là:

  1. thư mục từ LD_LIBRARY_PATH;
  2. thư mục từ /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Tôi đang đơn giản hóa một chút, xem hướng dẫn để biết chi tiết đầy đủ.)

Thứ tự có ý nghĩa khi bạn cho rằng đó là cách duy nhất để ghi đè thư viện ở vị trí mặc định bằng thư viện tùy chỉnh. LD_LIBRARY_PATHlà một thiết lập người dùng, nó phải đến trước những người khác. /etc/ld.so.conflà một thiết lập cục bộ, nó xuất hiện trước mặc định của hệ điều hành. Vì vậy, với tư cách là người dùng, nếu tôi muốn chạy một chương trình với một phiên bản khác của thư viện, tôi có thể chạy chương trình có LD_LIBRARY_PATHchứa vị trí của phiên bản thư viện khác. Và như một quản trị viên, tôi có thể đặt một phiên bản khác của thư viện trong /usr/local/libvà danh sách /usr/local/libtrong /etc/ld.so.conf.

Niềm tin không tham gia vào điều này. Bất kỳ thư mục được liệt kê trên đường dẫn tìm kiếm này đều phải được tin cậy, bởi vì bất kỳ thư viện nào cũng có thể được tải từ đó. Về lý thuyết, bạn có thể liệt kê các tên thư viện được sử dụng bởi tất cả các chương trình mà đòi hỏi sự tin cậy nhiều hơn trên hệ thống của bạn và đảm bảo rằng tất cả các thư viện này đều có trong các thư mục tin cậy nhất của Nether, và sau đó các thư mục ít tin cậy nhất của Nott sẽ không được sử dụng nếu chúng xuất hiện sau các thư mục đáng tin cậy hơn trên đường dẫn tìm kiếm, ngoại trừ các chương trình mà Yêu cầu ít tin cậy hơn. Nhưng điều đó sẽ vô cùng mong manh. Nó cũng sẽ là vô nghĩa: nếu kẻ tấn công có thể tiêm một giá trị LD_LIBRARY_PATHhoặc một phần tử của /etc/ld.so.conf, chúng chắc chắn có một lộ trình trực tiếp hơn để thực thi mã tùy ý, chẳng hạn như tiêm một giá trị PATH,LD_PRELOAD, v.v. Tin tưởng vào đường dẫn tải thư viện không thành vấn đề khi thực thi vượt qua ranh giới tin cậy, tức là khi chạy chương trình với các đặc quyền bổ sung (ví dụ: chương trình setuid / setgid hoặc thông qua sudo). Những gì xảy ra trong trường hợp này LD_LIBRARY_PATHlà khoảng trống.

Đối với /libvs /usr/lib, điều đó không quan trọng lắm: chúng được cung cấp bởi cùng một thực thể (hệ điều hành) và không nên có một thư viện hiện diện trong cả hai. Việc liệt kê /libđầu tiên là hợp lý vì nó mang lại lợi thế về hiệu suất (rất nhỏ): các thư viện thường được sử dụng nhất, đặc biệt là các thư viện được sử dụng bởi các chương trình cơ bản nhỏ (trong đó thời gian tải là một phần cao hơn của tổng thời gian chạy so với lớn, dài chương trình tuyệt vời), được đặt tại /lib.


Nếu nhiều thư mục được liệt kê trong LD_LIBRARY_PATH, chúng được tìm kiếm theo thứ tự nào?
argentum2f

@ argentum2f Từ trái sang phải, giống như PATH.
Gilles 'SO- ngừng trở nên xấu xa'
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.