编译原理学习笔记02--链接、装载与库

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值