(十三)程序编译与可执行文件

本专栏总结王利涛《C语言嵌入式Linux高级编程》第三期课程

一、程序的编译、链接

在这里插入图片描述

二、可执行文件的组装

在这里插入图片描述
链接器将不同.o文件的相同段组合在一起

三、编译过程

1)特点

  • 不是“一步到位”、“一气呵成”,而是环环相加;
  • 分为预编译、编译、汇编、链接阶段;
  • 每个阶段调用不同的工具去完成;
  • 上一编译的输出作为下一编译阶段的输入。

2)输入与输出

  • 预处理:源文件.c -----》处理后的源文件为 .i 文件
  • 编译:源文件 .i -------》变成汇编文件 .s
  • 汇编:汇编文件.s -------》生成目标文件.o
  • 链接:可重定位目标文件 .o ---------》生成可执行目标文件(ELF格式)

四、思考

为什么不直接生成可执行文件?

  • 1)GNU的思想:一个工具只干一件事情;
  • 2)计算机工业思维:标准接口 + 分层
    • 简化编译器的工作,提高工具的复用性;
    • 适配更多的平台、CPU架构、指令集。

五、目标文件

1)目标文件

  • objectfile
  • 查看目标文件类型:file main.o /a.ou/test.so/test.a

2)分类

  • 可重定位目标文件(relocatable files)
  • 可执行目标文件(executable files)
  • 可被共享目标文件(shared object file)

3)可执行文件(ELF)

  • executable and linking format

六、ELF可执行文件结构

1)文件构成

  • 由section组成,由section header table描述的一系列section集合;
  • 查看节头表:$ readelf -S
  • .text: 可执行指令代码;
  • .data: 初始化的全局变量和静态局部变量;
  • .bss : 未初始化的全局变量;
  • .rodata: 字符串、常量及printf打印的字符串常量等;

2)描述信息

  • ELF header:描述文件类型、要运行的处理器平台等信息;
  • program header table:描述一个文件中由哪些段segment, 一个段通常由几个section组成,段是给加载器使用的;
  • section header table:描述文件中有哪些section,section是给链接器使用的;
  • .strtab: 字符串表,存放函数名、变量名,用于调试,反汇编;
  • .symtab: 符号表,存放符号的地址等。

猜你喜欢

转载自blog.csdn.net/weixin_38956024/article/details/107558795
今日推荐