Tôi có một chương trình phụ thuộc vào một thư viện được chia sẻ mà nó hy vọng sẽ tìm thấy sâu bên trong một cấu trúc thư mục. Tôi muốn chuyển thư viện được chia sẻ đó ra và vào một nơi tốt hơn. Trên OS X, điều này có thể được thực hiện với install_name_tool. Tôi không thể tìm thấy một tương đương cho Linux.Làm cách nào để thay đổi tên tệp của thư viện được chia sẻ sau khi xây dựng chương trình phụ thuộc vào nó?
Để tham khảo, readelf -d myprogram
spits ra đầu ra diễn giải như sau:
Dynamic section at offset 0x1e9ed4 contains 30 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [this/is/terrible/library.so]
0x00000001 (NEEDED) Shared library: [libGL.so.1]
0x00000001 (NEEDED) Shared library: [libGLU.so.1]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
(continues in an uninteresting fashion)
(và theo yêu cầu, ldd myprogram
:)
linux-gate.so.1 => (0x0056a000)
this/is/terrible/library.so => not found
libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000)
(etc, etc)
và tôi muốn Errata "này/là/khủng khiếp/library.so "để được" chia sẻ/library.so ". Lưu ý rằng, nếu chương trình còn lại trong vị trí "được xây dựng" của nó, nơi đường dẫn tương đối này/là/terrible/library.so thực sự tồn tại, thì ldd có thể tìm thấy nó, như bạn mong đợi.
Tôi biết về RPATH và nó không phải là những gì tôi đang tìm kiếm, tôi không cần phải thay đổi đường dẫn tìm kiếm trên toàn cầu.
Vì vậy, bạn đang nói rằng đường dẫn "this/is/terrible /" không được đặt là đường đi? Đây có phải là một phần của SONAME của thư viện không? Tôi không nghĩ rằng có install_name trên Linux. –
Vâng, nó sẽ là một phần của SONAME, được giới thiệu bởi trình liên kết dựa trên đường dẫn ban đầu khi nó được liên kết. – ZorbaTHut
bạn cũng có thể đăng đầu ra 'ldd./Yourprogram' không? –