Linux(gnu)环境动态链接库的搜索路径

摘自http://blog.csdn.net/saga1979/article/details/14161229

man ld.so(8)说,如果库依赖不包括“/”,那么它将按照下面的规则按顺序搜索:

  • (仅对ELF格式)如果可执行文件包含DT_RPATH标签,并且不包含DT_RUNPATH标签,将从DT_RPATH列出的路径搜索。(DT_RPATH已经被废弃,请用DT_RUNPATH)
  • 如果LD_LIBRARY_PATH在程序运行时被定义,那么将从它包含的路径开始。安全起见,对于set-user-ID或者set-group-ID的程序,这个变量将被忽略。
  • (仅对ELF格式)如果可执行文件包含DT_RUNPATH标签,将从这个标签列出的路径开始搜索。
  • 从 /etc/ld.so.cache(运行ldconfig产生)中查找文件
  • 从/lib以及/urs/lib,按顺序搜索。如果链接时指定-z nodefaultlib,这个步骤将被忽略。

看起来够简洁的,当做休闲,写个程序验证一下。但在这之前,先介绍一个Glibc扩展的函数(POSIX中没有)

[cpp] view plain copy

  1. #define _GNU_SOURCE
  2. #include <dlfcn.h>
  3. int dladdr(void* addr, Dl_info *info);

这个函数解析传入的函数指针(第一个参数),将信息填充到Dl_info的结构体

[cpp] view plain copy

  1. typedef struct {
  2. const char *dli_fname;  /* Pathname of shared object that contains address */
  3. void       *dli_fbase;  /* Address at which shared object  is loaded */
  4. const char *dli_sname;  /* Name of nearest symbol with addresslower than addr */
  5. void       *dli_saddr;  /* Exact address of symbol named in dli_sname */
  6. } Dl_info;

下面是程序以及需要加载的动态库的代码:

ld_main.c:

[cpp] view plain copy

  1. int main()
  2. {
  3. lib_fun();
  4. return 0;
  5. }

ld_lib.c:

[cpp] view plain copy

  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <dlfcn.h>
  4. int lib_fun()
  5. {
  6. Dl_info dl_info;
  7. dladdr((void*)lib_fun, &dl_info);
  8. fprintf(stdout, "[email protected] %s.\n", dl_info.dli_fname);
  9. return 0;
  10. }

编译这两个文件:

1、动态库:gcc --shared -fPIC ld_lib.c -o libld_lib.so -ldl

2、主程序:gcc ld_main.c -o ld_main -Wl,-rpath,./  -ldl -lld_lib -L./

-Wl,-rpath编译选项将在程序中生成DT_RPATH节点,使用readelf会看到Library rpath被设为当前目录:

接下来将生成的libld_lib.so拷贝到前面介绍到的搜索路径:

对于LD_LIBRARY_PATH,随便设置:export LD_LIBRARY_PATH=../

对于ld.so.conf提到的路径,在/etc/ld.so.conf.d/下面随便找一个,或者自己建立一个,这里用系统自带的libc.conf

中提到的路径:/usr/local/lib

然后运行(每次都删除程序优先加载的so文件):

(ld.so.conf路径更新文件后需要运行ldconfig更新cache,否则会找不到文件,如上图)。

关于-z nodefaultlib链接选项:

看来它真起作用了

关于DT_RUNPATH,需要用到--enable-new-dtags链接选项:

(linux下程序默认不会从当前路径搜索.so文件,这对于自行开发的分为很多模块,要安装在同一目录的“程序”来说不是个优点。还好可以用DT_RUNPATH指定.so的加载路径)

时间: 2024-11-06 21:31:51

Linux(gnu)环境动态链接库的搜索路径的相关文章

Linux C语言头文件搜索路径

本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了.头文件中一般放一些重复使用的代码,例如函数声明.变量声明.常数定义.宏的定义等等.当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处.#include有两种写法形式,分别是: #include <> : 直接到系统指定

Linux下的库文件搜索路径

    对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行"./configure --help"命令查看使用帮. 一个程序能正确编译.链接.运行需要满足3个条件:预处理时能找到头文件,连接时能找到库(静态库或动态库),运行时能找到库.下面介绍库文件的搜索路径 : 编译的时候: gcc最先搜索-L参数指定的路径--->gcc的环境变量LIB

Linux下的头文件搜索路径

     对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行"./configure --help"命令查看使用帮. 一个程序能正确编译.链接.运行需要满足3个条件:预处理时能找到头文件,连接时能找到库(静态库或动态库),运行时能找到库.下面介绍头文件的搜索路径 GCC 搜索头文件有三种策略: 1.内定搜索目录,这是编译器自身预设的目录.由于是内

整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

分类: MakeFile/Make/GCC/LD2010-11-20 23:15 535人阅读 评论(0) 收藏 举报 转者的话: 本文详细介绍了gcc 编译时 搜索头文件的路径以及方式, 编译时寻找lib库的方式, 以及运行时加载库的寻找方式!!!非常之经典啊!以后有新的知识都汇总到这里来了! 在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法. 看下文的红色部分. 有大量的环境变量可供设置以影响 G

Linux动态库搜索路径的技巧

众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了.在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定. 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径. 可以通过编辑配置文件/etc

linux动态库默认搜索路径设置的三种方法

众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了.在 Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定. 方法一:在配置文件 /etc/ld.so.conf 中指定动态库搜索路径.每次编辑

Linux动态库(.so)搜索路径

主要内容: 1.Linux动态库.so搜索路径 编译目标代码时指定的动态库搜索路径: 环境变量LD_LIBRARY_PATH指定的动态库搜索路径: 配置文件/etc/ld.so.conf中指定的动态库搜索路径: 默认的动态库搜索路径/lib: 默认的动态库搜索路径/usr/lib. 2.通过实例验证五种动态库的搜索路径以及其先后顺序 众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该 动 态库还未加载到

动态库,头文件,命令搜索路径

Linux操作系统上面的动态共享库大致分为三类: 1.操作系统级别的共享库和基础的系统工具库 比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录.如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录.此外还可能有其他特定Linux版本的系统库目录.这些系统库文件的完整和版

linux下添加动态链接库路径、动态库加载等方法

linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596 Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译连接可以正常进行,但是在运行时出现如"error while loading shared libraries: libnet.so.1:cannot open shared object file :No such file or directory"的错误提示. 原