深入理解动态链接和静态链接

1.如何理解静态链接

下面的这个是老师的板书里面的内容:

1)hello.o 文件是 hello.c 文件编译之后得到的,里面的这个 code.o 也是一样的道理

2)两者进行链接之后形成了我们的可执行文件 exe;

3)我们通过实操其实是可以发现,在这个.o 文件里面对应的函数地址都是 00 00 00 00 反汇编文件里面的 8e 表示的就是 call 对应的函数,左边表示的是对应的机器码;

其中这个函数的具体的属性表示的就是 undifined,也就是没有定义的;

4)但是连接之后,对应的块进行合并处理之后,函数找到自己需要的模块,这个地址就被修改成为我们的函数的真正的地址;

下面的这个展示的就是我们的 ELF 文件格式里面的具体组成部分,包含的内容,右边的这个是使用 linux 指令打印出来的这个 ELF header 这里面的具体的内容;

我们可以发现这个 header 里面的内容,实际上表示的是我们的这个 ELF 文件里面的每一个部分的相关的属性,比如这个大小之类的,都是使用字节作为属性的大小单位的;

因此,我们为什么说这个.o 文件是地址重定位的文件,因为不同的 o 文件进行合并的时候都会修正这个函数的地址为真实存在的地址,而不是 o 文件没有进行链接的时候的无法识别的地址;

2.关于动态链接

在这个部分以及后续的文章里面我会使用新的形式去写博客,就是这个 listenhub 的播客的形式,我觉得这个可以帮助我们理解,我很想把这个链接贴上来,让大家自己去听听,但是平台的管控非常严格,想要的可以私信我,我发给大家;

listenhub 里面的播客就是两个人对话的形式,对于这个动态链接里面的相关的内容进行介绍和讲解;

ELF 格式的文件的几个组成的部分:

下面是播客里的关于:结头表和程序头表的介绍,链接的时候需要使用 section header table;

至于他们在 ELF 文件里面的具体位置:可以参考下面的这个

程序头表是给加载器使用的:

关于其他的组成部分的介绍:

BSS 是仅仅声明,但是没有使用的全局变量;

关于虚拟地址和物理地址的理解:

CPU 如何根据页表找到这个对应的物理地址进行访问执行的:

关于动态链接,地址无关性的理解:

PS:上面就是播客,两人对话的音频,感兴趣的可以私信我获取,我可以分享给大家;

我觉得使用这样的形式对于 linux 进行学习会轻松一些,因为有些一些理论对于初学者还是有难度的

最后放一张图,上面的这个图是老师上课绘制的关于这个动态链接的时候我们的动态库里面的代码是如何共同使用的;

相关推荐
^乘风破浪^9 小时前
Ubuntu部署Xingrin(星环)企业级漏洞扫描与资产管理平台
linux·运维·ubuntu
Lueeee.9 小时前
内核模块符号的导出
linux·运维·服务器
C语言魔术师9 小时前
【linux】linux进程概念(四)(环境变量)
linux·运维·服务器
松涛和鸣9 小时前
DAY32 Linux Thread Programming
linux·运维·数据库·算法·list
eggrall9 小时前
《gdb 与 cgdb 深度解析:命令行调试的效率革命》
linux
晨曦夜月9 小时前
头文件与目标文件的关系
linux·开发语言·c++
白仑色9 小时前
java中的anyMatch和allMatch方法
java·linux·windows·anymatch·allmatch
yimengsama9 小时前
VMWare虚拟机如何连接U盘
linux·运维·服务器·网络·windows·经验分享·远程工作
松涛和鸣10 小时前
32、Linux线程编程
linux·运维·服务器·c语言·开发语言·windows
꧁坚持很酷꧂10 小时前
把虚拟机Ubuntu中的USB设备名称改为固定名称
linux·数据库·ubuntu