Gần đây tôi đã bắt gặp một tài liệu tham khảo về nó trên proggit và (hiện tại) nó không được giải thích.
Tôi nghi ngờ đây có thể là nó, nhưng tôi không biết chắc chắn.
Gần đây tôi đã bắt gặp một tài liệu tham khảo về nó trên proggit và (hiện tại) nó không được giải thích.
Tôi nghi ngờ đây có thể là nó, nhưng tôi không biết chắc chắn.
Câu trả lời:
Nếu bạn đặt thành LD_PRELOAD
đường dẫn của một đối tượng chia sẻ, tệp đó sẽ được tải trước bất kỳ thư viện nào khác (bao gồm cả thời gian chạy C libc.so
). Vì vậy, để chạy ls
với malloc()
triển khai đặc biệt của bạn , hãy làm điều này:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
. Lý do là nó là một biến môi trường, nó được thừa hưởng bởi các tiến trình con - có thể có một thư mục làm việc khác với tiến trình cha. Vì vậy, bất kỳ đường dẫn tương đối sẽ không tìm thấy thư viện để tải trước.
Bạn có thể ghi đè các biểu tượng trong thư viện chứng khoán bằng cách tạo thư viện có cùng ký hiệu và chỉ định thư viện trong đó LD_PRELOAD
.
Một số người sử dụng nó để chỉ định các thư viện ở các vị trí không chuẩn, nhưng LD_LIBRARY_PATH
tốt hơn cho mục đích đó.
Với LD_PRELOAD
bạn có thể cung cấp cho các thư viện ưu tiên.
Ví dụ, bạn có thể viết một thư viện thực hiện malloc
và free
. Và bằng cách tải chúng với LD_PRELOAD
bạn malloc
và free
sẽ được thực hiện chứ không phải là những tiêu chuẩn.
calloc
thì sao? điều đó có làm xáo trộn mọi thứ không?
malloc
và miễn phí được thiết kế đặc biệt trong glibc để cho phép điều này và cổ phiếu calloc
quản lý để gọi cho hàng nhập khẩu của bạn malloc
. Đừng thử điều này với bất kỳ chức năng nào khác. Nó sẽ không hoạt động tốt như vậy.
Như nhiều người đã đề cập, sử dụng LD_PRELOAD
để tải trước thư viện. BTW, bạn có thể KIỂM TRA nếu cài đặt có sẵn bằng ldd
lệnh.
Ví dụ: giả sử bạn cần tải trước của riêng bạn libselinux.so.1
.
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
Do đó, hãy thiết lập môi trường tải trước của bạn:
export LD_PRELOAD=/home/patric/libselinux.so.1
Kiểm tra thư viện của bạn một lần nữa:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
liệt kê các thư viện chia sẻ với các chức năng ghi đè lên bộ tiêu chuẩn, cũng như /etc/ld.so.preload
vậy. Chúng được thực hiện bởi bộ nạp /lib/ld-linux.so
. Nếu bạn muốn ghi đè chỉ một vài chức năng đã chọn, bạn có thể thực hiện việc này bằng cách tạo tệp và cài đặt đối tượng ghi đè LD_PRELOAD
; các hàm trong tệp đối tượng này sẽ ghi đè chỉ các hàm đó để lại các hàm khác.
Để biết thêm thông tin về các thư viện được chia sẻ, hãy truy cập http://tldp.org/HOWTO/Program-L Library- HOWTO / Shared-lologists.html
Đây là một bài viết blog chi tiết về tải trước:
thật dễ dàng để xuất mylib.so
sang env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
để vô hiệu hóa:
$ export LD_PRELOAD=
unset LD_PRELOAD
Khi LD_PRELOAD được sử dụng, tập tin đó sẽ được tải trước khi bất kỳ $export LD_PRELOAD=/path/lib
lib nào khác
được tải trước, thậm chí điều này cũng có thể được sử dụng trong các chương trình
Sử dụng LD_PRELOAD
đường dẫn, bạn có thể buộc trình tải ứng dụng tải đối tượng dùng chung được cung cấp, theo mặc định được cung cấp.
Các nhà phát triển sử dụng điều này để gỡ lỗi các ứng dụng của họ bằng cách cung cấp các phiên bản khác nhau của các đối tượng được chia sẻ.
Chúng tôi đã sử dụng nó để hack một số ứng dụng nhất định, bằng cách ghi đè các chức năng hiện có bằng cách sử dụng các đối tượng chia sẻ đã chuẩn bị.