一、静态ELF加载器:实现
可执行文件
1、一个描述了状态机的初始状态(迁移)的数据结构
(1)不同与内存的数据结构,指针都被偏移量代替
(2)数据结构各个部分定义:/usr/include/elf.h
加载器(loader)
1、解析数据结构+复制到内存+跳转
2、创建进程运行时初始状态(argv,envp)
搬移可执行文件头与文件内容
构建执行初始化的堆栈
栈指针跳转
二、Linux内核加载
1、编译
(1)解压
(2)配置make menuconfig(生成.condif文件)
(3)编译make bzImage -j4 (-j 是多线程(CPU)编译编译)
2、编译结果
(1)vmlinux(elf格式的内核二进制代码)
(2)vmlinuz(压缩的镜像,可以直接被QEMU(由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器软件)加载)
(3)readelf入口地址0x1000000(物理内存16M位置)
__startup_64:调试起来
三、动态链接和加载
减少库函数的磁盘和内存拷贝
1、每个可执行文件里都有所有库函数的拷贝太浪费磁盘或者内存
2、主要遵循基本约定,不挑库函数的版本
大项目的fenjie
1、编译一部分,不用重新链接
LOAD(lib.dl)//加载动态库
IMPORT(lib_fun_Symbol)//加载外部符号
EXPORT(lib_fun_Symbol)//动态库导出符号
四、GOT与PLT
GOT: Global Offset Table
PLT:Procedure Linkage Tabel