Tại sao các thư viện chia sẻ trên Linux có thể thực thi được?


8

Tôi chỉ tò mò thôi.

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'

Mọi thứ dường như hoạt động tốt chỉ với + r. Tôi nhận thấy rằng hầu hết các .so trong / usr / lib đều có + x set ...

Tại sao các lib được chia sẻ được cho là có tập bit thực thi? Điều gì có thể xảy ra nếu tôi không đặt nó?


2
Thư viện chắc chắn không cần + x để chạy đúng. Có lẽ họ liên kết tuy nhiên? Liên kết sẽ cần + x để được theo dõi.
Chris S

Có, họ không cần + x, nhưng hầu hết các thư viện đã đặt.
Tomo

Câu hỏi này cũng đã được hỏi trên Unix & Linux: unix.stackexchange.com/questions/40587/ mẹo (và đã có câu trả lời đúng ở đó)
Michał Górny

Câu trả lời:


3

Trên thực tế nó phụ thuộc vào việc lddthực hiện. lddthường là một tập lệnh, bạn có thể chỉnh sửa nó để xem lỗi đó ở đâu và tại sao bạn gặp phải lỗi đó.

Trên Ubuntu 10.04, chỉ lddkiểm tra readquyền. Nó có thể đưa ra lỗi không phải là tệp thực thi động nếu tệp không phải là ELF ( Định dạng có thể thực thi và có thể liên kết ). Các lib ở đây là tất cả -rw-r--r--, ví dụ

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

Sẽ không gây sốc khi muốn có xquyền truy cập vào thư viện dùng chung. Các executablechế độ là một quy ước đó cung cấp cho các hệ điều hành khác mức độ kiểm soát quyền truy cập. Trình tải thực thi kiểm soát truy cập đó, để đảm bảo người dùng có thể thực thi nó, nhưng cũng để ngăn ngừa lỗi (một số tập lệnh hoặc chương trình không nên được thực thi bởi một số người).

Điều này có thể được mở rộng đến các thư viện dùng chung vì lý do tương tự - nhưng các thư viện dùng chung không thể tự chạy và ít bị lỗi do sử dụng do tai nạn ). Do đó, nhu cầu ít rõ ràng hơn ( rquyền truy cập đủ).


3

Bạn thực sự có thể thực thi rất nhiều thư viện, xem ví dụ điều gì xảy ra khi bạn nhập /lib/libc.so.6shell của mình trên hệ thống GNU / Linux gần đây.


0

nghĩ như có một tập tin thực thi với -x. Bạn sẽ không thể thực hiện nó. Hãy xem các thư viện này là một tập hợp các hàm chung, đang được gọi bởi một chương trình khác (giả sử myProgra). Nếu bạn không thể thực thi các thư viện / hàm ... thì bạn không có gì

Một ví dụ

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

Bây giờ nếu bạn đặt function1 và function2 trong một tệp khác và bạn bao gồm nó, thì bạn là một thư viện. (Tất nhiên đó là một cái gì đó phức tạp hơn. Đây chỉ là một ví dụ)

Nhưng trong mọi trường hợp, như bạn có thể thấy, bạn phải thực thi mã đang được đưa vào thư viện


Nhưng bạn thực thi thực thi, không phải thư viện.
Ignacio Vazquez-Abrams

Xem phiên bản chỉnh sửa ở trên
Nikolaidis Fotis

0

Chìa khóa là định dạng tệp, Định dạng thực thi và Liên kết. Vì cùng một định dạng tệp chính xác được sử dụng để xác định cả thư viện thực thi và thư viện dùng chung, cả hai phải có quyền thực thi phù hợp cho trình tải hệ điều hành. Điều này cho phép một trình tải đơn và cho các tệp thực thi được sử dụng làm DSO nếu chúng bao gồm bảng ký hiệu.


Vì vậy, trình tải sử dụng các bit cho phép, không phải tiêu đề tệp, để xác định những thứ cần tải?
Tomo

Trình tải sử dụng tiêu đề tệp để xác định nội dung là DYN hoặc EXEC và thực hiện điều thích hợp. Bit thực thi là dành cho HĐH, không phải bộ nạp. ELF là một định dạng thực thi, không có bit thực thi, HĐH sẽ không cho phép trình tải thực thi tệp để đọc các tiêu đề. Kiểm tra wikipedia để biết thêm về ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
nzwulfin
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.