基本概念
预编译—>编译—>汇编—>链接
宏定义代替,预编译命令,文本去注释—>.S—>.O—>ELF
文本变成中间文件, 也就是编译+汇编的过程:
词法分析,语法分析,语义分析,中间过程优化
ELF文件
ELF是一种二进制可执行文件.
目标文件(*.obj
)和最终可执行文件(ELF格式)统称为ELF文件.
另外*.a *.so coredump
文件也都是ELF文件的不同类型.
最重要的是,数据是分段存储,不同段的有不同的功能.段的类型:
为了后面装载的方便,段在链接期间,是可以合并,优化空间的,
例子
以a.c, b.c为例子:
//in a.c
#include <stdio.h>
extern int shared;
int main(int argc, char* argv[])
{
int a = 100;
swap(&a, &shared);
printf("shared %d\n", shared);
return 0;
}
//in b.c
int shared = 99;
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
编译(包含中间文件):
gcc a.c b.c -c -o ab
查看所有elf信息:
➜ compile-link-lib readelf -a ab
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x5a0
Start of program headers: 64 (bytes into file)
Start of section headers: 6584 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000000238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000000254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000000274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000000298 00000298
000000000000001c 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 00000000000002b8 000002b8
00000000000000c0 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 0000000000000378 00000378
000000000000009f 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 0000000000000418 00000418
0000000000000010 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000000000000428 00000428
0000000000000030 0000000000000000 A 6 1 8
[ 9] .rela.dyn RELA 0000000000000458 00000458
00000000000000c0 0000000000000018 A 5 0 8
[10] .rela.plt RELA 0000000000000518 00000518
0000000000000030 0000000000000018 AI 5 22 8
[11] .init PROGBITS 0000000000000548 00000548
0000000000000017 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000000560 00000560
000000000000