实践四

一、概述

ELF是一种用于二进制文件、可执行文件、目标代码、共享库、和核心转储的标准文件格式。也是linux下的主要可执行文件格式

ELF文件由四部分组成,分别是ELF头(ELF header)、程序头表(program header table)、节(section)和节头表(section table header)
ELF header格式代码如下:
#define EI_NIDENT
typedef struct elf32_hdr{
unsigned char
Elf32_Half
Elf32_Half
Elf32_Word
Elf32_Addr
Elf32_Off
Elf32_Off
Elf32_Word
Elf32_Half
Elf32_Half
Elf32_Half
Elf32_Half
Elf32_Half
Elf32_Half
} Elf32_Ehdr;
大小是52B (32位;64位则为64B)
代码项含义:
e_type; /* 文件类型*/
e_machine; /* 表示运行该程序需要的体系结构 */
e_version; /* 表示文件的版本*/
e_entry; /* 程序的入口地址 */
e_phoff; /* 程序头表在文件中的偏移量 */
e_shoff; /* 节头表在文件中的偏移量 */
e_flags; /* 此项为 0*/
e_ehsize; /* ELF头字节大小 */
e_phentsize; /* 程序头表每一个条目的大小 */
e_phnum; /* 程序头表有多少个条目 */
e_shentsize; /* 节头表每一个条目的大小 */
e_shnum; /* 节头表有多少个条目 */
e_shstrndx; /* 包含节名称的字符串是第几个节 */

Program header(描述的是一个段在文件中的位置、大小、以及它被放进内存后所在的位置和大小)

Section header格式代码如下;

tyypedef struct {
Elf32_Word
Elf32_Word
Elf32_Word
Elf32_Addr
Elf32_Off
Elf32_Word
Elf32_Word
Elf32_Word
Elf32_Word
Elf32_Word
} Elf32_Shdr;

