2024年Linux最全Linux下so动态库查看与运行时搜索路径的设置(1),2024年最新这里有份超全Linux运维体系化进阶学习图谱
/ 注:这里-ladd不能在main.cpp之前,否则连接器在链接main.o时找不到libadd.so。// libadd.so 在main.cpp 后,否则报链接错误。
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。




既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
#endif
// add.cpp
int add(int a, int b)
{
return a+b;
}
// main.cpp
#include
using namespace std;
int main()
{
int sum = add(3, 2);
cout << sum << endl;
}
$ g++ -fPIC -shared -o libadd.so add.cpp
// 注:这里-ladd不能在main.cpp之前,否则连接器在链接main.o时找不到libadd.so
$ g++ -o main -I. -L. main.cpp -ladd
$ ./main
./main: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
运行时报错,找不到依赖的so文件
$ ldd main
linux-vdso.so.1 => (0x00007fffaef9b000)
libadd.so => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007feb12d01000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feb12937000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007feb1262e000)
/lib64/ld-linux-x86-64.so.2 (0x000055794a8c2000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007feb12418000)
*
* * *
一般使用设置LD\_LIBRARY\_PATH这个环境变量来解决
$ LD_LIBRARY_PATH=.
$ export LD_LIBRARY_PATH
$ ./main
5
*
使用export只对当前shell有效,开启的其他shell必须重新设置。可以把export LD\_LIBRARY\_PATH=xxx写到~/.bashrc对当前用户生效或写入/etc/profile对所有用户生效。可参考:[linux设置环境变量]( )
使用-L. -ladd 是一种设置相对路径方法,也可以使用绝对路径链接方法
// libadd.so 在main.cpp 后,否则报链接错误
$ g++ -o main main.cpp /home/jack/workpace/libadd.so
$ main
$ ldd main
$ ldd main
linux-vdso.so.1 => (0x00007fff3ebb7000)
/home/jack/workspace/libadd.so (0x00007fde18144000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fde17dad000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fde179e3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fde176da000)
/lib64/ld-linux-x86-64.so.2 (0x0000562f1c354000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fde174c4000)
*
* * *
搜索路径分两种:
* 链接时搜索路径
使用-L. 就属于链接时搜索路径,给ld程序链接时使用的搜索动态库路径;
* 运行时搜索路径
而使用LD\_LIBRARY\_PATH属于运行时搜索路径。可以参考[5.2 动态连接时执行时的搜索路径]( )
* * *
介绍另一种运行时搜索路径的方式,使用-rpath或-R连接选项来指定运行时搜索路径,其优先级高于LD\_LIBRARY\_PATH。可参考[5.2 动态连接时执行时的搜索路径]( )
$ g++ -o main -L. -I. main.cpp -Wl,-rpath .
// 或
$ g++ -o main -L. -I. main.cpp -Wl,-rpath=.
// 或
$ g++ -o main -L. -I. main.cpp -Wl,-R.
$ ldd main
linux-vdso.so.1 => (0x00007fff4a7f0000)
libadd.so => ./libadd.so (0x00007fa770bbc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa770825000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa77045b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa770152000)
/lib64/ld-linux-x86-64.so.2 (0x0000557d67d4b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa76ff3c000)
*
由上面可知: `libadd.so => ./libadd.so (0x00007fa770bbc000)`
$ readelf -d main
Dynamic section at offset 0xdf8 contains 27 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libadd.so]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]
0x000000000000000c (INIT) 0x400778
0x000000000000000d (FINI) 0x400a44
0x0000000000000019 (INIT_ARRAY) 0x600dd8
0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
0x000000000000001a (FINI_ARRAY) 0x600de8
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x400298
0x0000000000000005 (STRTAB) 0x4004a8
0x0000000000000006 (SYMTAB) 0x4002e0
0x000000000000000a (STRSZ) 371 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x601000
0x0000000000000002 (PLTRELSZ) 192 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x4006b8
0x0000000000000007 (RELA) 0x400688
0x0000000000000008 (RELASZ) 48 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400648
0x000000006fffffff (VERNEEDNUM) 2
0x000000006ffffff0 (VERSYM) 0x40061c
0x0000000000000000 (NULL) 0x0
*
由上面可知:`Library rpath: [.]` 表示运行时库的搜索路径。
因此,libadd.so的路径已经被写入了可执行文件中。注意:这里写入的是libadd.so的相对路径,当然也可以写入绝对路径。
$ g++ -o main -L. -I. main.cpp -Wl,-rpath=/home/jack/workspace -ladd
$ ldd main
linux-vdso.so.1 => (0x00007ffeed3b3000)
libadd.so => /home/jack/workspace/libadd.so (0x00007ff2bc9e6000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff2bc64f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff2bc285000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff2bbf7c000)
/lib64/ld-linux-x86-64.so.2 (0x0000555d79140000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff2bbd66000)
$ readelf -d main
Dynamic section at offset 0xdf8 contains 27 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libadd.so]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [/home/jack/workspace]
0x000000000000000c (INIT) 0x400788
0x000000000000000d (FINI) 0x400a54
0x0000000000000019 (INIT_ARRAY) 0x600dd8
0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
0x000000000000001a (FINI_ARRAY) 0x600de8
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x400298
0x0000000000000005 (STRTAB) 0x4004a8
0x0000000000000006 (SYMTAB) 0x4002e0
0x000000000000000a (STRSZ) 392 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x601000
0x0000000000000002 (PLTRELSZ) 192 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x4006c8
0x0000000000000007 (RELA) 0x400698
0x0000000000000008 (RELASZ) 48 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400658
0x000000006fffffff (VERNEEDNUM) 2
0x000000006ffffff0 (VERSYM) 0x400630
0x0000000000000000 (NULL) 0x0
*
* * *
除了上面介绍的动态库运行时搜索路径设置方法之外,还可以通过设置LD\_RUN\_PATH环境变量,它也是把路径编译到可执行文件中,它只设置运行时搜索路径。
$ export LD_RUN_PATH=/home/jack/workspace
$ g++ -I. -L. -o main main.cpp -ladd
./main
5
$ ldd main
linux-vdso.so.1 => (0x00007ffdd91e3000)
libadd.so => /home/jack/workspace/libadd.so (0x00007f2748338000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2747fa1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2747bd7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f27478ce000)
/lib64/ld-linux-x86-64.so.2 (0x000055e88eb4a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f27476b8000)
$ readelf -d main
Dynamic section at offset 0xdf8 contains 27 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libadd.so]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [/home/jack/workspace]
0x000000000000000c (INIT) 0x400788
0x000000000000000d (FINI) 0x400a54
0x0000000000000019 (INIT_ARRAY) 0x600dd8
0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
0x000000000000001a (FINI_ARRAY) 0x600de8
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x400298
0x0000000000000005 (STRTAB) 0x4004a8
0x0000000000000006 (SYMTAB) 0x4002e0
0x000000000000000a (STRSZ) 392 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x601000
0x0000000000000002 (PLTRELSZ) 192 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x4006c8
0x0000000000000007 (RELA) 0x400698
0x0000000000000008 (RELASZ) 48 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400658
0x000000006fffffff (VERNEEDNUM) 2
0x000000006ffffff0 (VERSYM) 0x400630
0x0000000000000000 (NULL) 0x0
*
* * *
另外也可以通过配置/etc/ld.so.conf文件来设置动态库运行时搜索路径,使用root权限在其中加入`/home/jack/workspace`路径,然后使用`ldconfig`命令将/etc/ld.so.conf加载到ld.so.cache中即可。
具体可参考[ldd命令]( )
* * *

最全的Linux教程,Linux从入门到精通
======================
1. **linux从入门到精通(第2版)**
2. **Linux系统移植**
3. **Linux驱动开发入门与实战**
4. **LINUX 系统移植 第2版**
5. **Linux开源网络全栈详解 从DPDK到OpenFlow**

第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**
> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**
> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
更多推荐




所有评论(0)