目标文件(ELF格式)

news2024/11/16 13:45:07

1.linux中有三类目标文件

**(1)可重定位目标文件(.o或者.a):**包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件。(.a文件是由很多个.o文件的集合)(查看.a信息可以关注变量的排的段位置)
**(2)可执行目标文件(.out)(符号文件):**包含二进制代码和数据,可直接被加载器加载执行。
**(3)共享目标文件(.so):**可被动态的加载和链接(本文暂时不讨论)

由此我们可知由汇编器生成的就是可重定位目标文件,经过链接器作用后才生成可执行目标文件,链接器的作用就是以一组可重定位目标文件作为输入,生成可加载和运行的可执行目标文件,具体需要完成以下两个工作:
**Ø 符号解析:**符号解析的目的是将目标文件中每个符号(静态变量、函数、全局变量)和其定义进行关联
**Ø 重定位:**将每个符号的定义与具体在虚拟内存中的位置进行关联
最终生成可执行目标文件。

2. ELF文件格式

2.1 目标文件和ELF的关系:

目标文件 在不同的系统或平台 上具有不同的命名格式,在Unix和X86-64 Linux上称为ELF(Executable and Linkable Format, ELF)。
由上可知,.o、.a、.so均是ELF格式的,ELF文件是有结构的文件。这类文件是分段进行组织的,段的个数可通过代码控制,但通常一个程序文件至少包含以下段:
.text段、.data段、bss段。

2.2 ELF的组成

ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器(Loader)看来它是由Program Header Table描述的一系列Segment的集合。
在这里插入图片描述
"Section"和"Segment"是计算机中常见的术语,它们的区别如下:
(1)范围不同:
"Section"通常用于可执行文件(如ELF文件),用于描述可执行文件中的不同部分。"Segment"通常用于内存分配,用于描述内存中的不同部分。
(2)用途不同:
"Section"通常用于存储代码、数据和符号表等信息。"Segment"通常用于管理物理内存,包括代码段、数据段、堆栈段等。
(3)映像关系不同:
"Section"通常是在编译时创建的,并成为可执行文件的一部分。"Segment"则是在运行时动态分配的,根据运行程序的需要进行相应的内存分配。

总之,"Section"和"Segment"用于不同的应用场景,其在实现和使用上也有所不同。

2.3 文件头

ELF的结构声明位于系统头文件 elf.h 中,ELF格式分为32位与64位两种,除了重定位类型稍有区别,其它大致相同,为了简化描述,后续说明将省略32/64字样。
ELF Header的声明如下 :
在这里插入图片描述
在这里插入图片描述
e_machine
e_verison:文件版本,目前常见的ELF 文件版本均为EV_CURRENT(1)。
e_entry:入口虚拟地址。
e_phoff:段表文件偏移。
e_shoff:节表文件偏移。
e_flags:处理器特定的标志,一般为0。
e_ehsize:Elf_Header的大小(字节)
e_phentsize:段头(Program Header)的大小(字节)。
e_phnum:段的数量。
e_shentsize:节头(Section Header)的大小(字节)。
e_shnum:字的数量。
e_shstrndx:节字符串表的节索引

2.4 ELF文件为什么不能直接读,要使用readelf解

ELF(Executable and Linkable Format)文件是一种常用的二进制文件格式,用于存储可执行程序、共享库和目标文件等。ELF文件的内部结构相对复杂,包含了各种各样的信息,如程序入口地址、段表、符号表、重定位表等。

由于ELF文件的结构复杂,直接读取和解析其中的信息并不容易。为了方便查看和分析ELF文件的内容,可以使用专门的工具,如readelf。readelf是一个用于读取和显示ELF文件信息的命令行工具,它可以解析ELF文件的各个部分,并以易于阅读的方式显示出来。

通过使用readelf,我们可以获取ELF文件的各种信息,如文件头信息、段表信息、符号表信息等。这些信息对于调试和分析程序非常有用。

总而言之,ELF文件之所以需要使用readelf解析,是因为它的内部结构复杂,需要特定的工具来解析和显示其中的信息。

readelf -a ASIC > LOG

注意:上面的链接视图是ELF文件ASIC的文件结构,文本文件LOG是用readelf解析出来看到的。flat.bin将利用bintools工具进行构造。

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

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

相关文章

解决uncompyle6反编译报错KeyError

报错内容:KeyError:3.11.0 (这个是我自己的Python版本号) 主要原因就是你的Python版本没在它库文件支持的版本里,我们需要进行手动添加即可。 首先找到文件:magics.py 我的是在这个路径下:D:\…

《QT从基础到进阶·三十六》QWidget实现收缩栏的效果

功能: 1、可以在收缩栏插件中添加界面 2、可以把界面展开或收缩 3、可以用鼠标拖动界面改变界面的排放顺序 源码放在最下方 1、可以在收缩栏插件中添加界面 virtual void addWidget(QWidget* widget, const QString& label, const QIcon& icon QIcon())…

