有没有办法只在运行二进制文件时从特定位置加载用户库

时间:2012-11-29 09:15:29

标签: c unix gcc

我在/ opt / my_prog / lib以及/ home / user1 / lib中有一个共享库的libmyworld.so 不论我在LD_LIBRARY_PATH中指定的顺序(LD_LIBRARY_PATH = / home / user1 / lib; / opt / myprog / lib);我的二进制文件应该总是在/ opt / my_prog / lib中查找libmyworld.so;

这可以在编译期间使用GCC完成吗?没有修改my_prog二进制文件。提前谢谢。

4 个答案:

答案 0 :(得分:6)

Linux中动态库的搜索顺序(来自ld.so手册页)如下

  
      
  • 使用二进制文件的DT_RPATH动态部分属性   如果存在且DT_RUNPATH属性不存在。用于       不推荐使用DT_RPATH。
  •   
  • 使用环境变量LD_LIBRARY_PATH。除非是       可执行文件是setuid / setgid二进制文件,在这种情况下它       被忽略了。
  •   
  • 使用二进制文件的DT_RUNPATH动态部分属性       如果有的话。
  •   
  • 从缓存文件/etc/ld.so.cache中包含一个       已编译的候选库列表       增强的库路径。但是,如果二进制文件已链接       使用-z nodeflib链接器选项,默认为库       库路径被跳过。   
        
    • 在默认路径/ lib中,然后在/ usr / lib中。如果二进制   与-z nodeflib链接器选项链接,此步骤为   跳过。
    •   
  •   

链接时,设置

  • DT_RUNPATH:使用-Wl, - enable-new-dtags -Wl,-R $(RUNPATH)
  • DT_RPATH:使用-Wl, - disable-new-dtags -Wl,-R $(RPATH)

理论上,最好使用DT_RUNPATH作为LD_LIBRARY_PATH,用户拥有控件,它具有优先权。但是在这里你想避免用户控制,所以使用DT_RPATH。在你的链接行:

-Wl,--disable-new-dtags -Wl,-R/opt/my_prog/lib

答案 1 :(得分:0)

您始终可以使用

启动二进制文件(此处称为 foo
$ LD_LIBRARY_PATH=/opt/my_prog/lib foo

或使用上面的行创建一个shell脚本。

答案 2 :(得分:0)

编译源代码时,请使用以下命令 gcc -o [desired_executable_file_name] -L [您的共享库路径] -l [您的共享库名称] -I [头文件路径]

例如在你的情况下 gcc -o my_word_exe -L / opt / my_prog / lib -lmyworld -I [标题路径,如果他们的]

然后它将“在/ opt / my_prog / lib中使用libmyworld.so这条路径

答案 3 :(得分:-2)

使用LD_PRELOAD。

LD_PRELOAD=/home/lib/libmyworld.so mybinary

优点是你没有使用LD_LIBRARY_PATH - 你的二进制文件可能依赖于其他共享库,它可能需要LD_LIBRARY_PATH/ld.so.conf/whatever

PS。这是最具侵入性和灵活性的解决方案,因为它不会影响其他库的加载,也不会对用户可执行文件中的路径进行硬编码。