原创 运行c代码前发生了什么

2018-9-13 10:53 8945 32 9 分类: MCU/ 嵌入式

众所周知,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 "…,好好的一篇科普文变成了推荐阅读文(手动笑哭)

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

参考资料

文章评论2条评论)

登录后参与讨论

allen_zhan_752827529 2019-2-9 09:47

如果我没记错的话, 你的编译环节疑问, 与上述描述的编译器操作无关. 答案应在任何一本"操作系统"的教学书籍中. '.o' 目标文件, 顾名思义, 编译器生成的中间目标代码, 使用的都是参考地址. 链接(link)的环节使各个 .o 目标地址与具体的物理地址(在这个你提及的 case 中, 是 ARM 的 memory space)相对应. 我从业快 20年了, 最近越来越深的体会是, 理论基础的重要性. 因为并非科班出身, 所以需要网上参考, 或赴往书店科技栏目直接购买. 然后是异常痛苦, 没有直接收益而大量花费时间的学习过程. 给你参考.

wjx943_536273043 2018-9-18 20:55

分享
相关推荐阅读
greedyhao 2019-03-17 09:03
uboot链接脚本分析
上一篇uboot主编译脚本分析的编译选项参数中提到了链接脚本这么个东西我也是写到这里才开始了解链接脚本(Linker command scripts),之前只是大概知道有这么一个东西先从参考资料中的内...
greedyhao 2018-11-28 08:49
51总线方式获取adc0809数值
最近单片机有一个实验挺有意思的,使用51单片机以总线的方式读取adc0809的数据先补充点关于单片机总线的预备知识,我一开始不了解总线的时候做这个实验也是很懵逼的。单片机的三总线结构​51单片机有三条...
greedyhao 2018-09-29 21:18
对Xil_Out32未定义的引用
第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。在创建好工程,写完工程代码后,发现报错如下./src/led_controller_test_tut_4A.o:在函数‘main’...
greedyhao 2018-09-29 21:12
Vivado生成Bitstream失败的解决方法
跟着实验指导书,难得的又遇到问题了,在最后生成Bitstream的时候出错了,无法生成Bitstream。报错信息如下[DRC NSTD-1] Unspecified I/O Standard: 4 ...
greedyhao 2018-09-17 22:26
zybo初体验
前段时间过生日,亲戚给了些钱让我自己买生日礼物,早就想搞一块zynq的板了,但是淘宝一看太贵,于是去咸鱼上淘了一块二手的ZYBO(谁知道是不是二手,反正看着挺新)来玩玩。学习肯定是从官方资料开始的,T...
我要评论
2
32
关闭 站长推荐上一条 /2 下一条