Linux动态库文件定位

本文详细介绍了Linux中构建时库文件的定位规则,包括静态库和动态库的命名,以及RPATH、LD_LIBRARY_PATH、RUN_PATH在链接和运行时的作用,还提到了ld.so.cache文件和ldconfig工具的使用。
摘要由CSDN通过智能技术生成

构建时库文件的定位规则

定位规则基于Linux库文件命名规则,如下:
静态库名 = lib库名.a
动态库名 = lib库名.so<版本>

中间的库名是库的实际名称,链接器在构建时搜索的就是这个名称,装载器在运行时搜索的也是这个名称。

在Linux中使用-L-l指定构建过程中的库文件路径。库文件路径分为两个部分:目录路径库文件名。这里的库文件名为上述的实际名称。目录路径添加在-L后,库文件名添加在-l后。链接libdynamiclib.so的命令如下:

g++ main.o -L../sharedLib -ldynamiclib -o main

编译链接命令如下:

g++ -fPIC main.cpp -Wl,-L../sharedLib -Wl,-ldynamiclib -o main

也可以简单点:

g++ main.cpp -L../sharedLib -ldynamiclib -o main

-L只在链接时起作用。-l后的参数会被嵌入到最终的客户二进制文件(库文件或可执行文件)中,例如上述的main中。-l在运行阶段也会发挥作用,装载器在读入客户二进制文件后,会跟据-l后的库文件名来定位,这里的定位为运行时库文件定位

运行时库文件的定位规则

库搜索顺序:
1 RPATH
2 LD_LIBRARY_PATH
3 RUN_PATH
4 ld.so.cache
5 默认库路径(/lib/usr/lib)

RPATH本地测试时并没有存在这个字段,无论是否加-Wl,--enable-new-dtags,都是只有RUN_PATH这一个字段。

LD_LIBRARY_PATH为环境变量,命令如下:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../sharedLib

RUN_PATH为可执行文件中的字段,使用-R添加该字段:

g++ main.cpp -Wl,-R../sharedLib -L../sharedLib -ldynamiclib -o main

使用readelf -d查看结果二进制文件main

readelf -d main
Dynamic section at offset 0x1d48 contains 30 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [../sharedLib]
 0x000000000000000c (INIT)               0x890
 0x000000000000000d (FINI)               0xc94
 0x0000000000000019 (INIT_ARRAY)         0x201d30
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x201d40
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x298
 0x0000000000000005 (STRTAB)             0x470
 0x0000000000000006 (SYMTAB)             0x2c0
 0x000000000000000a (STRSZ)              418 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x201f68
 0x0000000000000002 (PLTRELSZ)           216 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x7b8
 0x0000000000000007 (RELA)               0x698
 0x0000000000000008 (RELASZ)             288 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            Flags: NOW PIE
 0x000000006ffffffe (VERNEED)            0x638
 0x000000006fffffff (VERNEEDNUM)         3
 0x000000006ffffff0 (VERSYM)             0x612
 0x000000006ffffff9 (RELACOUNT)          4
 0x0000000000000000 (NULL)               0x0

ld.so.cache文件中包含了一组库文件路径列表。可以用下面命令查看

cat /etc/ld.so.cache

可以使用工具ldconfig将库文件路径添加到ld.so.cache,这一般是安装软件包的最后一步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值