Linux下的ELF文件格式简介

[无效的 ELF 头部]:解决 Linux 命令报错问题 这个错误提示意味着 Linux 系统找不到指定文件的 ELF 头部,因为文件可能已经损坏或者它的格式不符合 ELF 头部的标准。第一种方法是检查你所使用的工具链是否兼容当前的操作系统。如果你的代码是在另一台机器上编译完成的,并且你正尝试在不同的机器上运行它,那么请确保两台机器的系统版本和架构配置相同,否则就会出现 ELF 头部错误。如果你的代码需要其他的特殊库或者头文件,你可以通过安装相应的工具链来满足这些要求。以上是解决 ELF 头部错误的三种方法,希望对你在处理 Linux 命令时遇到的问题提供帮助。 阅读详情
 发布时间:2002.01.26 12:20     来源:开放系统世界    作者:杜昆
              
            
            
              
               
                  
                    
                                       
                               
              
              1. 概述
Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:
(1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
ELF文件格式比较复杂,本文只是简要介绍它的结构,希望能给想了解ELF文件结构的读者以帮助。具体详尽的资料请参阅专门的ELF文档。
2. 文件格式
为了方便和高效,ELF文件内容有两个平行的视角:一个是程序连接角度,另一个是程序运行角度,如图1所示。
ELF
header在文件开始处描述了整个文件的组织,Section提供了目标文件的各项信息(如指令、数据、符号表、重定位信息等),Program
header table指出怎样创建进程映像,含有每个program header的入口,Section header
table包含每一个section的入口,给出名字、大小等信息。

图1               
3. 数据表示
ELF数据编码顺序与机器相关,数据类型有六种,见表1。

4. ELF文件头
象bmp、exe等文件一样,ELF的文件头包含整个文件的控制结构。它的定义如下:

   
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
}Elf32_Ehdr;
   
  
其中E_ident的16个字节标明是个ELF文件
(7F+'E'+'L'+'F'+class
+data+version+pad)。E_type表示文件类型,2表示可执行文件。E_machine说明机器类别,3表示386机器,8表示
MIPS机器。E_entry给出进程开始的虚地址,即系统将控制转移的位置。E_phoff指出program header
table的文件偏移,e_phentsize表示一个program
header表中的入口的长度(字节数表示),e_phnum给出program
header表中的入口数目。类似的,e_shoff,e_shentsize,e_shnum 分别表示section
header表的文件偏移,表中每个入口的的字节数和入口数目。E_flags给出与处理器相关的标志,e_ehsize给出ELF文件头的长度(字节数
表示)。E_shstrndx表示section名表的位置,指出在section header表中的索引。
下面有个elf文件头的例子,可以对照理解,见图2。

图2
5. section header
目标文件的section header table可以定位所有的section,它是一个Elf32_Shdr结构的数组,Section头表的索引是这个数组的下标。有些索引号是保留的,目标文件不能使用这些特殊的索引。
Section包含目标文件除了ELF文件头、程序头表、section头表的所有信息,而且目标文件section满足几个条件:
(1)目标文件中的每个section都只有一个section头项描述,可以存在不指示任何section的section头项。
(2)每个section在文件中占据一块连续的空间。
(3)Section之间不可重叠。
(4)目标文件可以有非活动空间,各种headers和sections没有覆盖目标文件的每一个字节,这些非活动空间是没有定义的。
Section header结构定义如下:

   
typedef struct{
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
}Elf32_Shdr;
   
  
其中sh_name指出section的名字,它的值是后面将会讲到的
section header string
table中的索引,指出一个以null结尾的字符串。Sh_type是类别,sh_flags指示该section在进程执行时的特性。Sh_addr
指出若此section在进程的内存映像中出现,则给出开始的虚地址。Sh_offset给出此section在文件中的偏移。其它字段的意义不太常用,
在此不细述。
文件的section含有程序和控制信息,系统使用一些特定的section,并
有其固定的类型和属性(由sh_type和sh_info指出)。下面介绍几个常用到的section:“.bss”段含有占据程序内存映像的未初始化数
据,当程序开始运行时系统对这段数据初始为零,但这个section并不占文件空间。“.data.”和“data1”段包含占据内存映像的初始化数据。
“.rodata”和“.rodata1”段含程序映像中的只读数据。“.shstrtab”段含有每个section的名字,由section入口结构
中的sh_name索引。“.strtab”段含有表示符号表(symbol
table)名字的字符串。“.symtab”段含有文件的符号表,在后文专门介绍。“.text”段包含程序的可执行指令。
6. symbol table
目标文件的符号表包含定位或重定位程序符号定义和引用时所需要的信息。符号表入口结构定义如下:

   
typedef struct{
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
Unsigned char st_info;
Unsigned char st_other;
Elf32_Half st_shndx;
}Elf32_Sym;
   
  
其中st_name包含指向符号表字符串表(strtab)中的索引,从而可以获得
符号名。St_value指出符号的值,可能是一个绝对值、地址等。St_size指出符号相关的内存大小,比如一个数据结构包含的字节数等。
St_info规定了符号的类型和绑定属性,指出这个符号是一个数据名、函数名、section名还是源文件名;并且指出该符号的绑定属性是local、
global还是weak。
invalid ELF header invalid ELF header 报类似错误: /usr/lib/x86_64-linux-gnu/libc.so: invalid ELF header 一般应该是编译出的库文件或者二进制文件和运行环境不匹配。 注意使用 file 命令,查看编译出的库和二进制文件的信息。 root@ubuntu:/neo/c# file libs/armeabi/libhello... 阅读详情

