ELF文件结构描述
- ELF HEADER : 描述ELF文件信息
- Section Table :各个段的信息,段名,长度等
- rel.text :重定位表
- string:符号的名字
- symtab:符号表,符号以及对应的值
- text: 代码段
- .data .rodata : 分别存放初始化的静态变量,只读常量
- bss: 未初始化的静态变量
//其他段
- comment:注释
- 符号是变量与函数的统称
- 由于c++与c对修改符号签名的方式不一样,所以为了保证c++能够正确链接c函数的库,c++需要进行这样的操作,可保证这部分按照c的形式修饰符号。
extern "C" {}
- 编译器将全局未初始化的变量定义为弱符号
- 编译器本生不支持弱变量类型的检查,下面是可以正常编译的
double a=1; //a.cpp
extern int a; //main.cpp
-
函数级别的链接,可以避免链接其他不用的函数,来达到省内存的目的。
-
C 运行时库把不同的操作系统做了兼容,包装成固定的接口。
系统中断
操作系统如何进入中断:
- int 0x2e可以触发 (windows)
- int 0x80可以触发 (linux)
以linux 为例, 常见的系统调用实际上是一个"二级"调用
- 将中断号存入eax寄存器(系统调用函数)
- int 0x80为例 (0X80 指的是中断向量表中的函数)
- 获取中断号(80),并且执行对应函数。