机器语言 -> 汇编语言 -> C语言(中级语言)->
C语言兼顾底层和顶层
//
gcc编译器,帮我们翻译成二进制文件(机器码)
用objdump -d xxx(目标)可查看二进制文件(16进制方式打印出来)
<_start>是入口
<main>也是入口
//
gcc生成的二进制文件组成(两部分):
1. crt1.o(汇编代码) -> <_start> (系统提供) crt1是某个依赖库
_start调用main函数,返回值返回给_start
<0都被认为是错的
2. xxx.o(用户开发)
--------------------------------------------------------
补充:Java是用Java解析器变成C语言,再进行编译处理。
gcc编译过程
1.预处理阶段 #gcc test.c -E -o test.i
展开头文件/宏替换/去掉注释/条件编译
如:将#include <stdio.h>等等全部展开
2.编译阶段 #gcc test.i -S -o test.S
检查语法,生成汇编
用到编译工具来做的
3.汇编阶段 #gcc test.S -c -o test.o
汇编代码转换机器码
.o文件中可以看到ELF?
4.链接阶段 #gcc test.o -o test.elf(拥有合法内存执行的二进制文件)
链接到一起生成可执行程序(用到链接工具)
添加各种地址信息到headinfo段中(改变地址)
--------------------------------------------------------
开发平台(ubuntu自带)gcc编译器和各种依赖库
--------------------------------------------------------
代码执行本质:
1.代码的加载处理
2.跳到真正的代码入口开始执行
/
编译过程是先在内存中编译,完成后生成新文件并保存到磁盘中。