C语言到机器语言的过程变化

当我们写好一个helloword的程序,然后用gcc去编译这个helloworld程序,这个过程到底发生了什么事情?
  • 预编译,处理c语言的一些编译器关键字。
  • 编译,从人类可以理解的c语言变到人类不容易理解的汇编语言。gcc -S main.c生成main.s
  • 汇编,从汇编语言变成人类不能理解而机器理解的二进制语言,这时候的函数,变量都没有地址,或是说地址为0. gcc -c main.s 生成的main.o
  • 链接,给函数和变量加地址, 经过这一步链接以后的代码就可以在机器上运行起来了. gcc main.o -o a.out
链接后的可以执行程序在内存是怎么分配的?

把代码分成可以执行部分和数据部分。数据部分分为只读数据,可读可写数据和未初始化。
只读数据区RO :一些const常量数据和一些字符串。
未初始化数据区bss:全局变量,默认值为空。
可读可写数据区stack:函数内的变量。这些数据放到栈里,生存期是在函数进入与退出之间,如果没有初始化这些数据,将是随机值。
可执行部分区text:就是一些运算代码。
动态内存区heap:malloc的数据放在这里
已经初始化的数据区:初始状态不为0的全局变量数据。

思考个问题,为什么汇编后没有链接的点o文件不能执行?

因为点o文件的地址都为0.
根据内存的内容的分布,就可以做相应的程序动态加载运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值