1、序言
此篇文章主要用来记录《程序员的自我修养--链接、装载与库》这本书的学习笔记
2、计算机的硬件结构框架
预处理(Preprocessing)--编译(Compilation)--汇编(Assembly)和链接(Linking)
2.1 模块的拼接--链接(Linking)
链接过程主要包括了地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等;
链接器进行地址修正的过程也被叫做重定位(Relocation),每个要被修正的地方叫一个重定位入口(Relocation Entry);
3、目标文件里有什么
3.1 目标文件的格式
PC平台流行的可执行文件的格式主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),都是COFF格式的变种;
3.2 深入挖掘.o文件
objdump -h xxxx.o # 打印主要段的信息
objdump -x xxxx.o # 打印更多的详细信息
objdump -s xxxx.o # 将所有段的内容以16进制方式打印出来
objdump -d xxxx.o # 或者-S 将所有包含指令的段反汇编
objdump -t xxxx.o # 查看所有的符号以及他们所在段
readelf -h xxxx.o # 查看.o文件的文件头详细信息
readelf -S xxxx.o # 显示.o文件中的所有段,即查看段表
size xxxx.o # 查看.o文件中各个段所占大小
nm xxx.o # 查看.o文件中所有的符号
行:
.text: 代码段(存放函数的二进制机器指令)
.data: 数据段(存已初始化的局部/全局静态变量、未初始化的全局静态变量)
.bss: bss段(声明未初始化变量所占大小)
.rodata: 只读数据段(存放""引住的只读字符串)
.node.GNU-stack: 堆栈提示段
列:
Size: 段的长度
File off: 段的所在位置(即距离文件头的偏移位置)
段的属性:
CONTENTS: 表示该段在文件中存在
ALLOC: 表示只分配了大小,但没有存内容
4、Linux内核装载ELF过程
bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件;
ELF可执行文件的装载处理过程叫做load_elf_binary()
5、共享库版本命名
libname.so.x.y.z
lib是前缀,name是so的名字,so是后缀
“x”表示主版本号,“y”表示次版本号,“z”表示发布版本号
Linux下一个进程里典型的内存布局
6、书籍推荐
《Linkers and Loaders》,John R. Levine
《Intel® 64 and IA-32 Architectures Software Developer's Manuals》,Intel官方的x64和x86CPU的技术手册
《Linux内核源代码情景分析》,毛德操,胡希明
《深入理解计算机系统》
《深入解析Windows操作系统,第四版--Microsoft Windows Server2003/Windows XP/Windows 2000技术内幕》
《Advanced Pragramming in the UNIX Environment, Second Edition》
7、参考文献
https://blog.csdn.net/gt1025814447/article/details/80442673