编译器怎样得到内存空间
申请空间然后把代码放进去的这个事情是操作系统干的,然后汇编本身有很多相对地址的处理方法,可以弥补这个空缺。然后“常量空间”的地址是可以写死的,堆栈的空间则可以用ebp/esp获得。所以这些都不是问题。
【编译器怎样得到内存空间】 如果你一定要完全明白这个过程的话,得看intel的编程手册。
■网友
编译和运行期的加载是两回事;加载是加载二进制格式 (Comparison of executable file formats )(PE或者elf或者其他),操作系统加载的时候会把不同的数据段加载到不同的内存里。对应汇编编译器,直接生成的就是二进制格式。对应生成汇编的编译器,那当然要看对应汇编语言的语法了。基本的来讲,不同的类型的数据(代码或者数据)要放在不同的section placement里。看看x86的hello world: x86 assembly language。最后在链接器里面,通过链接脚本指定各section的不同地址位置以及其他设置(一般嵌入式开发才会用到)。
■网友
如果想了解细节,可以看《程序员的自我修养》
■网友
基于我的理解 您是问编译器是怎么为制品划分空间的?尝试回答一下。首先,为制品获取虚拟内存地址是链接器的工作。分静态链接和动态链接两种情况简单讨论。当熟悉了符号表和重定位表以后不难理解静态链接是如何划分虚拟地址空间的。简单计算偏移就可以了吧?动态链接当使用类似静态重定向方法来做的时候,和静态链接类似。涉及到当代码地址无关的的时候,使用got处理相关符号地址。上述是链接过程获取内存地址的方法。当制品获取以后,分配内存空间是装载的工作。对于静态链接的制品来说,直接装载。对于动态链接的制品,由操作系统委托动态连接器装载。我是不是跑题了?。。
■网友
编译器简单来说就是读入字节流处理后输出字节流的程序,不用想的太复杂,虽然从读入字节流变换到输出字节流的过程比较复杂,但本质不会改变。就像顶楼所说的,程序加载和内存分配是操作系统的事,编译器只要按预定好的格式(PE,ELF之类的)输出文件就好。
■网友
代码段数据段什么的,写到目标文件指定的位置就可以了吧。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
