Thư viện chia sẻ ELF - động lực cho PLT


11

Có thể sử dụng mã tự sửa đổi để tăng tốc độ gọi hàm trong các thư viện được liên kết động?

Theo tôi hiểu, các thư viện chia sẻ ELF sử dụng một loại bảng nhảy gián tiếp (bảng liên kết thủ tục hoặc PLT) để cho phép liên kết lười biếng các chức năng của thư viện. Mục đích dường như là để tránh phải sửa đổi bảng trong đoạn mã trong khi vẫn cho phép giải quyết lười biếng các vị trí chức năng trong cuộc gọi đầu tiên.

Sẽ không nhanh hơn để tự động tạo mã cho bảng đó khi tải, hoặc thậm chí có thể ở lệnh gọi hàm đầu tiên?

Có phải là để cho phép chia sẻ phân đoạn mã giữa các quy trình càng nhiều càng tốt (một bảng động sẽ là riêng tư đối với một quy trình)? Có phải vì lý do bảo mật (mã có thể ghi không nên thực thi - nhưng JIT luôn làm vậy và quyền ghi có thể được thêm và xóa bởi trình tải trước khi thực sự khởi động chương trình)?

Hoặc nó là sự kết hợp của những thứ đó và mức tăng hiệu suất nhỏ cho mỗi lệnh gọi chức năng sẽ không đáng để bỏ công sức?

Câu trả lời:


8

Tôi cho rằng chúng ta đang nói về kiến ​​trúc x86.

Bạn không thể có Mã tự sửa đổi trong chế độ được bảo vệ , được sử dụng bởi hầu hết các hệ điều hành dựa trên UNIX (và không chỉ) mà tôi biết, bởi vì các phân đoạn mã luôn ở chế độ chỉ đọc. Trình tải không kiểm soát điều đó - đó là thứ đang được xử lý bởi hệ thống con quản lý bộ nhớ của kernel.

Nhưng ngay cả khi bạn có thể "tạo mã cho bảng đó khi tải" như bạn nói, nó sẽ thách thức toàn bộ mục đích của các thư viện dùng chung. Theo cách này, mỗi quy trình sẽ có một bản sao "riêng tư" của các chức năng của thư viện trong không gian địa chỉ của nó, làm tăng hiệu quả bộ nhớ của nó - một trong những lý do mà các thư viện chia sẻ được tạo ra, là để giải quyết vấn đề này.

Toàn bộ quá trình bạn mô tả khá phức tạp và sẽ tốn nhiều chu kỳ xử lý hơn so với phương pháp PLT được sử dụng hiện nay và có thể sẽ giới thiệu nhiều vấn đề bảo mật mới, thú vị hơn.


2
Bạn có thể sử dụng lệnh gọi hệ thống mprotect (2) để tạo các trang phân đoạn .text có thể ghi và thực thi được.
Bruce Ediger

1
Đó là chính xác, thưa ông. Có lẽ nó sẽ hoạt động tốt trên hệ thống dựa trên UNIX trung bình, nhưng toàn bộ quá trình liên kết sẽ bị phá vỡ ngay khi ai đó cố gắng làm cứng hệ thống với ví dụ PaX, thực thi các hạn chế đối với mprotect (2).
dkaragasidis

(Dường như tôi đã bỏ lỡ đề cập đến @BruceEdiger trong bình luận trước đây của tôi)
dkaragasidis

1

ELF DSO có thể sử dụng một cờ (DF_TEXREL) để thông báo rằng họ yêu cầu sự phân chia lại bằng cách sửa đổi phần văn bản của họ (thường chỉ đọc). Tuy nhiên, cách tiếp cận bảng nhảy cùng với mã độc lập vị trí PIE sẽ tối ưu hơn.

(Tìm thấy rằng trong http://www.akkadia.org/drepper/dsohowto.pdf , nhưng các tài nguyên khác cũng đề cập đến điều này).

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.