基于单片机加热炉多参数检测和PID炉温系统

**单片机设计介绍, 基于单片机加热炉多参数检测和PID炉温系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的公交安全预警系统可以被设计成能够实时监测公交车辆的行驶状态,并在发生异常情况…

华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】

本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理,以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一.华为云IoT与Open Harm…

了解一下公网IP和域名的区别与联系

​  公网IP和域名是互联网中两个重要的概念,它们在网络通信和网站访问中起着不同的作用。 我们来了解一下公网IP。公网IP是指在全球范围内唯一的IP地址,用于标识互联网上的设备。每个设备连接到互联网时都会被分配一个公网IP地址,这个地址可…

手把手设计C语言版循环队列(力扣622:设计循环队列)

文章目录 前言描述分析力扣AC代码 力扣: 622.设计循环队列 前言 队列会出现“假溢出”现象,即队列的空间有限,队列是在头和尾进行操作的,当元素个数已经达到最大个数时,队尾已经在空间的最后面了,但是对头…

北邮22级信通院数电:Verilog-FPGA(0)怎么使用modelsim进行仿真?modelsim仿真教程一份请签收~

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 最近很多uu问我怎么用quartus连接的modelsim软件进…

【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用

部署步骤 发布安装运行环境:dotnet-sdk(必装)、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量:临时变量、当前用户永久变量、所有用户的永久变量运行:终端运行、后台运行 基本情况 开发系统环境 系统&am…

oepnpnp - 自己出图做开口扳手

文章目录 oepnpnp - 自己出图做开口扳手概述笔记做好的一套扳手实拍美图工程图END oepnpnp - 自己出图做开口扳手 概述 我的openpnp设备顶部相机安装支架, 由于结构限制, 螺柱的安装位置和机械挂壁的距离太近了. 导致拧紧(手工或者工具)很困难. 也不能重新做相机支架, 因为将…

Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126

一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…

通明智云宣布完成数千万元A+轮融资, 引领云原生与信创两翼齐飞的应用交付解决方案

近日,通明智云(北京)科技有限公司(简称:通明智云)宣布完成数千万元A轮融资,由全聚合与信公投资联合投资,明论资本担任本轮融资独家财务顾问。本轮融资资金将主要用于NJet云原生应用引…

ky10 server x86 安装、更新openssl3.1.4(在线编译安装、离线安装)

查看openssl版本 openssl version 离线编译安装升级 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzech…

第四代可燃气体监测仪:可燃气体监测仪效果有哪些?

在城市之中一旦发生燃气事故,往往会为社会公共安全和公众利益带来极大的危害,扰乱社会运行的稳定秩序,威胁着城市生命线的运行。因此对于城市燃气事故的预防和应对工作,必须得到充分的重视和关注。城市燃气事故的预防工作&#xf…

redis高可用---持久化

redis高可用 在集群当中有一个非常重要的指标,提供正常服务的时间的百分比(365天) 99.9%,redis高可用含义更广泛,支持服务是指标之一,数据容量扩展,数局的安全性。(容量、安全性) redis中实现高…

竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖,适合作为竞赛课题…

【设计模式】行为型设计模式

行为型设计模式 文章目录 行为型设计模式一、概述二、责任链模式(Chain of Responsibility Pattern)三、命令模式(Command Pattern)四、解释器模式(Interpreter Pattern)五、迭代器模式(Iterato…

YOLOV5 C++部署的人员检测项目【学习笔记(十一)】

本文为修改后的转载,没有转载链接,所以文章类型暂为原创 文章目录 一、安装Pytorch 及 YOLO v51.1 安装GPU版 pytorch1.2 安装YOLO v5所需依赖 二、YOLO v5训练自定义数据2.1 标注数据2.1.1 安装labelImg2.1.2 标注 2.2 准备数据集2.2.1 组织目录结构2.…

亚马逊运营一定要用动/静态住宅IP代理吗?

作为全球最大的电商平台之一,亚马逊已经成为许多商家的首选销售平台。而代理IP作为近几天互联网的热门工具,在跨境电商界也起着非常强大的作用。那么在亚马逊运营中,适合动态住宅代理还是静态住宅代理呢?下面我们一起来探索&#…

问题解决:ModuleNotFoundError: No module named ‘skimage‘

今天的代码中需要用到这个库 from skimage.morphology import disk import skimage.filters.rank as sfr 在运行程序时,出现报错: ModuleNotFoundError: No module named skimage 刚开始傻乎乎的使用 pip install skimage 指令,结果确实不…

深入了解Java 8 新特性:Stream流的实践应用(二)

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概8000多字,预计阅读时间长需要10分钟(不要害怕字数过多,其中有一大部分是示例代码,读起…