什么是ELF文件?
Executable and Linkable Format (可执行 和 可链接 格式) : 是一种文件格式, 简称 ELF 格式文件
什么是文件格式?
文件格式:文件中组织数据的形式
高级语言与机器语言
C程序编译步骤
-
翻译阶段: 将高级语言翻译成机器语言
-
链接阶段:将多个独立编译的目标文件和库文件整合成一个可统一执行的程序, 是编译过程的最后一公里
链接阶段有两种方式:
静态链接:将多个可重定位目标文件,合并成一个可执行目标文件
动态链接:推迟链接工作,将部分符号解析和重定位延迟到程序运行时进行
链接阶段做两件事情:
符号解析 & 重定位
1.符号解析
符号解析: 输入的其他的程序模块中的符号表中,为每个外部符号,寻找确定的符号定义,并且关联它们
a.什么是符号定义
截图是main1.c的代码,里面包含了各类符号(
全局,局部,本地,外部)
objbump -t main1.o 就可以查看它的符号表了(如下图)
2.重定位
链接静态库
ELF 可执行可链接格式
ELF - Executable and Linkable Format
ELF文件格式之_可重定位目标文件
(1)可重定位目标文件 —— 经过 预处理、编译、汇编 之后形成的文件
(2)可重定位目标文件 ——输入——》链接器 ——输出——》可执行目标文件
ELF - 可重定位目标文件
ELF 头 + 节(section) + 节头部表
main2.c 的代码如下:
#include<stdio.h>
extern int shared;
int sum(int *a, int n);
int array[2] = {1, 2};
static int m = 10;
int *arr_p = (int*)&array;
int c;
static int swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
static int b = 4;
static int m;
int val = sum(array, 2);
swap(&val, &shared);
printf("%d, %d\n", val, shared);
return val;
}
使用gcc命令,生成汇编文件 main2.o
gcc -c main2.c -o main2.o
使用 objdupm命令,查看各个 section 节中的内容
objdump -Dj .text main2.o 查看 .text 里面的内容
objdump -Dj .rodata main2.o 查看 .rodata 里面的内容
objdump -Dj .data main2.o 查看 .data 里面的内容
objdump -Dj .bss main2.o 查看 .bss 里面的内容
objdupm -t main2.o 查看 .symtab 里面的内容
objdump -rj .text main2.o 查看 .rel.text 里面的内容
objdump -rj .data main2.o 查看 .rel.data 里面的内容
也可查看可重定位目标文件全部内容(以下只列举部分内容)
readelf -a main2.o
ELF Header elf头
Section Headers 节头部表
Symbol table '.symtab' 符号表
ELF文件格式之_可执行目标文件
可执行目标文件 —— 经过 链接阶段 之后形成的文件
ELF - 可重定位目标文件
ELF 头 + 段头部表 + 节(section) + 节头部表
比如:通过gcc命令将 可重定位目标文件"main2.o" , "sum1.o" 链接 成 可执行目标文件 prog2
gcc -o prog2 main2.o sum1.o
通过 readelf 命令查看prog2里面的内容
readelf -a prog2
ELF Header : elf头
Section Headers : 节头部表
Program Headers :段头部表
总结: