链接的好处
好处1:模块化
(1)一个程序可以分成很多源程序文件
(2)可构建公共函数库,如数学库,标准C库等
好处2:效率高
(1)时间上,可分开编译。
只需重新编译被修改的源程序文件,然后重新链接
(2)空间上,无需包含共享库所有代码。
源文件中无需包含共享库函数的源码,只要直接调用即可
可执行文件和运行时的内存中只需包含所调用函数的代码
而不需要包含整个共享库
三类目标文件
1、可重定位目标文件 (.o)
- 其代码和数据可和其他可重定位文件合并为可执行文件
- 每个.o 文件由对应的.c文件生成
- 每个.o文件代码和数据地址都从0开始
2、可执行目标文件 (默认为a.out)
- 包含的代码和数据可以被直接复制到内存并被执行
- 代码和数据地址为虚拟地址空间中的地址
3、共享的目标文件 (.so)
- 特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件
- Windows 中称其为 Dynamic Link Libraries (DLLs)
可执行与可链接格式(ELF)
可用来保存上述三类目标文件(可重定位对象文件 (.o), 可执行对象文件 (a.out),共享对象文件 (.so))的标准二进制格式。
- .text:已编译程序的机器代码
- .rodata:即read only data只读数据,比如printf的格式化字符串,switch语句的