ELF 文件类型

ELF (Executable Linkable Format) 是linux下的可执行文件格式,与windows下的PE (Portable Executable) 格式一样,都是COFF (Common File Format)文件格式的变种。在linux下除了可执行文件,编译过程中产生的目标文件(.o 文件),动态链接文件(.so文件),静态链接库文件(.a 文件) ,核心转储文件(Core Dump File)都按照 ELF 格式存储。查看ELF文件类型可以用file命令

[code language="bash"]

$ file /lib/libc-2.11.2.so

/lib/libc-2.11.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

[/code]

ELF 文件结构

ELF文件结构在 /usr/include/elf.h 中有完整定义

一些有用的命令:

file elf_ile 输出ELF各个段的size

readelf [options] elf_file

-S 输出 section header

-t 输出符号表 symbol table

-h 输出ELF文件头信息

objdump [options] elf_file

-h 输出文件基本ELF信息

-d 反汇编代码段

-s 输出完整内容

-r 查看重定位表

-D 反汇编所有段内容

-S 输出内容包含源代码(需要gcc -g 参数支持)

ELF结构中比较重要的几个段:

.data 数据段,存放已经初始化的全局/静态变量

.bss(Block Started by Symbol) 存放未初始化的全局变量和静态变量,因为这些变量

在程序加载的时候都会被初始化为零,所以不需要存放实际的数据,只需要预留位置

就可以了。

.text 代码段,存放源代码编译后的机器指令

.rodata 只读数据段,存放只读变量

.symtab(Symbol Table) 符号表

.strtab(String Table) 字符串表

.plt(Procedure Linkage Table) 动态链接跳转表

.got(Global Offset Table) 动态链接全局入口表

动态链接和静态链接

在静态链接过程中,编译器将需要重定位的符号写在ELF结构中的重定位表(Relocation Table)内,之后链接器(Linker)分析重定位表,从全局符号表中找到相应符号的地址,完成重定位

如果希望某个代码文件生成的对象文件可以被动态的链接,需要在编译时给GCC指定 -fPIC 参数,PIC(Position Independent Code)即位置无关代码

[code language="C"]

/***** echo.c *******/

#include

extern int global_variable;

int echo(){

printf("%dn",global_variable);

return 0;

}

[/code]

[code language="C"]

/******* main.c *******/

#include

extern int echo();

int global_variable = 0;

int main() {

echo();

return 0;

}

[/code]

[code language="bash"]

$ g++ -fPIC -shared echo.cc -o libecho.so

$ g++ -c main.cc -o main.o

$ g++ main.o -o dynamic -lecho -L.

$ g++ main.cc echo.cc -o static

$ objdump -d main.o

00000000 :

0: 55 push %ebp

1: 89 e5 mov %esp,%ebp

3: 83 e4 f0 and $0xfffffff0,%esp

6: e8 fc ff ff ff call 7

b: b8 00 00 00 00 mov $0x0,%eax

10: 89 ec mov %ebp,%esp

12: 5d pop %ebp

13: c3 ret

$ objdump -d dynamic

08048584 :

8048584: 55 push %ebp

8048585: 89 e5 mov %esp,%ebp

8048587: 83 e4 f0 and $0xfffffff0,%esp

804858a: e8 11 ff ff ff call 80484a0

804858f: b8 00 00 00 00 mov $0x0,%eax

8048594: 89 ec mov %ebp,%esp

8048596: 5d pop %ebp

8048597: c3 ret

8048598: 90 nop

$ objdump -d static

080484c8 :

80484c8: 55 push %ebp

80484c9: 89 e5 mov %esp,%ebp

80484cb: 83 e4 f0 and $0xfffffff0,%esp

80484ce: e8 d1 ff ff ff call 80484a4

80484d3: b8 00 00 00 00 mov $0x0,%eax

80484d8: 89 ec mov %ebp,%esp

80484da: 5d pop %ebp

80484db: c3 ret

80484dc: 90 nop

PIC sample

$ g++ echo.cc -shared -o libecho.so

0000051c :

51c: 55 push %ebp

51d: 89 e5 mov %esp,%ebp

51f: 83 ec 18 sub $0x18,%esp

522: a1 00 00 00 00 mov 0x0,%eax

527: 89 44 24 04 mov %eax,0x4(%esp)

52b: c7 04 24 94 05 00 00 movl $0x594,(%esp)

532: e8 fc ff ff ff call 533

537: b8 00 00 00 00 mov $0x0,%eax

53c: c9 leave

53d: c3 ret

53e: 90 nop

53f: 90 nop

$ g++ echo.cc -shared -fPIC -o libecho.so

0000052c :

52c: 55 push %ebp

52d: 89 e5 mov %esp,%ebp

52f: 53 push %ebx

530: 83 ec 14 sub $0x14,%esp

533: e8 ef ff ff ff call 527 <__i686.get_pc_thunk.bx>

538: 81 c3 e4 11 00 00 add $0x11e4,%ebx

53e: 8b 83 fc ff ff ff mov -0x4(%ebx),%eax

544: 8b 00 mov (%eax),%eax

546: 89 44 24 04 mov %eax,0x4(%esp)

54a: 8d 83 a8 ee ff ff lea -0x1158(%ebx),%eax

550: 89 04 24 mov %eax,(%esp)

553: e8 f0 fe ff ff call 448

558: b8 00 00 00 00 mov $0x0,%eax

55d: 83 c4 14 add $0x14,%esp

560: 5b pop %ebx

561: 5d pop %ebp

[/code]

GOT 和 PLT

[code language="C"]

#include

void foo() {

printf("test 0x%06xn", 10);

return;

}

int main () {

foo();

return 0;

}

[/code]

编译后查看ELF的信息

