,初识ELF格式 ABI,EABI,OABI(由gnueabihf想到gnu,eabi,hf )

news/2024/10/11 16:15:18/

hf表示Hard Float 当您使用此标志时,在编译期间,编译器将编译您的程序,以便在启动后使用Floating Point Unit。 您的程序运行得更快,但前提是您使用浮点数! 如果您的CPU不支持它,或者无法启动它,请不要使用此标志。

编辑:
此外,如果您使用Soft Float,它将计算每个花车"软件"。

arm - eabihf hf代表什么? - Thinbug

尽管每天都在调用linux的elf文件做各种事,但却很少去了解他,最近尝试在orangepi上编译个elf到android手机上运行,因为两个CPU都是ARMv8的.结果运行失败了.遂查找原因.结果挖出这玩意...
以下内容大部分为摘抄整理:
关于ABI,EABI,OABI:
ABI(application binary interface)
应用程序二进制接口
一般应用程序是要分各种CPU架构的,ABI用于对接.
而ABI的不同则是linux内核和glibc的升级导致的规范变化导致的。不同的ABI程序和库在不同的环境下很高概率是不能运行的,除非是低版本最原始的ABI在现代系统上跑一般都可以向下兼容。而这种不兼容主要发生在C++身上,因为C++近几年的特性改变速度相对较快,管理困难。X86上常见的elf ABI有:
OS/ABI:                            UNIX - Linux
OS/ABI:                            UNIX - System V
OS/ABI:                            UNIX - GNU
其中GNU和Linux两种是相同的,只是使用不同版本的readelf会现实不同的结果。而system v则是最古老的,也是兼容性最好的。有的老一些的系统上只识别system v的ABI。但是system v ABI for x86_64却是比linux还要先进的ABI。因为这个ABI把大部分的参数转由寄存器传递,而不是由栈传递,对栈的使用减少就增加了以往的缓存溢出的难度。还有x32上的return to libc等攻击的手法也得变通,难度提高。
OABI 的O表示Old,旧的ABI
EABI的E表示Embedded 嵌入式
,是描述可连接目标代码,库目标代码,可执行文件映像,如何连接,执行和调试,以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础,可惜arm的EABI迄今为止没有完全订好。

EABI的好处 / 为何要用EABI

  • 支持软件浮点和硬件实现浮点功能混用
  • 系统调用的效率更高
  • 后今后的工具更兼容
  • 软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。 

OABI和EABI的区别 

 两种ABI在如下方面有区别:

  • 调用规则(包括参数如何传递及如何获得返回值)
  • 系统调用的数目以及应用程序应该如何去做系统调用
  • 目标文件的二进制格式,程序库等
  • 结构体中的 填充(padding/packing)和对齐。

以及:

 
  1. OABI:

  2. * ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa

  3. * gcc -dumpmachine: arm-unknown-linux

  4. * objdump -x for compiled binary:

  5. private flags = 2: [APCS-32] [FPA float format] [has entry point]

  6. * "file" on compiled Debian binary:

  7. ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped

  8. * "readelf -h | grep Flags""

  9. Flags: 0x0

  10. EABI:

  11. * ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4

  12. * gcc -dumpmachine: arm-unknown-linux-gnueabi

  13. * objdump -x for compiled binary:

  14. private flags = 4000002: [Version4 EABI] [has entry point]

  15. * "file" on compiled binary (under Debian):

  16. ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped

  17. * "readelf -h | grep Flags""

  18. Flags: 0x4000002, has entry point, Version4 EABI

关于编译器:

Gcc在编译的时候可以使用--enable-kernel指定最低支持的内核版本,这个选项会在elf头部添加.note.ABI-tag,如果编译的时候加入了-g参数,然后用gdb调试就可以显示。最大程度上查看一个elf文件信息。
Gcc的5.1版本的编译器会在编译时做大量激进的优化,但是有的优化是只对于最新的CPU特性有效,老一些的CPU在硬件层面就不支持这些优化,所以如此编译的程序就有兼容性问题。方法是用更老的编译器或者是用5.2之后解决了这个问题的更新的编译器。
附上elf格式解析: http://i.woblog.cn/2016/08/14/elf-format/

