linux 文件格式elf,linux ELF 文件格式 | ZION
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相关推荐
- Linux内存管理:ELF文件格式
Linux内存管理:ELF文件格式 rtoax 2021年3月 1. ELF文件格式 ELF (Executable and Linkable Format)是一种为可执行文件,目标文件,共享链接库和 ...
- a.ou、coff、elf三种文件格式
补充:a.out早期并不是elf格式的,而是unix下另一种可执行格式,新的a.out是 本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and li ...
- linux 可执行文件_linux中ELF二进制程序解析
0. 简介 在Linux系统的可执行文件(ELF文件)中,开头是一个文件头,用来描述程序的布局,整个文件的属性等信息,包括文件是否可执行.静态还是动态链接及入口地址等信息:如下图所示: 程序文件中包含 ...
- a.out、coff、elf三种文件格式
转自:http://blog.chinaunix.net/uid-11469366-id-1747286.html 补充:a.out早期并不是elf格式的,而是unix下另一种可执行格式,新的a.ou ...
- linux系统内存执行elf的多种方式
一.前言 无文件(fileless)恶意软件攻击现在已经越来越流行,这一点并不奇怪,因为这种技术通常不会留下蛛丝马迹.本文的重点不是介绍如何在Windows RAM中执行程序,我们的目标是GNU/Li ...
- 烧写文件格式介绍(ELF、HEX、BIN)
烧写文件格式说明(ELF.HEX.BIN) 一.ELF: Executable and linking format(ELF)文件是x86Linux系统下的一种常用目标文件(object file)格 ...
- android中so文件格式详解,[原创]一 Android ELF系列:ELF文件格式简析到linker的链接so文件原理分析...
Android ELF系列:ELF文件格式简析和linker的链接so文件原理分析 Android ELF系列:实现一个so文件加载器 Android ELF系列:手写一个so文件(包含两个导出函数) ...
- linux命令头部,Linux命令学习手册-objcopy命令
objcopy [选项]... 输入文件 [输出文件] [功能] 将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换. [描述] objcopy工具使用BFD库读写目标 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )
一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...
最新文章
- 服!AI 让兵马俑“活”起来,颜值惊艳!
- muduo之ThreadLocal
- 扩展--使用队列来优化递归操作完成文件下载
- svn commit --cl app 时手动输入提交的注释,而不是在 -m 'comments here'这里输入
- 盘点关于IDEA的几个调试的实用技巧
- 你赞同企业年薪百万的高管对员工说别羡慕赚的多,人家加班和付出的时候你在玩的说法吗?
- log4j.xml示例_log4j.xml示例配置
- 2018年泰迪杯数据挖掘比赛c题
- 51单片机LCD1602程序
- DBeaver数据库可视化工具
- 说到项目管理软件,不得不提的是禅道和JIRA
- 芯片自主注释流程代码
- C++ 常函数和常对象
- 本大三狗处博——为工作消得人憔悴
- mysql实验总结_数据库实验的心得体会.docx
- asp.net(c#)字符串转换成字符数组 字符串转换成int 数组
- 野火i.MX6ULL Pro开发板构建根文件系统
- 当defer遇上panic
- Tars协议的几点创新之举
- SpringCache @Cacheable keyGenerator