1. Gcc编译流程:源文件预处理生成.i文件--->.i文件编译为汇编语言生成.s文件----->汇编语言文件经过汇编生成目标文件.o文件------->将各模块目标文件连接生成可执行文件。
2. gcc常用选项
-c 进行预处理、编译、汇编生成.o文件但不进行连接。
-S进行预处理、编译生成汇编文件但不进行汇编。
-E进行预处理、但是不进行汇编。
-o完整进行四步,生成可执行文件。
-I 指定include包含文件的搜索目录。
-g 生成调试信息,用于GDB等调试器调试。
3. 目标文件:可重定位目标文件、可执行目标文件、共享目标文件(.so文件,运行时动态加载)。
4. ELF是linux下最常用的目标文件格式。包括两个组成部分:ELF文件头和目标文件段。ELF文件头包括生成该文件系统的字长及字节序,ELF文件头大小,目标文件类型,目标机的类型。
5. ELF目标文件的段包括:
.txt 代码段,存储二进制机器码。
.rodata 只读数据段,存储复杂常量如字符串。
.data 数据段,存储全局变量和静态变量。
.bss 块存储段,存储未被明确初始化的全局数据。表示加载到内存中时需要预留的空间,但不占用实际的空间。提高磁盘的存储空间利用率。
以上四个段在程序运行时,会被实际加载到内存中。以下为辅助程序进行链接和加载的信息。
.symtab:符号表。 .rel.text:代码段重定位信息(如函数名和标号)。.re.data:数据段需要重定位信息。 .debug:调试信息。 .line:源程序行号映射。 .strtab:字符串表。
6. 程序库包含了一些通用的函数及可执行码的文件。包括静态库(运行前加入执行码)和动态库(程序启动时加入,可多执行程序共享)。
7. 静态库 xxx.a 创建静态库:eg. ar rcs static_lib.a static_lib.o 。 在使用时,后面加上 -l 参数指定静态库或者-L参数指定库文件搜索路径(最好在命令行末尾)。
8. gcc工具链包括ar、as、id、nm、size等。