关于调试与分析的一些指令: 19. crontab 定时任务 — Linux Tools Quick Tutorial

  • file elf文件       #可查看一些elf的架构信息
  • readelf -a elf文件 #信息更全面
  • ldd elf文件        #查看一个程序依赖的库
  • objdump 二进制文件  #objdump工具用来显示二进制文件的信息
  • nm 目标文件         #nm 命令显示关于指定 File 中符号的信息
  • size               #查看文件映射到内存大小
  • lsof -c 进程名     #查看一个进程打开的文件
  • pstack命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;
  • strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
  • ipcs是Linux下显示进程间通信设施状态的工具,可以显示消息队列、共享内存和信号量的信息。对于程序员非常有用,普通的系统管理员一般用不到此指令。
  • iostat是I/O statistics(输入/输出统计)的缩写,用来动态监视系统的磁盘操作活动。
  • sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

参考资料:
http://www.shennongmin.org/?p=181
http://www.shennongmin.org/?p=176
http://www.cnblogs.com/mylinux/p/5836795.html
https://www.crifan.com/order_eabi_and_oabi/
http://www.bijishequ.com/detail/124277?p=

 


http://www.ppmy.cn/news/842115.html

相关文章

【第69篇】HF-Net:From Coarse to Fine: Robust Hierarchical Localization at Large Scale

文章目录 摘要1、简介2、相关工作3、层次定位4、提出的方法4.1、HF-Net架构4.2、训练过程5、实验5.1、局部特征评价5.2、实现细节5.3、大规模的本地化5.4、运行时评估6、结论🐇🐇🐇🐇🐇🐇 🐇 欢迎阅读 【AI浩】 的博客🐇 👍 阅读完毕,可以动动小手赞一下👍…

特别活动丨HuggingFace工程师教你HF的正确打开方式

主题: HuggingFace的正确打开方式时间: 2022年12月15日(周四) 20:30-21:30 由北京智源人工智能研究院主办的2022大模型创新论坛正如火如荼进行中,论坛包含训练营、峰会、创业大赛、黑客马拉松、闭门研讨会、创新应用榜…

huggingface HF_HOME 更换缓存目录

默认情况下,下载数据集并缓存到 ~/.cache/huggingface/dataset. 您可以通过设置HF_HOME环境变量来自定义缓存的文件夹。 【注意】:重启电脑!!! 若配置完环境,发现并没有生效,基本解决思路都是…

RFID标签低频(LF)、高频(HF)、超高频(UHF)

对一个 RFID系统来说,它的频段概念是指读写器通过天线发送、接收并识读的标签信号频率范围。从应用概念来说,射频标签的工作频率也就是射频识别系统的工作频率,直接决定系统应用的各方面特性。在 RFID系统中,系统工作就像我们平时…

【1911. 最大子序列交替和】

来源:力扣(LeetCode) 描述: 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 5) - (2 3) 4 。 给你一个数组 nums &#xf…

智能音箱语音唤醒率的提高

“小度小度,给我放首《小苹果》”、“叮咚叮咚,今天天气怎么样“,几年前跟小小的音箱交流感觉还比较呆,如今音箱的人工交互越来越智能,就有更多人愿意使用,相应的,越来越多的厂商也愿意进入这个…

小度智能音箱维修点_小度在家是哪家公司的_小度在家智能音箱怎么样

百度在北京推出了新款智能音箱“小度在家”,这款小度在家怎么样?百度智能音箱小度在家值得入手吗? 小度在家是哪家公司的? 小度在家是百度AI首款带屏智能视频音箱,由百度联合小鱼在家共同定义、深度合作的一款针对家庭…

如何用树莓派做一个家庭语音助手/智能音箱

一、前言 这学期闲来无事,于是搞了个简单的家庭语音助手,其主要实现的功能有: 语音唤醒;控制家电;询问时间和日期;询问天气情况;查询垃圾分类;播报新闻;微信小程序远程…