How to add shared library search path to a executable file?

喜夏-厌秋 提交于 2020-01-02 01:55:16

问题


I build the ffmpeg with librtmp. My librtmp is at /opt/librtmp/lib. When I execute the ffmpeg, it said:

./ffmpeg: error while loading shared libraries: librtmp.so.0: cannot open shared object file: No such file or directory

I use ldd command it displays not found:

[qty@testing bin]# ldd ffmpeg 
        linux-vdso.so.1 =>  (0x00007fff15576000)
        librtmp.so.0 => not found
        libz.so.1 => /lib64/libz.so.1 (0x00002b9a71e10000)
        libm.so.6 => /lib64/libm.so.6 (0x00002b9a72025000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b9a722a8000)
        libc.so.6 => /lib64/libc.so.6 (0x00002b9a724c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b9a71bf2000)

I know my so at:

[qty@testing bin]# ls -alh  /opt/librtmp/lib/
total 300K
drwxr-xr-x 3 root root 4.0K Sep 25 17:10 .
drwxr-xr-x 7 root root 4.0K Sep 25 17:10 ..
-rw-r--r-- 1 root root 158K Sep 25 17:10 librtmp.a
lrwxrwxrwx 1 root root   12 Sep 25 17:10 librtmp.so -> librtmp.so.0
-rwxr-xr-x 1 root root 118K Sep 25 17:10 librtmp.so.0
drwxr-xr-x 2 root root 4.0K Sep 25 17:10 pkgconfig

I found several ways to fix the problem

  • modify /etc/ld.so.conf, but it required a supper user
  • set LD_LIBRARY_PATH variable, but it is not conventient to users
  • pass rpath to gcc, like this

configure args for my ffmpeg

PKG_CONFIG_PATH="/opt/librtmp/lib/pkgconfig" ./configure --disable-doc \
--disable-ffserver --disable-avdevice \
--disable-postproc --disable-avfilter --disable-bsfs \
--disable-filters \
--disable-asm \
--disable-bzlib \
--enable-librtmp \
--prefix=/opt/ffmpeg \
--extra-ldflags="-Wl,-rpath,/opt/librtmp/lib"

Assume there are no source code to re-compile? How do add the shared library search path to a executable file ?


回答1:


You could use addrpath to add an RPATH to your elf file.

The RPATH will work like LD_LIBRARY_PATH, that is, telling the dynamic loader to search for the shared libraries in that path. RPATH will be permanently in your ELF file.




回答2:


I realize that OP has probably moved on but this is the kind of thing that NixOS does regularly and they have released a tool for this very problem. Also this was a problem I had before even hearing of NixOS.

Here's an example usage of their tool patchelf

... Likewise, you can change the RPATH, the linker search path embedded into executables and dynamic libraries:

patchelf --set-rpath /opt/my-libs/lib:/foo/lib program

This causes the dynamic linker to search in /opt/my-libs/lib and /foo/lib for the shared libraries needed by program....

From https://nixos.org/patchelf.html




回答3:


My fix to this problem is to install librtmp into /usr/local/lib and run 'sudo ldconfig' after installing it. Ffmpeg can then be configured simply by adding --enable-librtmp. For me this works fine: No system modifications necessary!




回答4:


nixos

this might be nixos specific but provides an interesting insight on ldd/patchelf:

https://lastlog.de/blog/posts/playing_FTL_on_NIXOS.html

ubuntu

on ubuntu/fedora you would use: LD_LIBRARY_PATH with a starter script ./ftl, again, see my above posting about FTL and how it is deployed.



来源:https://stackoverflow.com/questions/12580184/how-to-add-shared-library-search-path-to-a-executable-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!