-rpath 和 -rpath-link 是链接时指定程序依间接赖库的搜索路径
-rpath 即在链接时指定链接器搜索路径,也在运行时指定ELF加载器搜索路径
-rpath-link 仅在链接时供链接器搜索
与 -L 和 -l 的关系
-L 和 -l 是指定程序的直接引用库,并进行实际符号链接
对于间接引用的库,也可以使用 -L 和 -l 显式地传递给链接器,而不使用-rpath-link
当应用程序直接引用一个十分复杂的库时,这个十分复杂的库背后又依赖了很多间接引用库,使用者没必要知道和花时间研究都有什么间接引用库,这时使用-rpath-link就合适了,让所有直接和间接依赖库都和预期的目标运行环境一致。
-rpath是传递给链接器的参数,内容为一个路径
用法:
-Wl,-rpath,/path/to/lib
或
-XLinker -rpath -XLinker /path/to/lib
或
-XLinker -rpath=/path/to/lib
作用:
链接时,到这个路径搜索动态库的间接引用,并将这个路径编译进ELF程序文件,在运行期供ELF加载器使用
运行时,ELF加载器在这个路径去搜索程序依赖的动态库并加载
-rpath-link也是传递给链接器的参数,作用与-rpath类似
用法:
-Wl,-rpath-link,/path/to/lib
或
-XLinker -rpath-link -XLinker /path/to/lib
或
-XLinker -rpath-link=/path/to/lib
不同:
链接时,到这个路径搜索动态库的间接引用,但不编译进ELF程序文件
何时使用-rpath
当程序发布时附带私有的共享库文件时,用户的安装路径会不同,也不会考虑把附带的共享库融合到目标系统中标准的/lib或/usr/lib里,这时使用-rpath指定发布程序的共享库搜索路径。
-rpath可以指定相对路径,相对当前路径,但用户的运行路径又会不同,所以指定相对路径没有意义,应该指定程序所在位置的相对路径,用法:
-Wl,-rpath,$ORIGIN../lib
ELF加载器会根据程序的实际位置替代$ORIGIN
注意:
其他脚本里,$的转义,如shell脚本,需要用引号,Makefile脚本里需要俩$$
何时使用-rpath-link
当链接程序时,开发机编译环境里有程序依赖的共享库和共享库的间接依赖,但与目标系统中的位置不同,这时使用-rpath-link指定链接时共享库搜索路径。与运行时无关,运行时由ELF加载器负责处理。
LD_LIBRARY_PATH
运行期目标系统的环境变量,由ELF加载器使用,这个有安全隐患,最好别用
阅读(7487) | 评论(0) | 转发(0) |