链接
- 编译驱动程序:大多数编译系统提供编译驱动程序,它代表用户在需要的时候调用语言预处理、编译器、汇编器、和链接器。
- 目标文件
目标文件有三种:可重定位目标文件、可执行目标文件和共享目标文件(即动态链接库),个个系统上对目标文件的叫法不一致,Unix叫a.out,Windows NT叫PE(Portable Executable)。现代Unix使用ELF格式(EXecutable and Linkable Format 即可执行和可链接格式)。
下面详细介绍“可重定位目标文件”,下图最左边的一个图。
上图说明了,一个目标文件生成可执行文件,然后加载到内存后的映射等,三个步骤。
ELF头描述了生成该文件的系统的字的大小和字节序。ELF和节头部表之间每个部分都称为一个节(section)
-
.text:已编译程序的机器代码
-
.rodada:只读数据,比如printf语句中的格式串。
-
.data:已经初始化的全局C变量。局部变量在运行时保存在栈中。即不再data节也不在bss节
-
.bss:未初始化的全局C变量。不占据实际的空间,仅仅是一个占位符。所以未初始化变量不需要占据任何实际的磁盘空间。C++弱化BSS段。可能是没有,也可能有。
-
.symtab:一个符号表,它存放“在程序中定义和引用的函数和全局变量的信息”。
-
.rel.text:一个.text节中位置的列表。(将来重定位使用的)
-
.rel.data:被模块引用或定义的任何全局变量的重定位信息。
*.debug:调试符号表,其内容是程序中定义的局部变量和类型定义。
-
.line:原始C源程序的行号和.text节中机器指令之间的映射。
-
.strtab:一个字符串表.
-
可定位目标文件的结构:让你深入了解程序段,数据段,bss段,符号表等等。
-
符号与符号表:符号表是一个数组,数组里存放一个结构体。
typedef struct {
int name; /*String table offset*/
int value; /*Section offset, or VM address*/
int size; /*Object size in bytes*/
char type:4, /*Data, fund,section,or src file name (4 bits)*/
binding:4; /* Local of global(4bits)*/
char reserved; /*Unused*/
char section; /*Section header index ABS UNDEF*/
}Elf_Symbol;