Có công cụ nào để sửa đổi các mục trong thư viện được chia sẻ trong phần động của nhị phân ELF không? Tôi muốn sửa đổi rõ ràng các phụ thuộc thư viện được chia sẻ trong tệp nhị phân của tôi (ví dụ: thay đường dẫn đến thư viện hiện có bằng đường dẫn tùy chỉnh)Công cụ để sửa đổi phần động của một số nhị phân ELF
Trả lời
thay thế đường dẫn đến thư viện hiện có với một con đường tùy chỉnh
Nếu đây là thư viện riêng của bạn, sau đó bạn có thể liên kết nó như thế:
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
thay cho thích hợp:
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
Cách tiếp cận đầu tiên cho trình liên kết Linux biết rằng ứng dụng cần trước cisely rằng thư viện, chỉ có thư viện và không ghi đè nên có thể. Cách tiếp cận thứ hai cho biết rằng ứng dụng cần thư viện sẽ được cài đặt ở đâu đó trên hệ thống, hoặc trong đường dẫn thư viện mặc định hoặc một thư được chỉ bởi $ LD_LIBRARY_PATH (sẽ được tra cứu trong thời gian chạy). -L chỉ được sử dụng trong thời gian liên kết.
Nếu không, thay vì vá ELF, trước tiên hãy kiểm tra xem bạn có thể thay thế thư viện bằng liên kết tượng trưng hay không. Đây là thủ thuật thông thường: rất khó để sửa đổi thực thi sau đó, nhưng rất dễ thay đổi vị trí của các điểm liên kết tượng trưng.
Bạn có thể muốn kiểm tra biến môi trường LD_LIBRARY_PATH
.
Nếu bạn nhìn vào phần .dynsym trong Linux qua readelf
, bạn sẽ chỉ nhìn thấy cái gì đó như:
1: 0000000000000000 163 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2)
mà chỉ chứa một tên mang tính biểu tượng của thư viện. Tuy nhiên, nếu bạn bao gồm các thông tin nạp năng động, bạn sẽ có được:
libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000)
/lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000)
Vì vậy, như đã đề cập, điều dễ nhất tuyệt đối để làm (giả sử bạn đang làm điều này để gỡ lỗi, và không mãi mãi) sẽ chỉ được để tạo ra một phiên mới, xuất đường dẫn tùy chỉnh của bạn trước LD_LIBRARY_PATH
hiện có và đi từ đó.