• GCC编译器ABI


    ABI与EABI

    1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口

    ABI允许编译好的目标代码在使用兼容ABI的系统中无改动的运行。ABI是比API更接近硬件的一层接口,可以理解为对机器码的一层接口,

      不同的指令集(ISA),ABI肯定是不同的,ABI在linux中也是有规范的,称为Linux Standard Base(LSB),ELF,glibc,kernel都有相应的规定。

      所以不同的发型版本之间,程序可以兼容执行

    API支持相同的代码在支持这个API的任何系统中编译,定义编代码和库的接口。

    2)EABI(Embedded ABI),与通用计算机的ABI的主要区别是应用程序中允许使用特权指令,不需要动态链接和更紧凑的堆栈,广泛应用在ARM和Power PC中

      有时,也被称为gnu eabi,还有一个比较老的版本,OABI,Old,Legacy的意思。

    libc是Linux下的ANSI C的函数库,

    glibc是Linux下的GUN C函数库,比如标准库中的fopen,memcpy等函数,在gnu中会被实现为read,write等函数。

    ldd + x.out可以显示出x.out需要的链接的库,x.out是一个elf的文件,相当于win下的bin文件。

      找到libc.so之后,可以直接在shell命令中执行,输出相应的编译信息。

    gcc和libc是linux总相互依赖的两个文件,他们的合作方式类似与Linux系统的“自举”,首先利用老的gcc和libc系统上,编译产生新的gcc,libc,

      再用这个新的gcc编译产生新的gcc,libc。

    普通的Linux发行版本中,使用的abi可能是System V,POSIX、

    elf是linux中可执行的连接文件, 可以通过readelf,或者objdump,工具来查看。其中会包含汇编之后的abi接口,elf表头等信息。

      readelf xx -P .comment,查看gcc版本。

      readelf -a xx,显示某个elf文件内容。

    objdump可以从可执行文件中,反汇编出汇编文件,objdump -d  out.o

    交叉编译工具链的命令规则:arch [-vendor] [-os] [-(gnu)eabi]

    arch  ----  体系架构,如ARM,MIPS

    vendor ---- 工具链提供商

    os ---- 目标操作系统

    eabi ---- 嵌入式应用二进制接口(Embedded Application Binary Interface)

    arm-none-eabi-gcc用于编译ARM架构的裸机系统(包括ARM Linux的boot、kernel,不适用于编译Linux应用application),一般适合ARM7,Cortex-M和Cortex-R内核的芯片使用,使用newlib这个专用于嵌入式的C库。

    newlib是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快。newlib实现了很多复杂的功能,包括字符串支持,浮点运算,内存分配(malloc)和IO流函数(printf, fprintf等)。其中libc提供C语言库的实现,libm提供浮点运算支持。

    arm-none-linux-gnueabi-gcc是Codesourcery公司(目前已被Mentor收购)的基于GCC的ARM交叉编译工具。可用于交叉编译ARM linux系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和APP应用程序。一般ARM9,ARM11,Cortex-A内核使用。

    arm-eabi-gcc  Android ARM编译器使用。

    armcc是由ARM公司推出的编译工具,功能和arm-none-eabi类似,可以编译裸机程序(u-boot,Kernel)。armcc一般和ARM开发工具一起,keil MDK,ADS,RVDS和DS-5等。

    arm-none-uclinuxeabi-gcc用于uCLinux,使用Glibc。

    arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc:两个交叉编译器分别使用于armel和armhf两个不同的架构,armel和armhf这两种架构在对待浮点运算上采取不同的策略(拥有fpu的arm才支持这两种浮点运算策略)

    两个编译器只是gcc的选项-mfloat-abi的默认值不同,有soft(不适用fpu进行浮点运算),softfp(armel架构),hard(armhf架构,使用的都是fp的寄存器,性能最好)

    ubuntu下安装gcc-arm-linux-gnueabi,sudo apt-get install gcc-arm-linux-gnueabi

      但是注意安装之后,名字叫做arm-linux-gnueabi-gcc

    GCC是gnu计划中的编译器标准套件,原名为GNU C语言编译器,只能编译c代码,但是很快被扩展到支持C++,Fortran,Pascal,Java等。

    llvm是编译器的一种架构系统,基于c++编写,apple是其主要的推动者,我们可以将llvm看做一个完整的编译器架构,包括前端,优化,后端,

      也可以将它认为是一个开发编译器,解释器相关的库,聚焦于编译器后端的功能(代码生成,优化,JIT等)。

    Clang基于c++编写,基于llvm,发布于BSD许可的c/c++/objective-c/objective-c++编译器,

      相比较于gcc,Clang是一个高度模块化开发的轻量级编译器,编译速度快,占用内存小,方便二次开发。

      

      

      gcc在4.9版本之后,加入了对armv8的优化支持,2014年发布,目前gcc的最新版本已经到gcc7.4

      linux系统中的底层c++库,libstdc++表示gcc对应的C++标准库,libc++表示针对Clang编译器特别重写的c++标准库。

        目前的android NDK(jave开发环境SDK中通过JNI来调用NDK中编译好的c/c++库文件)中,多使用libc++来代替libstdc++。

  • 相关阅读:
    亚马逊云服务器VPS Amazon EC2 免费VPS主机配置CentOS及其它内容
    Linux + Mono 目前已经支持Entity Framework 6.1
    CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
    Linux CentOS下如何确认MySQL服务已经启动
    C#使用Timer.Interval指定时间间隔与指定时间执行事件
    MySQL数据库有外键约束时使用truncate命令的办法
    C++中字符和字符串的读取与使用
    结构体的运算符重载
    P1358 扑克牌
    P1284 三角形牧场
  • 原文地址:https://www.cnblogs.com/-9-8/p/4463620.html
Copyright © 2020-2023  润新知