linux elf 视频,linux 实例讲解elf文件

elf是一种文件格式,用于存储linux程序,它内部有什么信息呢?大概包括编制好的计算机指令,数据,计算机在需要的时候把这个文件读取到内存中,cpu就可以从内存中一条一条的读取指令来执行。要想明白elf的格式,应该先了解下计算机执行程序需要哪些信息,对此我们先来回顾下计算机系统的一些基础知识:

虚拟内存

对于32位的总线,linux系统给每个进程分配了4g的空间,其中 0xC0000000到0xFFFFFFFF 这个地址段是留给系统使用的,主要用于linux内核程序的运行, 用户可以使用3GB的空间从(0x00000000-0xBFFFFFFF)。当然这4g的内存是虚拟内存,一个系统有那么多进程,要是物理内存那还得了,操作系统的虚拟性也是其一重大特征,使用虚拟内存的好处就是各个进程之间的运行空间看起来是独立的,彼此相互不干扰。那么一个进程的创建过程是什么样的呢?

程序执行过程

用户请求运行程序时,操作系统会读取存储在磁盘上的可执行文件,(对于linux系统,这个文件就是elf格式文件),然后为用户分配4g的虚拟内存空间。

根据可执行文件的信息指示,把不同的文件内容放到为你分配的这3g虚拟内存。

根据可执行文件的信息指示,系统设置代码段和数据段寄存器

根据可执行文件的信息指示,跳转到用户的代码入口地址(一般就是我们的main函数)

从main开始,cpu一条条执行我们给的指令,处理我们的数据,直到程序结束。

我们看到在执行指令前有多次“根据可执行文件提示”,而学习elf就是学习到底是指示了哪些信息。

可执行的elf文件

elf文件分三种类型: 目标文件(.o)、可执行文件、动态库(.so),可执行文件一般分成,elf文件头、segment表、section表。下面我们通过一个例子一一介绍下:

elf文件头: 这个文件是对elf文件整体信息的描述,在32位系统下是56的字节,在64位系统下是64个字节。

segment表:这个表是加载指示器。

.section .data

.global data_item

data_item:

.long 3,67,28

.section .text

.global _start

_start:

mov $1,%eax

mov $4,%ebx

int $0x80

上面是一段简单的汇编代码,编译: as -o hello.o hello.s 链接: ld -o hello hello.o 完成之后执行readelf -h hello (-h 表示读取elf文件头的命令)

readelf -h hello

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: EXEC (Executable file)

Machine: Advanced Micro Devices X86-64

Version: 0x1

Entry point address: 0x4000b0 // 程序的入口地址

Start of program headers: 64 (bytes into file)

Start of section headers: 472 (bytes into file)

Flags: 0x0

Size of this header: 64 (bytes)

Size of program headers: 56 (bytes) // 头长度是56字节(32位系统是56字节)

Number of program headers: 2

Size of section headers: 64 (bytes)

Number of section headers: 6

Section header string table index: 3

对于程序的装载,我们关心这三项:

Entry point address: 0x4000b0 // 程序入口地址

Start of program headers: 64 (bytes into file) // segment表在文件64字节偏移处

Size of program headers: 56 (bytes)

上面内容告诉我们segment表在文件的64字节处,我们看看64字节处有什么内容:

执行readelf -l hello 输出segments信息,(-l 表示读取segment)

readelf -l hello

Elf file type is EXEC (Executable file)

Entry point 0x4000b0

There are 2 program headers, starting at offset 64

Program Headers:

Type Offset VirtAddr PhysAddr

FileSiz MemSiz Flags Align

LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000

0x00000000000000bc 0x00000000000000bc R E 200000

LOAD 0x00000000000000bc 0x00000000006000bc 0x00000000006000bc

0x000000000000000c 0x000000000000000c RW 200000

Section to Segment mapping:

Segment Sections...

00 .text

01 .data

我们看到程序有两个segment,分别是.text和.data,

.text的Offset是0,FileSiz是0x0,MemSiz是0xbc, VirtAddr是0x400000,Flags是R E,表示加载起将把elf文件中从0字节开始直到oxbc处的内容加载到虚拟内存中的0x400000处,占用0xbc长度的内存,设置该内存的权限是RE(可读,可执行),这一段的内容正好是elf头,segments table,和代码段,而elfheader的entry地址是0x4000b0,这个地址是代码段的起始地址。

.data的Offset是0,FileSiz是0xbc,MemSiz是0x0c, VirtAddr是0x6000bc,Flags是R W,表示加载起将把elf文件中从bc字节开始直到oxbc + 0xc处的内容加载到虚拟内存中的0x6000bc处,占用0x0c长度的内存。设置该内存的权限是RE(可读,可执行)

这样系统就可以根据elf文件提供的这些信息创建进程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中文编码 - Python零基础入门教程

目录 一.前言二.为什么会出现乱码三.如何解决乱码四.重点总结五.猜你喜欢 一.前言 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 Python 到目前为止,一共有两个版本,分别是 2.x 和 3.x 版本,根据官方正式通知 2…

【拨云见日】企业上云时代,多样化的公有云服务你了解多少?

对于全球大中型企业来讲,高效、安全、稳定的公有云服务一直是企业拥抱数字时代的最佳上“云”方案。根据Gartner今年4月发布的报告称,2018年全球公有云服务市场规模预计达到1864亿美元,增长率21.4%。如果你也想搭上公有云的快速列车&#xff…

linux自带浏览器如何更新,在deepin上安装edge浏览器后更新系统报错的解决方案

