zoukankan      html  css  js  c++  java
  • arm oabi eabi

    http://blog.csdn.net/xuxinshao/archive/2010/02/10/5304610.aspx

    首先,我们先看一下ARM处理器是如何处理浮点运算的。
    交叉编译器在编译的时候,对于浮点运行会预 设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制。也就是说如果有浮点协处理器则交给它去做,如果没有则会产生一个陷阱(trap,处理器响应异常的机制), 而我们事先准备好针对浮点指令的陷阱处理程序就可以通过软件来模拟浮点运算指令。

    然后,我们 解释一下OABI和EABI这两个概念。
    /********************************************************************************************/
    1。什么是ABI
    ABI,application binary interface (ABI),应用程序二进制接口。
    既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:
    A。应用程序 <-> 操作系统;
    B。应用程序 <-> (应用程序所用到的)库
    C 。应用程序各个组件之间

    类似于API的作用 是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。

    2。什么是OABI 和 EABI
    OABI中的O,表示 “Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。
    EABI中的E,表示“Embedded”,是一种新的ABI。
    EABI 有时候也叫做GNU EABI。
    OABI和EABI都是专门针对ARM的CPU来说的。

    3。EABI的好处 / 为何要用EABI
    A。支持软件浮点和硬件实现浮点功 能混用
    B。系统调用的效率更高
    C。后今后的工具更兼容
    D。软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。

    4。OABI和EABI的区别
    两种ABI在如下方面有区别:
    A。调用规则(包括参数如何传递及如何获得返回 值)
    B。系统调用的数目以及应用程序应该如何去做系统调用
    C。目标文件的二进制格式,程序库等
    D。结构体中的 填充(padding/packing)和对齐。
    E。
    OABI:
    * ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
    * gcc -dumpmachine: arm-unknown-linux
    * objdump -x for compiled binary:

    private flags = 2: [APCS-32] [FPA float format] [has entry point]
    * "file" on compiled Debian binary:
    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
    * "readelf -h | grep Flags""
    Flags: 0x0
    EABI:
    * ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4
    * gcc -dumpmachine: arm-unknown-linux-gnueabi
    * objdump -x for compiled binary:
    private flags = 4000002: [Version4 EABI] [has entry point]
    * "file" on compiled binary (under Debian):
    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
    * "readelf -h | grep Flags""
    Flags: 0x4000002, has entry point, Version4 EABI
    /********************************************************************************************/
    在虚拟机 中,运行:arm_v5t_le-gcc -dumpmachine,输出:armv5tl-montavista-linuxeabi;
    运行 arm_v5t_le-readelf -h EXEC | grep Flags,(注:EXEC代表用交叉编译工具编译的可执行文件名),输出: Flags: 0x4000002, has entry point, Version4 EABI。
    上述结果说 明当前使用的montavista的编译器是符合EABI标准的。
    使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。


    看到这里,之前遇到的一个问题终于弄明白 了。之前在Makefile中一直包含一个-mabi=apcs-gnu的参数,而apcs-gnu是OABI的参数,因此将OABI的参数传给符合 EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。比如printf("%s %f",s,f);这句话输出的浮点数值并不是传给printf的参数,而是一个莫名其妙的数字。解决办法:在Makefile中将 “-mabi=apcs-gnu”去掉,重新编译运行,成功!

  • 相关阅读:
    .NET微信网页开发之JS-SDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
    .NET项目中NLog的配置与使用
    ASP.NET MVC中使用jQuery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
    Linux CentOS上安装 MySQL 8.0.16
    微信小程序开发之多图片上传+.NET WebAPI后端服务保存图片资源
    MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
    .NET轻松实现支付宝服务窗网页授权并获取用户相关信息
    .NET微信网页开发之通过UnionID机制,解决用户在不同公众号,或在公众号、移动应用之间帐号统一问题
    Navicat远程连接MySQL 提示1045
    Vs Code推荐安装插件
  • 原文地址:https://www.cnblogs.com/leaven/p/1892658.html
Copyright © 2011-2022 走看看