rpath添加依赖库搜索路径
windows 下一个程序的dll搜索路径首先是程序目录,然后是一些系统目录。linux 下的可以通过设置 LD_LIBRARY_PATH 等方法来添加搜索路径,但是这些路径是定死的,如果要实现程序目录,就要使用链接时的rpath选项。rpath 适用于 elf 文件,不适用 pe。
Linux 上动态库搜索顺序:
Unless loading object has RUNPATH:
RPATH of the loading object,
then the RPATH of its loader (unless it has a RUNPATH), ...,
until the end of the chain, which is either the executable
or an object loaded by dlopen(loader 为可执行程序或被 dlopen 打开的对象)
Unless executable has RUNPATH:
RPATH of the executable
LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs
rpath 用法
ld:
-rpath dir or --rpath=dir
为了兼容其他 ELF 链接器,如果 -R 选项的值是个目录而不是文件,那么此时相当与 -rpath
注:-R filename 与 --just-symbols=filename 等价
如果链接时没使用 '-rpath' ,那么如果定义了 LD_RUN_PATH 就会使用该值作为 rpath
ld 如果不是直接被调用的,而是是通过一个驱动程序如 gcc 调用,那么的所有的链接选项都需要加上前缀 "-Wl,", 选项和值之间用","隔开
所以gcc的rpath用法:
-Wl,-rpath,dir
多个dir之间用冒号分隔:
-Wl,-rpath,dir1:dir2:...:dirN
$ORIGING
代表程序目录,需要加单引号,否则会被解释为变量ORIGIN的值。这样gcc的链接flags为
-Wl,-rpath,'$ORIGIN'
或
'-Wl,-rpath,$ORIGIN'
用 readelf 查看编译后的程序
readelf -d path
会发现多了类似与这么一行
0x0000000f (RPATH) Library rpath: [$ORIGIN]
这样,程序运行前会先搜索程序所在路径有没有依赖的库。
Makefile 中的写法:
注意Makefile里要用两个$$,只用一个$会展开成变量值,$$相当与转义成$
LFLAGS += '-Wl,-rpath,$$dir'
qmake 工程中的写法:
QMAKE_LFLAGS += -Wl,-rpath,\'\$\$dir\'
或
QMAKE_RPATHDIR += :\'\$\$dir\'
注意QMAKE_RPATHDIR最开始要加冒号,因为生成Makefile会自动在前面加上-Wl,-rpath,$$PWD
bash 里执行 make 命令:
make LDFLAGS="'-Wl,-R,\$\$ORIGIN'"
其他有待调查的问题
1. ld -z -origin 或 g++ -Wl,-z,origin
不知道这个有什么作用,文档里一笔带过没看明白。readelf 看了下多了类似与如下的一行
0x6ffffffb (FLAGS_1) Flags: ORIGIN
2. macx
@executable_path : relative to the main executable
@loader_path : relative to the referring binary
@rpath : relative to any of a list of paths.
from qtcreator/src/rpath.pri:
!isEmpty(TIGER_COMPAT_MODE) {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@executable_path/../PlugIns/
} else {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/PlugIns/
QMAKE_LFLAGS += -Wl,-rpath,@loader_path,-rpath,@executable_path
}
使用 otool 查看
3. clang
4. RUNPATH, DT_RUNPATH
参考文献:
http://itee.uq.edu.au/~daniel/using_origin/
http://stackoverflow.com/questions/9263256/can-you-please-help-me-understand-how-mach-o-libraries-work-in-mac-os-x
http://itee.uq.edu.au/~daniel/using_origin/
http://stackoverflow.com/questions/6324131/rpath-origin-not-having-desired-effect
http://www.delorie.com/gnu/docs/binutils/ld_3.html
http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/
http://blog.csdn.net/dbzhang800/article/details/6918413
rpath添加依赖库搜索路径相关推荐
- adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...
一.gcc编译过程 gcc -E hello.c -o hello.s //预处理 gcc -S hello.s -o hello.i //编译 gcc -c hello.i -o hello.o / ...
- 环境变量,include搜索路径,lib库搜索路径
环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...
- GDB动态库搜索路径
笔记: 当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-sea ...
- 关于环境变量 C++ include搜索路径,lib库搜索路径
OneCoder在学习C++的过程中,在研究Windows下Eclipse for C/C++开发环境的过程中遇到的一些关于C++环境变量的一些问题.在网上搜索一番,得到下面的文章,与大家分享. 转自 ...
- CMakeLists学习二、链接库搜索路径与ld
CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...
- python添加模块路径_(转)为Python添加默认模块搜索路径
原文出处:https://www.douban.com/note/334738164/ 方法一:函数添加 1 import sys 2 查看sys.path 3 添加sys.path.append(& ...
- Eclipse 添加依赖 库 Libary
添加项目工程依赖首先打开eclipse,选中要添加依赖的项目.点击build path->config build path选项. 2 点击config build path选项弹出下图所示的界 ...
- Python批量添加库搜索路径
被win10 给坑了,换回Win7. 重装系统后,继续使用Python,Eclipse不用重装,pydev不用重装,只需重装Python2.7.6 X64 for win即可.然后,默认已安装的Pyt ...
- windows下增加python的库搜索路径
2019独角兽企业重金招聘Python工程师标准>>> 环境:win7 64bit python3.3 在添加自己的库文件夹路径时,添加不成功,发现windows的路径应该写成这样: ...
最新文章
- BP神经网络公式推导及实现(MNIST)
- 所有 SAP 现在开设的标准课程
- 自学了python基础英语_Python自学路线图之Python基础自学
- nginx+tomcat实现主备切换
- (译)元素浮动的那些事儿
- Java并发编程实战~CountDownLatch
- 微服务教程--什么是 Nacos
- string replaceAll
- 5.Java 面试题整理(JDBC ,JDO 方面)
- 海员可以饮用蒸馏海水吗?
- C# 使用PrintDocument类打印标签
- 转 Spring是如何管理Hibernate和Struts的(二)
- pc套件 无法连接pc CDC Comms Interface
- 2022年危险化学品经营单位安全管理人员考试练习题及答案
- endnote 文献管理软件使用教程
- Microsoft Visual Studio 2010 Service Pack 1官方下载版(ISO)
- 《软件设计师》备考笔记
- 机器学习--Iris数据集的Fisher线性分类以及数据可视化技术的学习
- 1u服务器系统风扇,1U工控服务器机箱介绍
- 大尺度功能脑组织结构:6个主要原则