有些人在deepin系统上安装完edge浏览器后采用sudo apt update命令更新系统,却报出了错误,更新失败。原因是更新deepin系统的时候,最好把其它的源禁用了,不然会有各样的问题。报有错误在更新系统时出现以下错误:命中:1 …

Python变量 - Python零基础入门教程

目录 一.前言 1.print 函数2.format 函数 a.format 函数不设置下标b.format 函数设置下标 3.占位符 二.整数三.浮点数四.字符串五.BOOL 值六.重点总结七.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 何为 Python 变量&#xf…

数据海洋中的“智”臻架构 开启智慧计算新纪元——浪潮OpenPOWER FP5280G2服务器全面上市...

【2018年9月12日,北京】 浪潮商用机器有限公司宣布首款基于OpenPOWER9处理器的FP5280G2服务器正式上市。FP5280G2搭载全新OpenPOWER9处理器,是一款面向大规模数据中心的大数据分析应用设计的高端双路主流机架式服务器,以性能、存储及拓展等多…

Python运算符 - Python零基础入门教程

目录 一.算术运算符二.赋值运算符三.比较运算符四.运算符的优先等级五.重点总结六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 什么是运算符?听着高大上,实际小学生都能把它玩的贼溜。比如:3 2 – 5…

Cloud一分钟 | 华为云EI接管了西二旗的红绿灯,西二旗交通有望改观

Hello,everyone:9月18日早,星期二,祝大家工作愉快!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群公司职位”即可,加入【云计算学习交流群】&…

linux卡在nfs挂载怎么办,51CTO博客-专业IT技术博客创作平台-技术成就梦想

生成环境下nfs挂载完毕后并不能一帆风顺,nfs时常会出现挂载问题。但只要有方法,是非常容易解决的。首先我们需要判断出是nfs服务端问题,还是客户端问题。如果是单纯的客户端问题,则可以使用fuser命令轻松解决。具体如下&#xff1…

巨杉数据库完成C轮数千万美元融资

业界领先的金融级分布式数据库公司,巨杉数据库近日宣布完成由嘉实投资领投的C轮融资。本轮的领投方为嘉实投资,启明创投与DCM作为早期投资方跟投。SequoiaDB巨杉数据库成立6年来一直坚持技术驱动产品,专注打造金融级分布式数据库,…

Python 条件判断 if/else - Python零基础入门教程

目录 一.Python 条件判断 if/else 简介二.Python 条件判断 if/else 实战三.重点总结四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 生活中我们总是面临各种选择,选择不同,结果也不同,不管我们是否愿意…

c语言十六进制字符串转整数,C语言-提取字符串中的十六进制数字并转换为一个十进制整数输出...

问题描述:提取字符串中的十六进制数字并转换为一个十进制整数输出源代码:/*十六进制转换成十进制*/#includeint main(void){int i,k;char hexad[80],str[80];long number;printf("Enter a string:");i0;while((str[i]getchar())!\n)i;str[i]\0…

你的数据还安全吗?

最近,动画片《工作细胞》火了,分分钟席卷了B站。这是一个关于你自身的故事,体内的故事。人体约有37兆2千亿个细胞,在这个神奇的世界中,细胞们每天也精神饱满、无休无眠地工作着。运送氧气的红细胞,与细菌战…

Python while循环 - Python零基础入门教程

目录 一.while 循环简介 二.while 循环语法三.while 循环实战四.while 死循环五.重点总结六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.while 循环简介 都说程序源于生活,假如有这样一个场景:老师要求算出 …

C语言字符串分离数字和字母,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#includemain(){int acount0,bcount0,ccount0,dcount0;char a;printf("请输入一行字符:\n");a getchar();while (a !\n){switch (a){caseq:casew:casee:caser:caset:casey:caseu:casei:caseo:casep:casea:cases:cased:c…

昨天,阿里用“平头哥”死磕起了中国芯!

昨天,在 34 度阵雨天里,以「驱动数字中国」为主题的第十届云栖大会在杭州云栖小镇正式召开。在大会开场,即将接棒马云的阿里巴巴 CEO 张勇(逍遥子)刚上场就为大家解惑:阿里巴巴究竟是以技术驱动的企业还是以…

Python break/continue - Python零基础入门教程

目录 一.break二.continue三.重点总结四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python while 循环 文章结尾,我们留下了一个 bug,当条件永远为 True 时,程序 while 循环陷入了死循环&#xf…

c语言浮点数乘法运算,记C语言浮点数运算处理 坑 一则

看一小段C语言程序:int main(){float x 1.3;x x - (int)x;int i (int)(x*);return ;}在你心目中, 变量 I 是怎样的结果?如果你理所当然地认为是3的话, 那么你就错了~~~实际结果应该是2. 为什么?简而言之, x在内存的值并不是精确的1.3, 实际上可能是1.29999999......因为…

Cloud一分钟 | 阿里云推杭州城市大脑2.0:实时指挥200名交警;马云即将卸任阿里,蚂蚁云不断加快区块链产业布局...

Hello,everyone:9月19日早,星期三,祝大家工作愉快!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群公司职位”即可,加入【云计算学习交流群】&…

Python for循环 - Python零基础入门教程

目录 一.for 循环语法二.for 循环实战三.重点总结四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python 开发中,除了前篇文章介绍的 while 循环 还有一个 for 循环也经常使用,两者使用都是大同小异&#xff0…

Cloud一分钟 | 误删生产数据库血案,顺丰高级工程师被开除;阿里巴巴暂停美国云计算扩张?阿里云总裁正式回应:“不会减少投入”...

Hello,everyone:9月25日早,星期二,祝大家工作愉快!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群公司职位”即可,加入【云计算学习交流群】&…