美文网首页
运行c代码前发生了什么

运行c代码前发生了什么

作者: greedyhao | 来源:发表于2018-09-13 10:51 被阅读0次

众所周知,c代码也是一种比较高级的语言了,机器是没有办法直接运行的,机器所能理解的只有机器码--那一串0和1而已。

虽然早就知道c代码是先经过编译链接最后才放在机器上执行,但是在这么一个过程中究竟发生了什么,最近在学习嵌入式裸机开发中,才又有了更深入的了解。

简单描述一下生成机器代码过程

编译过程

编译过程是以前就知道了的,预编译会对一些带#号的预编译命令处理,如#define等,编译器会对他们进行替换得到.i文件,然后进一步编译得到.o文件。

链接过程

在将源文件编译成可执行文件时,有一个过程是链接。

其实我以前就对这个链接过程感觉有些不解的,这个链接过程到底是怎么把这些.o文件链接在一起,是有一种什么样的规则呢,总不可能随便链接的吧,随便链接的话怎么解决依赖问题。

直到之前了解了一下alios系统,在学习的过程中发现,在芯片架构的支持中,有一个elf文件,里面定义了一些地址,当时还不知道有什么用;最近学习裸机开发中,也遇到了这么一个类似的lds文件。

通过学习,才知道,原来这种文件定义了各个段如代码段、数据段等的地址,这样编译器在链接的过程中,就知道了要把各种.o文件以什么样的顺序链接,链接在什么地址处。

准备c语言运行环境

这是我在网上找的图,从图中可以看出,为了使c程序可以执行在目标处理器,链接的过程中,还混入了一些其他的东西,比如Startup Code。

在Startup Code中,会做一系列的事,比如关中断、重定位、申请栈空间等等,具体过程和硬件相关。

最后跳转到main()。

网上有一篇基于ARM介绍这些相关知识的,非常建议去看看,可以解决自己以前嵌入式编程的很多疑惑。

http://www.bravegnu.org/gnu-eprog/c-startup.html

篇外话

这篇博文是在接触到了一些启动代码后突然有的想法,就开始整理自己的思路,写的同时,在谷歌上查找自己疑惑的地方,从runtime environment查到startup code,结果发现自己疑惑的地方却更多了O__O "…,好好的一篇科普文变成了推荐阅读文(手动笑哭)

非常建议看看下面给出的参考资料,相信对初学者会有很大帮助。

参考资料

C Startup

Microchip Developer Help

Flow of Startup code in an embedded system , concept of boot loader?

C 如何编译出一个不需要操作系统的程序?

数据段、代码段、堆栈段、BSS段的区别

Linux进程的五个段(数据段、代码段、bss、堆栈段)


相关文章

  • 运行c代码前发生了什么

    众所周知,c代码也是一种比较高级的语言了,机器是没有办法直接运行的,机器所能理解的只有机器码--那一串0和1而已。...

  • Go 调用dll

    运行结果 go代码 c++代码(.cpp) c++代码(.h) c++代码(.def)

  • Runtime

    C语言 编写代码 -> 编译链接 -> 运行 编译是什么,运行结果就是什么OC Runtime 运行时,提供了...

  • 代码注入

    在学习代码注入之前,先看一下iOS 程序 main 函数之前发生了什么 一、framework形式代码注入 1.创...

  • runtime总结

    1.什么是运行时 1>运行时是套纯C语言的API(纯C语言库)2>编译器最终都会将OC代码转化为运行时代码3>利用...

  • C++类型相当于C检测加强

    以上代码C运行通过C++报错

  • 构建哈夫曼树并求解对应叶子节点对应的哈夫曼编码

    C语言代码实现 运行结果:

  • cJSON学习记录

    test.c源代码 Makefile 运行结果 test.c 运行结果 test.c 输出结果 test.c 输出...

  • Kotlin Puzzlers -1

    代码: 运行后输出什么呢?a. Does not compileb. Prints “Hello, World”c...

  • 进入首页前发生了什么

    手指无聊的在手机屏幕上滑动,N多程序跟着手指左左右右的翻来覆去,忽然眼角扫见了一个亮眼的程序,仔细一打量觉得有点意...

网友评论

      本文标题:运行c代码前发生了什么

      本文链接:https://www.haomeiwen.com/subject/sifwgftx.html