我在/ 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二进制文件。提前谢谢。
答案 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作为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。这是最具侵入性和灵活性的解决方案,因为它不会影响其他库的加载,也不会对用户可执行文件中的路径进行硬编码。