二进制文件

1、首先了解一下编译器

Linux中c语言编译器gcc,它编译分为四个阶段:

阶段一:预处理

案例:hello.c文件

#include <stdio.h>

int main(){

        printf("hello,world\n");

}

gcc hello.c -o hello --save-temps --verbose#--save-temps保存编译中间生成的文件,--verbose展示编译过程详细信息

 此过程生成文件:hello.i,主要处理以#号开头的预处理指令。

gcc -E hello.c  -o hello.i#可以直接执行此过程

阶段二:编译阶段

此阶段进行一系列词法分析、语法分析、语义分析等最后生成汇编代码

gcc -S hello.c -o hello.s

gcc -S hello.c -o hello.s  -masm=intel -fno-asynchronous-unwind-tables#生成没有cfi宏的intel格式的汇编指令,cfi宏是调试时用的

 生成的文件内容如下:

printf默认被替换成了puts是因为他们十分类似,gcc优化策略为了提高性能。

阶段三:汇编阶段

汇编指令向机器指令进行翻译,生成文件hello.o

gcc -c hello.c -o hello.o

gcc -c hello.s -o hello.o

此时的目标文件是一个可重定位文件,可以使用objdump命令来查看内容

objdump  -sd hello.o -M intel 

阶段四:链接阶段

默认使用动态链接,这一阶段将目标文件及其依赖库进行链接,生成可执行文件,主要包括地址和空间分配、符号绑定和重定位等操作。通过链接操作,对象文件的中无法确定的符号地址已经被修正为实际的符号地址,程序也就可以被加载到内存中正常执行了。

gcc hello.o -o hello -static  #静态链接的可执行文件

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值