2010-07-08 31 views

Trả lời

3

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.

1

Bạn có thể muốn kiểm tra biến môi trường LD_LIBRARY_PATH.

1

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ừ đó.

Các vấn đề liên quan