代码项含义:
sh_name;/*section名字
sh_type;/类别
sh_flags;/section在进程执行时的特性
sh_addr;/开始的虚拟地址
sh_offset;/在文件中的偏移
sh_size;
sh_link;
sh_info;
sh_addralign;
sh_entsize;

ELF文件中常见的段.
.text 保存程序的指令序列
.data&rodata 保存初始化了的全局静态变量和局部静态变量
.bss存放未初始化的全局变量和局部静态变量

二、实践步骤

1、编写一个elf.c程序:

#include <stdio.h>
int f(int x){
return 0;
}

int main(void){
static int a=7;
char str[]="变量为:";
printf("%s%d",str,f(a)+1);
return f(a)+1;
}

2、实践代码
1.gcc -c elf.c -o elf.o(生成.o文件)

file elf.o

2.ls -l elf.o(查看.o文件大小字节)
3.hexdump -x elf.o(用16进制的数字来显示.o的内容)
4.objdump -x elf.o(显示.o中各个段和符号表的相关信息)
readelf -a elf.o(查看各个段信息)

二、实践内容分析

第一行:实际表示内容为7f45 4c46 0201 0100 0000 0000 0000 0000;前四个字节是一个魔数(magic number),表示这是一个ELF对象,接下来的一个字节02表示是一个64位对象(32位的对象是01),再接下来的一个字节01表示采用小端法表示,再接下来的一个字节01表示文件头版本,剩下的默认都设置为0。

第二行:e_type(两个字节)值为0x0001,表示是一个重定位文件。
e_machine(两个字节)值为0x003e,表示是X86-64的处理器体系结构。
e_version(四个字节)值为0x00000001,表示是当前版本。
e_entry(八个字节)值为0x0000000000000000,表示没有入口点

第三行:e_phoff(八个字节)值为0x0000000000000000,表示没有程序头表。
e_shoff(八个字节)值为0x0000000000000420,表示段表的偏移地址。

第四行:e_flags(四个字节)值为0x00000000,表示未知处理器特定标志
e_ehsize(两个字节)值为0x0040,表示elf文件头大小;
e_phentsize(两个字节)值均为0x0000,因为重定位文件没有程序头表。
e_phnum(两个字节)的值为0x0000,因为重定位文件没有程序头表。
e_ehentsize(两个字节)值为0x0040表示段头大小为64个字节(由这里知道section header table里面每个header的大小)。
e_shnum(两个字节)值为0x000d,表示段表入口有13个(由这里知道段表有13个段)。
e_shstrndx(两个字节)值为0x000a,表示段名串表的在段表中的索引号(由这里知道.shstrtab段(符号表)的信息在段表的索引号是10)。

查看文件头:

程序头表:

符号表:

时间: 2024-10-19 00:40:45

实践四的相关文章

Linux及安全实践四——ELF文件格式分析

Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程序为例 1. ELF文件头 使用工具查看ELF文件头:readelf -h obj 在/usr/include/elf.h中可以找到文件头结构定义: 大小总共为64字节,换算成十六进制为0x40.在十六进制代码中找到前0x40字节,即为文件头信息部分(阅

【实践报告】Linux实践四

Linux内核分析 实践四——ELF文件格式分析 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: 可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件) 可执行文件:文件保存着一个用来执行的程序.(例如bash,gcc等) 共享目标文件:共享库.

并发编程实践四:实现正确和高效的锁

你是否觉得锁是一种很神奇的东西,在并发编程中,你只需要将你的代码加上锁,就能保证代码是线程安全的(当然现实和感觉有很大差别,代码的线程安全是非常复杂的),那么,这些都是怎么做到的呢?当存在大量线程同时竞争锁时,竞争失败的锁会怎么做呢?锁又是怎么保证这一切高效的执行的呢?这篇文章将为你回答这些问题,首先我将介绍怎样实现一个正确的锁,然后介绍高效的锁应该具备的条件,最后将介绍两种常用的队列锁算法:CLH锁和MCS锁. 文中将用到一些原子变量的特性,你可以将原子变量看作加强版的volatile变量,具

Android最佳性能实践(四)——布局优化技巧

在前面几篇文章当中,我们学习了如何通过合理管理内存,以及高性能编码技巧的方式来提升应用程序的性能.然而实际上界面布局也会对应用程序的性能产生比较大的影响,如果布局写得糟糕的话,那么程序加载UI的速度就会非常慢,从而造成不好的用户体验.那么本篇文章我们就来学习一下,如何通过优化布局来提供应用程序的性能.还没有看过前面前面一篇文章的朋友建议可以先去阅读 Android最佳性能实践(三)——高性能编码优化 . 重用布局文件 Android系统中已经提供了非常多好用的控件,这让我们在编写布局的时候可以很

k8s实践(四):Controller

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G 备注 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G 备注 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2

实践四之实验报告

一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: 可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件) 可执行文件:文件保存着一个用来执行的程序.(例如bash,gcc等) 共享目标文件:共享库.文件保存着代码和合适的数据,用来被下连接编辑器和动

UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解

{x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展.虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Binding} 要少,且支持更好的调试. 参照网址:{x:Bind} 标记扩展,GitHub微软UWP实例之XamlBind 1,{x:Bind} 基本原理 在 XAML 加载时,{x:Bind} 将转换为你所需的绑定对象,此对象将从数据源上的某一属性中获取相关值.绑定对象可以配置为观察数据源属性值的更改

[五]JFreeChart实践四之直线图

重点: 1.时间序列集合作为dataset,一个时间序列为一条折线 2.时间序列可以是月:年,小时:天 3.准备好时间序列要放入时间序列集合中 4.将时间序列集合作为dataset传入ChartFactory 小点: 1.设置图表显示的时间间隔 2.设置图表的副标题以及标题的字体 3.设置折线点显示数据值

编译器实践四 之 FIRST集合,NULLABLE集合,FOLLOW集合

闲来无事,就把龙书拿出来有看了看,把最近学的总结一下. FIRST(X)集合定义:可从X推导得到的串的首符号的集合,其中X是任意文法符号.如果X=>······=>ε ,那么ε也在FIRST(X)中.(定义来自龙书) 算法伪代码(非准确版): <span style="font-size:14px;">foreach(nonterminal N) FIRST(N) = {} while(some set is changing) foreach (product