gcc编译流程

演示流程

在这里插入图片描述

  • gcc -v 查看gcc版本
  • cd fanzhuan 切换演示目录
  • sudo vim hello.c 查看源代码
  • gcc -E hello.c -o hello.i 预处理
  • gcc -S hello.i -o hello.s 编译
  • gcc -c hello.s -o hello.o 汇编
  • gcc -c hello.c 前三个过程可以合并为一条命令 源代码->目标文件
  • gcc hello.o -o hello 链接
  • gcc hello.c -o hello 四个过程可以合并为一条命令 源代码->可执行文件
  • ./hello 运行可执行文件
  • objdump -h hello.o 查看目标文件
  • readelf -S hello.o 查看段表
  • readelf -s hello.o 查看符号表
  • gcc hello.c hello2.c -o hello2 编译两个.c文件,不能同时有两个main函数
  • gcc -g -Wall hello.c -o hello 将调试信息写入目标文件,Wall开启警告

编译步骤及说明

步骤命令说明
预处理gcc -E hello.c -o hello.i1. 将所有#define删除,并且展开所有的宏定义
2. 处理所有的条件预编译指令,如#if #ifdef #undef #ifndef #endif #elif
3. 处理#include,将包含的文件插入到此处,这是一个递归的过程
4. 删除所有注释 // /* */
5. 添加行号和文件名标识,以便于编译时产生的错误警告能显示行号
6. 保留#pragma编译器指令
编译gcc -S hello.i -o hello.s将预处理完的.i文件进行一系列的词法分析、语法分析、语义分析及优化后生成响应的汇编代码文件,这是整个程序构建的最核心的部分,也是最复杂的部分
汇编gcc -c hello.s -o hello.o或者as hello.s -o hello.o汇编是将第二步生成的汇编代码编程机器可执行的指令,每一个汇编语句几乎都对应一条机器指令
链接链接动态库和静态库

基本编译流程

  1. gcc -E hello.c -o hello.i 预处理
  2. gcc -S hello.i -o hello.s 编译
  3. gcc -c hello.s -o hello.o 汇编(生成目标代码)

编译后成成的文件
在这里插入图片描述

  1. gcc -c hello.c 直接进行编译

目标文件

目标文件就是源代码经过编译后但未进行链接的那些中间文件Linux下的 .o文件就是目标文件,目标文件和可执行文件内容和格式几乎都一样,所以我们可以广义地将目标文件和可执行文化看成一类型文件。他们都是按照ELF文件格式存储的。

查看目标文件命令

命令说明
objdump -h filename.o打印主要段的信息
objdump -x filename.o打印更多的详细信息
objdump -s filename.o将所有段的内容以16进制方式打印出来
objdump -d filename.o 或者-S将所有包含指令的段反汇编
objdump -t filename.o查看所有的符号以及他们所在段
readelf -h filename.o查看.o文件的文件头详细信息
readelf -S filename.o显示.o文件中的所有段,即查看段表
readelf -s filename.o查看符号表
size filename.o查看.o文件中各个段所占大小
nm filename.o查看.o文件中所有的符号

演示

  • objdump -h hello.o 查看目标文件

在这里插入图片描述
行字段说明:

字段说明
.text代码段(存放函数的二进制机器指令)
.data数据段(存已初始化的局部/全局静态变量、未初始化的全局静态变量)
.bssbss段(声明未初始化变量所占大小)
.rodata只读数据段(存放 " " 引住的只读字符串)
.comment注释信息段
.node.GUN-stack堆栈提示段

列字段说明

字段说明
Size段的长度
File Off段的所在位置(即距离文件头的偏移位置)

段的属性说明

段属性说明
CONTENTS表示该段在文件中存在
ALLOC表示只分配了大小,但没有存内容
  • readelf -S hello.o 查看段表

在这里插入图片描述

  • readelf -s hello.o 查看符号表
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值