C 编程中的可执行文件、程序执行与函数调用解析
1. 动态链接库与可执行文件格式
动态链接所使用的库被称为动态链接库(DLLs),在 Linux 中则被称为共享库(.so 文件)。动态加载(DL)库是仅在需要时才加载的共享库,常用于插件和动态加载模块。
可执行文件格式有多种,虽然默认的二进制可执行文件名为 a.out,但实际的文件格式可能不同。常见的可执行文件格式包括:
-扁平二进制可执行文件:仅由可执行代码和初始化数据组成,旨在整体加载到内存中直接执行。例如,可引导的操作系统映像通常是扁平二进制可执行文件,这简化了引导加载程序。
-a.out 可执行文件:传统的 a.out 文件由一个头部,以及代码、数据和 bss 部分组成。
-ELF 可执行文件:可执行和链接格式(ELF)文件由一个或多个程序段组成,每个程序段可以加载到特定的内存地址。在 Linux 中,默认的二进制可执行文件是 ELF 文件,更适合动态链接。
2. a.out 文件的内容
为了简单起见,先考虑传统的 a.out 文件。a.out 文件由以下部分组成:
-头部:包含加载信息和 a.out 文件的大小。其中,tsize 是代码段的大小;dsize 是包含初始化全局变量和静态局部变量的数据段大小;bsize 是包含未初始化全局变量和静态局部变量的 bss 段大小;total_size 是要加载的 a.out 的总大小。
-代码段:也称