[code language="bash"]

gcc -g test.c -o test

objdump -S test

[/code]

以下为部分段的内容:

[code language="C"]

080482cc :

80482cc: ff 35 c8 95 04 08 pushl 0x80495c8

80482d2: ff 25 cc 95 04 08 jmp *0x80495c

80482d8: 00 00 add %al,(%eax)

080482fc :

80482fc: ff 25 d8 95 04 08 jmp *0x80495d8

8048302: 68 10 00 00 00 push $0x10

8048307: e9 c0 ff ff ff jmp 80482cc

int main () {

80483f0: 55 push %ebp

80483f1: 89 e5 mov %esp,%ebp

80483f3: 83 ec 08 sub $0x8,%esp

80483f6: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)

foo();

80483fd: e8 ce ff ff ff call 80483d0

8048402: b8 00 00 00 00 mov $0x0,%eax

return 0;

8048407: 83 c4 08 add $0x8,%esp

804840a: 5d pop %ebp

804840b: c3 ret

void foo() {

80483d0: 55 push %ebp

80483d1: 89 e5 mov %esp,%ebp

80483d3: 83 ec 08 sub $0x8,%esp

80483d6: 8d 05 d0 84 04 08 lea 0x80484d0,%eax

printf("testn");

80483dc: 89 04 24 mov %eax,(%esp)

80483df: e8 18 ff ff ff call 80482fc

return;

80483e4: 89 45 fc mov %eax,-0x4(%ebp)

80483e7: 83 c4 08 add $0x8,%esp

80483ea: 5d pop %ebp

80483eb: c3 ret

80483ec: 0f 1f 40 00 nopl 0x0(%eax)

[/code]

linux 文件格式elf,linux ELF 文件格式 | ZION相关推荐

  1. Linux内存管理:ELF文件格式

    Linux内存管理:ELF文件格式 rtoax 2021年3月 1. ELF文件格式 ELF (Executable and Linkable Format)是一种为可执行文件,目标文件,共享链接库和 ...

  2. a.ou、coff、elf三种文件格式

    补充:a.out早期并不是elf格式的,而是unix下另一种可执行格式,新的a.out是 本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and li ...

  3. linux 可执行文件_linux中ELF二进制程序解析

    0. 简介 在Linux系统的可执行文件(ELF文件)中,开头是一个文件头,用来描述程序的布局,整个文件的属性等信息,包括文件是否可执行.静态还是动态链接及入口地址等信息:如下图所示: 程序文件中包含 ...

  4. a.out、coff、elf三种文件格式

    转自:http://blog.chinaunix.net/uid-11469366-id-1747286.html 补充:a.out早期并不是elf格式的,而是unix下另一种可执行格式,新的a.ou ...

  5. linux系统内存执行elf的多种方式

    一.前言 无文件(fileless)恶意软件攻击现在已经越来越流行,这一点并不奇怪,因为这种技术通常不会留下蛛丝马迹.本文的重点不是介绍如何在Windows RAM中执行程序,我们的目标是GNU/Li ...

  6. 烧写文件格式介绍(ELF、HEX、BIN)

    烧写文件格式说明(ELF.HEX.BIN) 一.ELF: Executable and linking format(ELF)文件是x86Linux系统下的一种常用目标文件(object file)格 ...

  7. android中so文件格式详解,[原创]一 Android ELF系列:ELF文件格式简析到linker的链接so文件原理分析...

    Android ELF系列:ELF文件格式简析和linker的链接so文件原理分析 Android ELF系列:实现一个so文件加载器 Android ELF系列:手写一个so文件(包含两个导出函数) ...

  8. linux命令头部,Linux命令学习手册-objcopy命令

    objcopy [选项]... 输入文件 [输出文件] [功能] 将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换. [描述] objcopy工具使用BFD库读写目标 ...

  9. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )

    一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...

最新文章

  1. 服!AI 让兵马俑“活”起来,颜值惊艳!
  2. muduo之ThreadLocal
  3. 扩展--使用队列来优化递归操作完成文件下载
  4. svn commit --cl app 时手动输入提交的注释,而不是在 -m 'comments here'这里输入
  5. 盘点关于IDEA的几个调试的实用技巧
  6. 你赞同企业年薪百万的高管对员工说别羡慕赚的多,人家加班和付出的时候你在玩的说法吗?
  7. log4j.xml示例_log4j.xml示例配置
  8. 2018年泰迪杯数据挖掘比赛c题
  9. 51单片机LCD1602程序
  10. DBeaver数据库可视化工具
  11. 说到项目管理软件,不得不提的是禅道和JIRA
  12. 芯片自主注释流程代码
  13. C++ 常函数和常对象
  14. 本大三狗处博——为工作消得人憔悴
  15. mysql实验总结_数据库实验的心得体会.docx
  16. asp.net(c#)字符串转换成字符数组 字符串转换成int 数组
  17. 野火i.MX6ULL Pro开发板构建根文件系统
  18. 当defer遇上panic
  19. Tars协议的几点创新之举
  20. SpringCache @Cacheable keyGenerator

热门文章

  1. 全球及中国落地音箱行业市场发展前景展望与投资战略规划研究报告2022-2028年
  2. 通用计算机s3,计算机中S1,S3,S4,S5各自的状态是什么?
  3. 古文觀止卷七_原道_韓愈
  4. 相位解包裹(五)枝切法(Goldstein’s branch cut algorithm)
  5. vue优化之CND优化
  6. C语言统计数字出现次数
  7. STM32F05x移植GD32F1x0注意事项
  8. OC小游戏之英雄打怪兽
  9. 程序员的五层境界,你在哪一层?最后一层的,都是人生赢家
  10. IP 数据库,CSV 和 MDB 格式。