I have a program that depends on a shared library it expects to find deep inside a directory structure. I'd like to move that shared library out and into a better place. On OS X, this can be done with install_name_tool. I'm unable to find an equivalent for Linux.
For reference, readelf -d myprogram
spits out the following paraphrased output:
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)
(and by request, 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)
and I would like to errata "this/is/terrible/library.so" to be "shared/library.so". Note that, if the program is left in its "built" location, where the relative path this/is/terrible/library.so actually exists, then ldd is able to find it, as you'd expect.
I know about RPATH and it isn't what I'm looking for, I don't need to change search paths globally.
We can use patchelf:
patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program
We can also remove a dependency:
patchelf --remove-needed libfoo.so.1 my-program
Add a dependency:
patchelf --add-needed libfoo.so.1 my-program
Or change the path where to search for the libraries (rpath):
patchelf --set-rpath /path/to/lib:/other/path my-program