赞
踩
编译完毕的代码无非分为指令与数据两部分。
为了做好隔离,为上层应用提供更简单的接口。
也称为虚拟内存,每一个应用程序都有自己的虚拟地址空间,若地址总线为 32 位,则虚拟地址空间为 2 ^ 32 = 4G。
虚拟地址空间结构:
也称为共享库,比如:libc.so / libc++.so,只要使用 #include <stdio,h> 这种标准 C 库头文件就会链接到 libc.so
生成main.i
生成main.s
代码的优化
汇总所有的符号
生成*.o .ojb 二进制可重定位目标文件
构建.o *obj的格式
*.o 二进制可重定位目标文件为何不可运行?
编译之后的 .s 文件中充斥着各种汇编指令: mov add lea sub
汇编指令有两种,根据特定平台将汇编指令翻译为对应的机器码:
只有数据才产生符号,指令只有函数名才产生符号。
生成elf文件
可直接运行的文件。不管 obj 文件还是可执行文件都有 ELF Header。这里面记录了 main 函数的入口地址。
可执行文件与 obj 文件的区别的在于在 ELF Header 后面紧跟了 program headers。
在 program headers 不同页表中记录了所需的段。
其作用主要是通过两个 LOAD 指定页表上的段。比如下方例子(run 是编译生成的可执行文件)表示第一个 LOAD 中包含 .text 段。第二个 LOAD 包含 .data 段与 .bss 段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。