我在/ 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 FIRST;
这可以在编译期间使用GCC完成吗?没有修改my_prog二进制文件.提前致谢.
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |