Thực thi so với các đối tượng được chia sẻ


13

Tôi nhận thấy một cái gì đó trong khi làm find /bin -exec file {} \;:

các filelệnh báo cáo một số mục trong /binshared objects, trong khi những người khác như executables. Ví dụ,

/ bin / ntfsck: Đối tượng chia sẻ
LSB 64 bit , x86-64, phiên bản 1 (SYSV), được liên kết động (sử dụng libs được chia sẻ), cho GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61dbbbbbb

Báo cáo tương tự cho gawk

/ usr / bin / gawk: Đối tượng chia sẻ
LSB 64 bit , x86-64, phiên bản 1 (SYSV), được liên kết động (sử dụng libs được chia sẻ), cho GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e012bbbbbb

Ngược lại filecho /bin/echolà:

/ bin / echo:
ELF 64-bit LSB thực thi , x86-64, phiên bản 1 (SYSV),
được liên kết động (sử dụng libs được chia sẻ), cho GNU / Linux 2.6.24,
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a59c

Về cơ bản, tôi muốn biết sự khác biệt giữa executablecác tập tin và shared objecttập tin.


Câu trả lời:


14

Tl; dr

Không có sự khác biệt, ngoài thực tế là một thực thi được biên dịch có thể được liên kết với một đối tượng được chia sẻ nhưng không chống lại một thực thi.


Nói chung, có hai cách để biên dịch 1 tệp thực thi:

  • Sử dụng liên kết tĩnh: các thư viện bên ngoài có trong mã nguồn được biên dịch và thư viện được biên dịch (hoặc đối tượng trong phối cảnh của trình liên kết) được thêm vào chính tệp thực thi;
  • Sử dụng liên kết động: các thư viện bên ngoài được bao gồm trong mã nguồn được biên dịch nhưng một liên kết đến thư viện đã biên dịch (hoặc đối tượng trong phối cảnh của trình liên kết) được thêm vào tệp thực thi (và các thư viện / đối tượng đã biên dịch được tải bởi trình liên kết vào thời gian chạy nếu cần thiết);

Có những ưu điểm / nhược điểm trong việc sử dụng từng phương pháp này, nhưng đó không phải là điểm chính của câu hỏi;

  • /bin/ntfsck/usr/bin/gawklà các đối tượng được chia sẻ: điều này có nghĩa là một tệp thực thi có thể được biên dịch và sau đó được liên kết với chúng để sử dụng các chức năng của chúng;
  • /bin/echolà một tệp thực thi: điều này có nghĩa là một tệp thực thi có thể không được biên dịch và sau đó được liên kết với nó để sử dụng các chức năng của nó;

Vì vậy, /bin/ntfsck/usr/bin/gawklà các thư viện được biên dịch kỹ thuật (hoặc các đối tượng trong phối cảnh của trình liên kết), nhưng, vì người ta có thể đã bỏ qua, không có gì ngăn cản một đối tượng chia sẻ chạy như một thực thi.

Ngoài ra, hãy lưu ý rằng filecác báo cáo (cho mỗi báo cáo):

liên kết động (sử dụng libs chia sẻ)

Điều này có nghĩa là mỗi trong số chúng được liên kết động với (và có thể sử dụng) các đối tượng chia sẻ khác.


1. "Biên dịch" dự định trong sự chấp nhận rộng hơn của nó, bao gồm tiền xử lý, biên dịch và liên kết.


1
tự động liên kết với các đối tượng chia sẻ khác , IN OS? hoặc thư viện dùng chung?!
Dr.jacky

@ Mr.Hyde Trong HĐH, cụ thể hơn là ở các vị trí phải được cấu hình sẵn trong trình liên kết, để trình liên kết có thể tải chúng vào thời gian chạy nếu cần. Xem ở đây , chương 3.2.
kos

Người ta thực sự có thể liên kết với một thực thi bằng cách sử dụng dlopen: ví dụ
Adam Zahran

6

Một điểm khác biệt nữa là các tệp thực thi có phần bù địa chỉ điểm nhập được xác định, nghĩa là 0x08048000 cho i386, 0x00400000 cho x86 và 0x00010000 cho nhánh.

Một tệp đối tượng được chia sẻ có thể là một thư viện, nhưng cũng có thể thực thi được. Khi là một thực thi, không có bù đắp như vậy. Một đối tượng chia sẻ thực thi , vì vậy để nói, là một thực thi độc lập thuộc vị trí (PIE) sử dụng địa chỉ bố trí không gian ngẫu nhiên (ASLR). Do đó, khi xem tệp / Proc / pid / maps của nó, bạn sẽ thấy rằng vị trí của các phân đoạn được tải khác nhau trong mỗi lần thực hiện trái ngược với các tệp thực thi tiêu chuẩn.

Ý tưởng đằng sau tính năng này là thêm bảo mật cho các tệp thực thi bằng cách cản trở những kẻ tấn công thực hiện các cuộc tấn công lập trình hướng trở lại. Nhiều nhà bảo trì đã quyết định xây dựng các gói với PIE được bật làm mặc định, ví dụ, kể từ Fedora 23 hoặc với Ubuntu 17.10.


Câu trả lời thú vị. Thiếu một vài nguồn (sẽ rất tuyệt nếu bạn thêm một vài liên kết, đặc biệt là cho phần điểm nhập cảnh) nhưng tôi đã tìm kiếm một vài câu hỏi stackoverflow về điều đó. Nhưng chắc chắn câu trả lời tốt.
Sergiy Kolodyazhnyy
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.