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 进行学习会轻松一些,因为有些一些理论对于初学者还是有难度的

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