关于Linux动态库搜索路径

2013.08.23 updated


一  概念:这里将共享库(shared library)称做了动态库。

在Linux中,ELF格式的可执行文件或动态库有两个域,DT_RPATH,DT_RUNPATH(这个是新版本加入的)。

// 这个方法只写入DT_RPATH域
gcc -g -Wall -o prog prog.c -Wl,-rpath,/home/dir1 -ldemo
// 这个方法,同时写入DT_RPATH和DT_RUNPATH
gcc -g -Wall -o prog prog.c -Wl,--enable-new-dtags -Wl,-rpath,/home/dir1 -ldemo

编译分为几个阶段,其中-W表示在哪个阶段将后面参数加入,-Wl表示在link阶段加入后面参数,-rpath是为linker指定runtime dynamic path参数。

至于为什么后面的要同时写入DT_RPATH和DT_RUNPATH域,是因为之前的版本没有DT_RUNTIME,为了和老版本程序兼容。


二  Linux 动态库的搜索路径搜索的先后顺序是:


0> 如果DT_RUNPATH域为空,且DT_RPATH不为空,则搜索DT_RPATH指定的路径列表(多个用冒号隔开);

1环境变量LD_LIBRARY_PATH指定的动态库搜索路径,多个路径可以用“:”分开;

2> 如果DT_RUNPATH不为空,那么搜索DT_RUNPATH对应的路径列表;

3/etc/ld.so.cache文件中指定,这个文件是一个二进制文件,如果想添加,先编辑配置文件/etc/ld.so.conf(这个文件是文本的)然后运行ldconfig生成新的/etc/ld.so.cache 

4默认的动态库搜索路径/lib; 

5默认的动态库搜索路径/usr/lib。


以下是使用LD_LIBRARY_PATH的建议:

1> 不要全局设置LD_LIBRARY_PATH

2> 如果一定要用动态库的方式发布你的代码,并且允许用户自定义安装路径,那么

  • 用.o文件发布,在安装过程中,重新连接它们到正确的安装路径。
  • 在可执行程序中,写一个非常冗长,不存在的路径(-Wl,-rpath),然后安装过程中,用一个二进制编辑器将其中的路径修改为正确的。
3> 如果一定要用 LD_LIBRARY_PATH ,一定要包装起来用,例如, shell 脚本。


讲一个我亲身体验的例子。

一个已经安装的软件包A,构建于平台Platform 1.0,所有的平台相关动态库文件位于/opt/lib64/

一个新的软件包B,构建于平台Platform 2.0,所有平台相关动态库位于本软件目录的/lib下

启动软件B,发现运行错误,运行ldd命令,发现连接的动态库不对,应该连本目录的lib,却连到了/opt/lib64/

用设置LD_LIBRARY_PATH的方法启动还是不行,因为路径已经写死到可执行文件里了,用strings命令可以看到二进制里的字符串。

后来查到两种解决办法:

1> 用二进制编辑器将可执行文件内的路径改写,/opt/lib64改成/opt/lib65,这样运行时找不到/opt/lib65,那么LD_LIBRARY_PATH就开始生效了。

2> 编译B之前,将configure.ac中的路径修改一下,使得传递给-Wl,-rpath的参数是一个不可能存在的路径。


Linux 动态库搜索路径是指在 Linux 系统下,动态链接(ld)搜索加载共享库(.so)时,按照一定的优先级和搜索路径去查找目标共享库的过程。 在 Linux 中,系统动态共享库的存放路径一般有如下几个: 1. /usr/lib:系统提供的共享库路径,一些常用的共享库会被安装在该目录下。 2. /lib:系统提供的另一个共享库路径,类似于 /usr/lib,但一些重要的共享库会被安装在该目录下,这些库通常是系统引导过程中需要的。 3. LD_LIBRARY_PATH 环境变量:如果设置了该环境变量,ld 将会在其所指定的路径中查找共享库,而不是在默认路径中查找。 4. /etc/ld.so.conf 文件:该文件指定了需要搜索的共享库路径,如果没有指定,ld 会使用默认路径搜索共享库。 5. /etc/ld.so.cache 文件:该文件记录了系统中已经安装的共享库和其路径信息,ld 可以通过该文件快速查找共享库,避免搜索时的性能损失。 在进行动态共享库链接时,系统动态链接会按照以上搜索路径的优先级从上至下查找目标共享库。如果要修改默认动态库搜索路径,可以在 /etc/ld.so.conf 中添加自定义库路径,并运行 ldconfig 命令更新缓存信息。 总之,动态库搜索路径Linux 下非常重要的概念,对于程序员和系统管理员而言,了解动态库搜索路径有助于更好地管理系统共享库,提高应用程序的可用性和性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值