相关推荐

Oracle Linux中/var/log/pcp/pmlogger目录膨胀问题分析与解决

本文详细分析了Oracle Linux系统中/var/log/pcp/pmlogger目录异常膨胀的常见原因与解决方案。当PCP性能监控框架的pmlogger服务日志轮转或清理机制失效时,会导致该目录无限增长,威胁系统稳定。文章提供了从服务状态诊断、配置文件审查到安全清理与预防策略的全流程实战指南,帮助运维人员快速回收磁盘空间并恢复服务正常运行。

weixin_29208327的博客 371

/usr/bin/ld误操作,导致链接失效或者是丢失

直接在终端操作sudo apt-get install --reinstall binutils

weixin_42058099的博客 1352

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

String 使用不当可能导致内存泄露

作者:HollisString是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比...

JAVA葵花宝典 419

AI Agent开发实战:100个真实场景题库解析

AI Agent开发涉及复杂的需求理解、架构设计及安全防护等关键技术环节。在工程实践中,开发者常面临需求偏差、系统崩溃等挑战,特别是在金融、医疗等高要求场景下。通过真实案例题库,开发者能系统性地掌握需求分析、架构决策树建模(如向量数据库选型)、安全攻防策略(如提示词注入防御)等核心技能。这些实战经验不仅能提升Agent的可用性和安全性,还能优化其在电商客服、智能家居等场景中的表现。题库采用动态难度系统,覆盖从基础到高级的开发挑战,是AI工程化落地的重要参考。

weixin_29057695的博客 342

Kaggle大神Abhishek的机器学习框架实战:从红酒数据集看交叉检验的坑与解法

本文通过Kaggle竞赛Grandmaster Abhishek Thakur的实战经验,以红酒数据集为例,深入探讨了机器学习中交叉检验的五大陷阱与优化策略。文章详细解析了决策树max_depth调优过程中的过拟合现象,对比了五种主流交叉检验方法的适用场景,并提供了回归问题中的分层技巧和特征工程陷阱的解决方案。最后,总结了交叉检验方案选型决策树,帮助数据科学家在实际项目中提升模型泛化能力。

h6j7k8l9p0的博客 963

报错:ImportError: XXXX.so:invalid ELF header

运行程序遇到如下报错: 原因是该路径下的.so文件与运行程序的环境不匹配,比如我在mac电脑上编译生成的.so文件,直接放到linux服务器上跑了,自然会有错误。解决的方法是在Linux环境中重新编译生成新的.so文件。 ...

【人工智能】王小草的博客 2万+

VXLAN技术详解

