C语言学习

机器语言 -> 汇编语言 -> C语言(中级语言)->

C语言兼顾底层和顶层

//////////////////////////////////////////
gcc编译器,帮我们翻译成二进制文件(机器码)

用objdump -d xxx(目标)可查看二进制文件(16进制方式打印出来)

<_start>是入口

也是入口
//////////////////////////////////////////
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 等等全部展开

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.跳到真正的代码入口开始执行
/////////////////////////////////////////

编译过程是先在内存中编译,完成后生成新文件并保存到磁盘中。

你可能感兴趣的:(C语言)