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添加依赖库搜索路径相关推荐

  1. 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 / ...

  2. 环境变量,include搜索路径,lib库搜索路径

    环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...

  3. GDB动态库搜索路径

    笔记: 当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-sea ...

  4. 关于环境变量 C++ include搜索路径,lib库搜索路径

    OneCoder在学习C++的过程中,在研究Windows下Eclipse for C/C++开发环境的过程中遇到的一些关于C++环境变量的一些问题.在网上搜索一番,得到下面的文章,与大家分享. 转自 ...

  5. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

  6. python添加模块路径_(转)为Python添加默认模块搜索路径

    原文出处:https://www.douban.com/note/334738164/ 方法一:函数添加 1 import sys 2 查看sys.path 3 添加sys.path.append(& ...

  7. Eclipse 添加依赖 库 Libary

    添加项目工程依赖首先打开eclipse,选中要添加依赖的项目.点击build path->config build path选项. 2 点击config build path选项弹出下图所示的界 ...

  8. Python批量添加库搜索路径

    被win10 给坑了,换回Win7. 重装系统后,继续使用Python,Eclipse不用重装,pydev不用重装,只需重装Python2.7.6 X64 for win即可.然后,默认已安装的Pyt ...

  9. windows下增加python的库搜索路径

    2019独角兽企业重金招聘Python工程师标准>>> 环境:win7 64bit python3.3 在添加自己的库文件夹路径时,添加不成功,发现windows的路径应该写成这样: ...

最新文章

  1. BP神经网络公式推导及实现(MNIST)
  2. 所有 SAP 现在开设的标准课程
  3. 自学了python基础英语_Python自学路线图之Python基础自学
  4. nginx+tomcat实现主备切换
  5. (译)元素浮动的那些事儿
  6. Java并发编程实战~CountDownLatch
  7. 微服务教程--什么是 Nacos
  8. string replaceAll
  9. 5.Java 面试题整理(JDBC ,JDO 方面)
  10. 海员可以饮用蒸馏海水吗?
  11. C# 使用PrintDocument类打印标签
  12. 转 Spring是如何管理Hibernate和Struts的(二)
  13. pc套件 无法连接pc CDC Comms Interface
  14. 2022年危险化学品经营单位安全管理人员考试练习题及答案
  15. endnote 文献管理软件使用教程
  16. Microsoft Visual Studio 2010 Service Pack 1官方下载版(ISO)
  17. 《软件设计师》备考笔记
  18. 机器学习--Iris数据集的Fisher线性分类以及数据可视化技术的学习
  19. 1u服务器系统风扇,1U工控服务器机箱介绍
  20. 大尺度功能脑组织结构:6个主要原则

热门文章

  1. 【easyui】easyui combobox 如何清空已加载的数据?
  2. 2022跨境电商是宝还是坑-成都扬帆跨境电商
  3. 多个Repeater嵌套
  4. 安卓学习文档收集汇总
  5. iOS经典面试题之深入分析图像的解码渲染与基本原理
  6. 产品健康度模型(4) 打分I
  7. XSS Challenges stage#1-10闯关详解
  8. python每行输出10个数据_python 如何重复地在一行输出数据?
  9. 《寒江独钓》键盘过滤部分程序修改
  10. SpringCloud学习笔记(一)