VXLAN(虚拟可扩展局域网)是一种Overlay二层虚拟化技术,通过MAC-in-UDP封装在IP网络上构建大规模虚拟二层网络。核心组件包括VTEP(隧道端点)、24位VNI(支持1600万个虚拟网络)和VXLAN网关。相比VLAN,VXLAN具有超大规模扩展、跨三层互联、支持虚拟机无缝迁移等优势,适用于云数据中心多租户隔离、跨数据中心互联等场景。其基于IP路由的封装方式无需改造物理网络,为现代云网络提供了弹性、安全的虚拟化解决方案。

kjkdd的博客 594

linux如何打开elf文件格式,Linux下的ELF文件格式简介(转)

图13. 数据表示ELF数据编码顺序与机器相关,数据类型有六种,见表1。4.ELF文件头象bmp、exe等文件一样,ELF的文件头包含整个文件的控制结构。它的定义如下:#define EI_NIDENT16typedef struct{unsigned char e_ident[EI_NIDENT];Elf32_Halfe_type;Elf32_Half e_machine;Elf32_Word ...

weixin_39668479的博客 1125

Vue项目实战:海康WebControl插件从安装到预览功能全流程(附RSA加密避坑指南)

本文详细介绍了在Vue项目中集成海康威视WebControl插件的全流程,从环境准备、插件部署到核心功能实现。重点解析了使用JS_RequestInterface获取RSA公钥并进行加密参数初始化的关键步骤与常见避坑指南,帮助开发者高效完成监控视频预览功能的开发与调试。

linux6sysadmin的博客 1227

history 历史命令记录功能如何防坏人(高级)

在 Linux 下面可以使用 history 命令查看用户的所有历史操作,同时 shell 命令操作记录默认保存在用户目录的 .bash_history 文件中。通过这个文件可以查询 shell 命令的执行历史,有助于运维人员进行系统审计和问题排查,同时在服务器遭受黑客攻击后,也可以查询黑客登录服务器的历史命令操作。但是黑客在入侵后,为了抹除痕迹,会删除 .bash_history 文件,这个就需...

墨痕诉清风的博客 1656

linux 文件格式elf,Linux下的ELF文件格式简介

图13. 数据表示ELF数据编码顺序与机器相关,数据类型有六种,见表1。4. ELF文件头象bmp、exe等文件一样,ELF的文件头包含整个文件的控制结构。它的定义如下:#define EI_NIDENT 16typedef struct{unsigned char e_ident[EI_NIDENT];Elf32_Half e_type;Elf32_Half e_machine;Elf32_Wo...

weixin_42126749的博客 178

《囚徒健身》 六艺,十式

文章目录《囚徒健身》 六艺,十式1、六艺,十式2、优缺点3、手臂和上半身 《囚徒健身》 六艺,十式 1、六艺,十式 1、俯卧撑: 2、深蹲: 3、举腿: 4、引体向上: 5、桥: 6、倒立撑: 十式就是每个动作分拆为十个不同的动作等级,进行训练 每一式里面,又根据做的组数和个数,分成三层,初级,中级,高级 依次循序渐进,每完成上一个动作的高级,则向下一个动作前进 2、优缺点 优点 : 六个动作都是很常见的,日常的动作,不太需要依赖什么器械,随时随地都可以练习,很方便 这些动作可以覆盖到全身大部分

简简单单Onlinezuozuo 4563

Linux下GCC编译工具集和ELF文件格式简介

Linux下GCC编译工具集和ELF文件格式简介 文章目录Linux下GCC编译工具集和ELF文件格式简介1 Linux GCC 简介2 简单编译2.1 编写程序2.2 编译 1 Linux GCC 简介 GCC 的意思也只是GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。 而GCC 也

qq_46470208的博客 749

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux下的ELF文件格式简介 .

1. 概述 Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型: (1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。 (2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加

gjy938815的专栏 560

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux烧写hex文件格式,各种烧写文件格式简介-ELF Hex Bin

一,ELFExecutable and linking format(ELF)文件是x86 Linux系统 下的一种常用目标文件(object file)格式,有三种主要类型:Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:(1)适于连接的可重定位文件(relocatable fil...

weixin_39665302的博客 556

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux:ELF文件格式和重谈进程地址空间

一篇带你完全掌握ELF文件格式和进程地址空间

Makise的博客 2642
上一篇: 写给Linux内核新手-关于Linux内核学习的误区
下一篇: FC7内核编译过程
cassper
博客等级 码龄22年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值