浅学 ELF 格式文件

0 阅读3分钟

什么是ELF文件?

Executable and Linkable Format (可执行 和 可链接 格式) : 是一种文件格式, 简称 ELF 格式文件

什么是文件格式?

文件格式:文件中组织数据的形式

高级语言与机器语言

image.png

C程序编译步骤

image.png

  • 翻译阶段: 将高级语言翻译成机器语言

  • 链接阶段:将多个独立编译的目标文件和库文件整合成一个可统一执行的程序, 是编译过程的最后一公里

image.png

链接阶段有两种方式:

静态链接:将多个可重定位目标文件,合并成一个可执行目标文件

动态链接:推迟链接工作,将部分符号解析和重定位延迟到程序运行时进行

链接阶段做两件事情:

符号解析 & 重定位

1.符号解析

符号解析: 输入的其他的程序模块中的符号表中,为每个外部符号,寻找确定的符号定义,并且关联它们

a.什么是符号定义 image.png 截图是main1.c的代码,里面包含了各类符号(全局局部本地外部)

objbump -t main1.o   就可以查看它的符号表了(如下图)

image.png

2.重定位

image.png

链接静态库

image.png image.png image.png

ELF 可执行可链接格式

ELF - Executable and Linkable Format image.png

ELF文件格式之_可重定位目标文件

(1)可重定位目标文件 —— 经过 预处理、编译、汇编 之后形成的文件

(2)可重定位目标文件 ——输入——》链接器 ——输出——》可执行目标文件

ELF - 可重定位目标文件

ELF 头 + 节(section) + 节头部表 image.png 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头 image.png Section Headers 节头部表 image.png Symbol table '.symtab' 符号表 image.png

ELF文件格式之_可执行目标文件

可执行目标文件 —— 经过 链接阶段 之后形成的文件

ELF - 可重定位目标文件

ELF 头 + 段头部表 + 节(section) + 节头部表

比如:通过gcc命令将 可重定位目标文件"main2.o" , "sum1.o" 链接 成 可执行目标文件 prog2

gcc -o prog2 main2.o sum1.o

image.png

通过 readelf 命令查看prog2里面的内容

readelf -a prog2

ELF Header : elf头

Section Headers : 节头部表

Program Headers :段头部表

image.png 总结: image.png

一个运行的程序需要多少内存

一个程序的内存布局.png

系统占用内存.png