代码链接

nber1994

All
Posts
Categories
Tags
About

代码链接

    ❐os


编译过程

  1. 程序预处理器将代码文件处理为ascii码的文件main.i
  2. 编译器将main.i文件翻译为汇编文件main.s
  3. 汇编器将main.s翻译为一个可重定位目标文件 main.o
  4. 链接器将main.o和sum.o组合起来,创建一个可执行目标文件
  5. shell调用加载器,加载可执行目标文件,将代码和数据加载到内存中执行

链接器的工作

目标文件

Linux中目标文件的格式ELF文件

ELF的头是一个16字节的固定序列,包含一些基本信息,包括目标文件的类型,机器类型,节头部表偏移量
在ELF头和节头部表之间的一些节
.text 已经编译程序的机器代码
.rodata 只读数据 类似于代码中的硬编码 sprintf(‘%s’)
.data 已初始化的全局&静态变量 (局部变量在运行时保存在栈中)
.bss 未初始化的全局变量&静态变量,以及被声明为0的全局&静态变量

静态链接库

可执行目标文件 可执行文件包含只读内存段(代码段)和读写内存段(数据段)
ELF头中还包含程序的入口点,即第一条指令的地址

加载可执行目标文件

运行时的内存映像 代码段总是从0x400000地址开始的,之后是数据段
数据段之后是堆,堆后面的内存是为共享模块保留的
用户栈总是从最大的合法地址开始向下延伸,之后的是内核内存

动态链接共享库

位置无关代码

动静态链接共享库区别