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++。
GCC编译器ABI的更多相关文章
- 在CentOS 7.2下升级gcc编译器的版本
默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...
- C语言的编译过程、安装gcc编译器以及设置环境变量
以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...
- 利用GCC编译器生成动态链接库和静态链接库
转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...
- GCC编译器编译链接
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...
- Linux安装gcc编译器详解
本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...
- GCC编译器使用
一.GCC简介 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进 ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
- 临时改GCC编译器,重启后失效
临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...
- windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...
随机推荐
- Android LayoutCast 初探
今天无意间看见了一个神器,顿时让我血气蓬勃! 废话不多说,先上网址:https://github.com/mmin18/LayoutCast 把代码和资源文件的改动直接同步到手机上,应用不需要重启.省 ...
- 使用不同模板引擎beetl、FreeMarker、Velocity动态解析sql的方法
1. String sql = null;if(null == renderType || renderType.equals(ConstantRender.sql_renderType_beetl) ...
- iOS - 开源框架、项目和学习资料汇总(动画篇)
动画 1. Core Animation笔记,基本的使用方法 – Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组.2. awe ...
- mysql操作常用技巧
删除一张表的数据,条件在另一张表 delete a from A a,B b where a.tel=b.tel and a.code=b.code and a.day='201808';
- div的最小宽高和最大宽高
div的最小宽高和最大宽高很少使用但是很实用,今天敲代码,就遇到了,要在div里设置滚动条,众所周知,一般是设overflow-y:auto,但需要一个高度,只有div里的内容超过这个高度时,才会有滚 ...
- Python之时间模块
1,怎么打印时间戳 2,怎么打印日期 3,怎么把字符串转换成python认识的日期 把日期转换成字符串 字符串转换成日期格式 time.strptime("2017-5-16",& ...
- 洛谷P2178 品酒大会【后缀数组】【单调栈】
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- OpenCV学习笔记之课后习题练习4-1
第四章课后练习1 1.本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构.下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助.a.创建一个程序实现以下功能:(1)从视频文件中读 ...
- ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds Me ...
- SQL Fundamentals: 数据更新及事务处理(INSERT INTO,UPDATE,DELETE,事务,锁)
SQL Fundamentals || Oracle SQL语言 在SQL语句中,数据操作语言DML由两部分组成,查询(DQL).更新操作(增加,修改,删除). 增加数据(INSERT INTO) 数 ...