CTF-All-In-One/doc/1.5.3_elf.md
2017-07-20 23:44:41 +08:00

2.1 KiB
Raw Blame History

Linux ELF

一个实例

1.5.1节 C语言基础 中我们看到了从源代码到可执行文件的全过程,现在我们来看一个更复杂的例子。

#include<stdio.h>

int global_init_var = 10;
int global_uninit_var;

void func(int sum) {
    printf("%d\n", sum);
}

void main(void) {
    static int local_static_init_var = 20;
    static int local_static_uninit_var;
    
    int local_init_val = 30;
    int local_uninit_var;
    
    func(global_init_var + local_init_val + 
         local_static_init_var );
}

然后分别执行下列命令生成两个文件:

gcc -c elfDemo.c -o elfDemo.o

gcc elfDemo.c -o elfDemo

使用 ldd 命令打印所依赖的共享库:

$ ldd elfDemo
	linux-gate.so.1 (0xf76e3000)
	libc.so.6 => /usr/lib32/libc.so.6 (0xf74e5000)
	/lib/ld-linux.so.2 (0xf76e5000)

此时他们的结构如图:

可以看到ELF 文件的开头是一个“文件头”,之后分别是代码段、数据段和.bss段。程序源代码编译后执行语句变成机器指令保存在.text段已初始化的全局变量和局部静态变量都保存在.data段未初始化的全局变量和局部静态变量则放在.bss段。

目标文件

ELFExecutable Linkable Format是 Linux 的可执行文件格式,是 COFF Common file format格式的变种。目标文件主要分为三种类型

  • 可重定位文件Relocatable file
    • 包含了代码和数据,可以和其他目标文件链接生成一个可执行文件或共享目标文件。
    • elfDemo.o
  • 可执行文件Executable File
    • 包含了可以直接执行的文件。
    • elfDemo
  • 共享目标文件Shared Object File
    • 包含了用于链接的代码和数据,分两种情况。一种是链接器将其与其他的可重定位文件和共享目标文件链接起来,生产新的目标文件。另一种是动态链接器将多个共享目标文件与可执行文件结合,作为进程映像的一部分。
    • libc.so.6