arm-linux-gcc用法

arm-linux-gcc用法
wangw899( 楼主 ) 2011-3-9 17:11:37只看该作者倒序浏览
我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。

下面将
arm-linux-gcc编译工具的一些常用命令参数介绍给大家。

在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:
1. 预处理(Pre-Processing)
2. 编译(Compiling)
3. 汇编(Assembling)
4. 链接(Linking)
Linux程序员可以根据自己的需要让 GCC在编译的任何阶段结束,以便检查或使用编译器在该阶
段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码
来为今后的调试做好准备。

和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。

以文件example.c为例说明它的用法
0. arm-linux-gcc -o example example.c
不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。

-o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out
1. arm-linux-gcc -c -o example.o example.c
-c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以
2.arm-linux-gcc -S -o example.s example.c
-S参数将对源程序example.c进行预处理、编译,生成example.s文件
-o选项同上
3.arm-linux-gcc -E -o example.i example.c
-E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预
处理后的内容打印到屏幕上)
就是将#include,#define等进行文件插入及宏扩展等操作。

4.arm-linux-gcc -v -o example example.c
加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。

5.arm-linux-gcc -g -o example example.c
-g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。

6.arm-linux-gcc -Wall -o example example.c
-Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变
量等。

7.arm-linux-gcc -Ox -o example example.c
-Ox使用优化选项,X的值为空、0、1、2、3
0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用
较大的内存空间。

8.arm-linux-gcc -I /home/include -o example example.c
-Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。

如果在预设系统及当前目录
中没有找到需要的文件,就到指定的dirname目录中去寻找。

9.arm-linux-gcc -L /home/lib -o example example.c
-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。

在默认状态下,连接程序ld
在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。

10.arm-linux-gcc–static -o libexample.a example.c
静态链接库文件
gcc在命令行上经常使用的几个选项是:
-c 只预处理、编译和汇编源程序,不进行连接。

编译器对每一个源程序产生一个目标文件。

-o file 确定输出文件为file。

如果没有用-o选项,缺省的可执行文件的输出是a.out,目标文件和汇编文件的输出对source.suffix分别是source.o和source.s,预处理的C源程序的输出是标准输出stdout。

-Dmacro 或-Dmacro=defn 其作用类似于源程序里的#define。

例如:% gcc -c -DHAVE_GDBM
-DHELP_FILE=\"help\" cdict.c其中第一个- D选项定义宏HAVE_GDBM,在程序里可以用#ifdef
去检查它是否被设置。

第二个-D选项将宏HELP_FILE定义为字符串“help”(由于反斜线的作用,引号实际上已成为该宏定义的一部分),这对于控制程序打开哪个文件是很有用的。

-Umacro 某些宏是被编译程序自动定义的。

这些宏通常可以指定在其中进行编译的计算机系统类型的符号,用户可以在编译某程序时加上 -v选项以查看gcc缺省定义了哪些宏。

如果用户想取消其中某个宏定义,用-Umacro选项,这相当于把#undef macro放在要编译的源文件的开头。

-Idir 将dir目录加到搜寻头文件的目录列表中去,并优先于在gcc缺省的搜索目录。

在有多个-I选项的情况下,按命令行上-I选项的前后顺序搜索。

dir可使用相对路径,如-I../inc等。

-O 对程序编译进行优化,编译程序试图减少被编译程序的长度和执行时间,但其编译速度比不做优化慢,而且要求较多的内存。

-O2 允许比-O更好的优化,编译速度较慢,但结果程序的执行速度较快。

-g 产生一张用于调试和排错的扩展符号表。

-g选项使程序可以用GNU的调试程序GDB进行调试。

优化和调试通常不兼容,同时使用-g和-O(-O2)选项经常会使程序产生奇怪的运行结果。

所以不要同时使用-g和-O(-O2)选项。

-fpic或-fPIC 产生位置无关的目标代码,可用于构造共享函数库。

以上是gcc的编译选项。

gcc的命令行上还可以使用连接选项。

事实上,gcc将所有不能识别的选项传递给连接程序ld。

连接程序ld将几个目标文件和库程序组合成一个可执行文件,它要解决对外部变量、外部过程、库程序等的引用。

但我们永远不必要显式地调用ld。

利用gcc命令去连接各个文件是很简单的,即使在命令行里没有列出库程序,gcc也能保证某些库程序以正确的次序出现。

gcc的常用连接选项有下列几个:
-Ldir 将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜
索目录。

在有多个-L选项的情况下,按命令行上-L选项的前后顺序搜索。

dir可使用相对路径。

如-L../lib等。

-lname 在连接时使用函数库libname.a,连接程序在-Ldir选项指定的目录下和/lib,/usr/lib 目录下寻找该库文件。

在没有使用-static选项时,如果发现共享函数库libname.so,则使用
libname.so进行动态连接。

-static 禁止与共享函数库连接。

-shared 尽量与共享函数库连接
静态编译一下试试?
arm-linux-gcc -static -o hello hello.c。

合集下载

关于arm-linux-gcc的安装与配置

关于arm-linux-gcc的安装与配置

关于arm-linux-gcc的安装与配置在嵌入式开发中我们经常会用到arm-linux-gcc 来编译我们的应用程序。

作为arm-linux-gcc 的入门,我们先看看如何安装arm-linux-gcc。

安装arm-linux-gcc 还是比较简单的,我们看看Redhat9.0 下的安装步骤吧。

1、将arm-linux-gcc 的压缩包arm-linux-gcc-2.95.3.tar.gz 解压缩;2、将路径usr/local 下的arm 目录拷贝到你自己系统的/usr/local 下;3、1>方法一:vi /etc/profile;在出现pathmunge 的语句段后添加pathmunge /usr/local/arm/2.95.3(版本号)/bin;保存对profile 的修改后,执行source /etc/profile 就OK 了2>方法二:修改/etc/bash.bashrc 文件#vim /etc/bash.bashrc(ubuntu 12.10 下面好像是无法打开的,会出现warning)在最后加上:export PATH=$PATH:/usr/local/arm/3.4.1/bin export PATH立即使新的环境变量生效,不用重启电脑:对应方法一:#source/etc/profile 之后你就可以用arm-linux-gcc 来编译你的程序了对应方法二:# source /etc/bash.bashrc测试:# arm-linux-gcc -v 备注:但是很多人在这个地方仍然出现很多问题,比如出现no such file or directory 或者not a valid identifier,其实出现这样问题的原因是你安装的linux 系统是64 位的(比如用的是ubuntu_amd64 系统,但是用i386就不会出想问题),这才是最关键的地方。

下载一个32 位库,这样就解决问题了。

arm-linux-gcc配置安装

arm-linux-gcc配置安装

arm-linux-gcc配置安装1、⾸先去下载arm-linux-gcc压缩包密码:ygf33、把arm-linux-gcc压缩包放到你⾃⼰指定的⽬录,我的放在了/root/armlinux/arm4、解压缩:#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2解压完成后,你的⽬录下会出现opt⽬录。

5、找到这个路径:/root/armlinux/arm/opt/FrinendlyARM/toolschain/4.4.3/bin6、配置环境变量:修改环境变量,把交叉编译器的路径加⼊到PATH。

(有三种⽅法,强烈推荐使⽤⽅法⼀) ⽅法⼀:修改/etc/bash.bashrc⽂件#vim /etc/bash.bashrc在最后加上:export PATH=$PATH:/root/armlinux/arm/opt/FrinendlyARM/toolschain/4.4.3/bin (红⾊部分是第5步找到的路径,路径每个⼈的/root/armlinux/arm/路径都不同,要看好⾃⼰把压缩包解压到了哪⾥) 使⽂件⽣效:source /etc/bash.bashrc ⽅法⼆:修改/etc/profile⽂件:(重启后失效)# vim /etc/profile增加路径设置,在末尾添加如下,保存/etc/profile⽂件:export PATH=$PATH:/root/armlinux/arm/opt/FrinendlyARM/toolschain/4.4.3/bin 使⽂件⽣效:source /etc/profile ⽅法三:#export PATH=$PATH:/root/armlinux/arm/opt/FrinendlyARM/toolschain/4.4.3/bin 注:(这只能在当前的终端下才是有效的!)如果出现错误:not a valid identifier(⼤部分出现于CentOS) yum install -y lsb-core 如果不对,⾃⾏百度需要安装的依赖7、检查安装是否成功:arm-linux-gcc -v。

arm-linux-系列工具

arm-linux-系列工具

arm-linux-系列工具----ld,ar,as,objcopy 一些编译器相关知识学习。

GNU GCC简介:GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。

GNU GCC的基本功能包括:输出预处理后的C/C++源程序(展开头文件和替换宏)输出C/C++源程序的汇编代码输出二进制目标文件生成静态库生成可执行程序转换文件格式GCC 组成:1. C/C++交叉编译器arm-elf-gccarm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。

编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。

arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。

2. 汇编器arm-elf-asarm-elf-as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。

arm-elf-as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区(Section)中。

3. 连接器arm-elf-ldarm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS 区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。

该目标程序是ELF格式,并且可以包含调试信息。

arm-elf-ld会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符号的绝对定位地址。

ARM-LINUX-GCC设置环境变量

ARM-LINUX-GCC设置环境变量

ARM-LINUX-GCC设置环境变量在/etc/profile 里添加arm-linux-gcc 的存放路径具体是在命令行输入#sudo gedit /etc/profile 回车export PATH=$PATH:/你的arm-linux-gcc 存放的路径保存退出export PATH=/usr/local/arm/bin注意这里最好使用export PATH=$PATH:/usr/local/arm/4.3.2/bin没有$符号的时候可能会修改了默认路径然后会回到终端输入命令界面,输入#arm-linux-gcc -v下面的来自hi.baidu/gonghuixue/item/74a18faa2f7522921410734f1.首先安装build-essential:sudo apt-get install build-essential2.将友善之壁光盘中的arm- linux-gcc-4.3.2.tgz 拷贝到某个文件夹下,从终端进入该文件夹,进行解压:sudo tar -zxvf arm-linux-gcc-4.3.2.tgz -C /NOTE:配置项的C 是大写,且C 后面有个空格。

3.添加环境变量:这一步是我耗时间最长的,关于这一步网上也有很多中说法:1>sudo gedit /root/.bashrc : 在最后一行添加exprot PATH=$PATH:/usr/local/arm/4.3.2/bin。

我不知道其它linux 系统行不行,反正我在ubuntu10.04 下是不行,运行arm-linux-gcc -v 提示:arm-linux-gcc:command not found。

2>先gedit ~/.profile,然后在最后一行添加:export PATH=$PATH:/usr/local/arm/4.3.2/bin,接着source~/.profile,说是可以立即生效,这种是可以,但是我的总是只能使用一次,如果把终端关掉重新运行arm- linux-gcc -v,还是提示command not found.3> sudo gedit /etc/environment,在最后一个:号之后和号之前添加/usr/local/arm/4.3.2/bin:,OK!~~tips:感谢大家的阅读,本文由我司收集整编。

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。

下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。

在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:1. 预处理(Pre-Processing)2. 编译(Compiling)3. 汇编(Assembling)4. 链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。

和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。

以文件example.c为例说明它的用法0. arm-linux-gcc -o example example.c不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。

-o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out1. arm-linux-gcc -c -o example.oexample.c-c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以2.arm-linux-gcc -S -o example.sexample.c-S参数将对源程序example.c进行预处理、编译,生成example.s文件-o选项同上3.arm-linux-gcc -E -o example.iexample.c-E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上)就是将#include,#define等进行文件插入及宏扩展等操作。

交叉编译器arm-linux-gcc

交叉编译器arm-linux-gcc

交叉编译器arm-linux-gcc(⼀)交叉编译器简介在⼀种计算机环境中运⾏的编译程序,能编译出在另外⼀种环境下运⾏的代码,这个编译过程就叫交叉编译.简单地说,就是在⼀个平台上⽣成另⼀个平台上的可执⾏代码.(⼆)体系结构与操作系统(1)常见的体系结构有ARM结构、x86结构等.(2)常见的操作系统有linux,windows等.(3)同⼀个体系结构可以运⾏不同操作系统,如x86上可以运⾏Linux、Windows等,在ARM上可以运⾏Linux、WinCE.(4)同⼀个操作系统可以在不同的体系结构上运⾏,⽐如Linux可以运⾏在x86上,也可以运⾏在ARM上.(5)同样的程序不可能运⾏在多个平台上,⽐如Windows下应⽤程序不能在Linux下运⾏.如果⼀个应⽤程序想在另⼀个平台上运⾏,必须使⽤针对该平台的编译器,来重新编译该应⽤程序的⼆进制代码.⽐如在Linux系统下运⾏Windows平台的QQ软件,必须按照以下⼏个步骤:1.QQ程序源代码2.使⽤Linux下的编译器来编译QQ软件的源代码这样编译出来的可执⾏程序就可以在Linux下运⾏了.所以,如何使ARM来运⾏⽤户的应⽤程序呢,就需要⽤到针对ARM的编译器来编译程序.(三)使⽤交叉编译器的原因ARM上可以运⾏操作系统,所以⽤户完全可以将ARM当做计算机来使⽤,理论上也可以在ARM上使⽤本地的编译器来编译程序.但是,编译器在编译程序时,会产⽣⼤量的中间⽂件,这会占⽤很⼤的内存和磁盘空间,且对CPU处理速度要求较⾼,⽐如S3C2440A内存、磁盘空间只有⼏⼗到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进⾏ARM-linux嵌⼊式开发时必须在PC机(x86结构)上编译出能够运⾏在ARM上的程序,然后再将程序下载到ARM中来运⾏.这就⽤到了交叉编译器.要进⾏交叉编译,⽤户需要在主机平台上安装对应的交叉编译⼯具链(cross compilation tool chain),然后⽤这个交叉编译⼯具链编译⽤户的源代码,最终⽣成可在⽬标平台上运⾏的代码.交叉编译⼯具链可以从⽹上下载,也可以⾃⼰制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译⼯具链有:(1)Cross -2.95.3 tar: 该版本较早,除了编译vivi外⼀般不使⽤.(2)arm920t-eabi.tgz: 4.1.2版本的编译器,⽀持eabi,可以编译TX2440A开发板上的所有程序.(3)arm-linux-gcc: 4.3.2版本的编译器,⽀持eabi,是最常见的交叉⼯具链.Attention什么是EABIEABI,Embeded application binary interface,即嵌⼊式应⽤⼆进制接⼝,是描述可连接⽬标代码、库⽬标代码、可执⾏⽂件影像、如何连接、执⾏和调试以及⽬标代码⽣成过程,和c, c++语⾔接⼝的规范,是编译连接⼯具的基础规范,也是研究它们⼯作原理的基础.简⽽⾔之,EABI就是⼀种编译规范,交叉编译器在编译时,对于浮点运算会使⽤硬浮点运算,⽽对于没有硬浮点运算的处理器,⽐如S3C2440,会使⽤软浮点,但这样会在速度上受到很⼤的限制,⽽EABI则对浮点运算进⾏了优化,提⾼了浮点运算的性能,节省了编译时间.(四)安装交叉⼯具链arm-linux-gcc 4.3.2安装交叉编译器arm-linux-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译⼯具链,换句话说,是将交叉编译器arm-linux-gcc 4.3.2在Linux操作系统下安装.安装步骤:(1)启动Samba服务器,打开共享⽬录/home/lishuai,将压缩⽂件arm-linux-gcc-4.3.2.tgz复制到/home/lishuai下.(2)解压软件包arm-linux-gcc-4.3.2.tgz.[root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz1.⽬录4.3.2就是该交叉编译器的⽬录.从arm-linux-gcc-4.3.2.tgz解压信息来看,该软件包需要解压在usr/local/arm下,⽽实际却解压到了共享⽬录/home/lishuai下2.进⼊⽬录usr/local/内,并没有找到arm⽂件夹,所以需要新建⼀arm⽂件夹,再将⽬录4.3.2移动到新建⽬录usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可执⾏⽂件.[root@localhost local]#mv /home/lishuai/usr/local/arm/4.3.2 ./3.进⼊⽬录/usr/local/arm/4.3.2/bin,可以看到不同类型的编译器.但在ARM下经常⽤到是arm-linux-gcc.其实它也是⼀个gcc编译器,与gcc 使⽤⽅法⼀致,不过该编译器是针对arm体系结构、Linux操作系统的编译器.利⽤该编译器就可以编译出运⾏在ARM上的Linux操作系统下的应⽤程序.4.进⼊⽬录/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib⽬录下存放的是库⽂件,⽤户编写的应⽤程序在运⾏时就依赖于这些库⽂件.5.此时还不能编译源码,系统⼀般会提⽰找不到命令arm-linux-gcc.这是环境变量在作祟.所以必须修改环境变量PATH.[root@localhost lishuai]#vi /etc/profile在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC"这⼀⾏的下⾯添加环境变量,输⼊:export PATH=/usr/local/arm/4.3.2/bin:$PATH指定变量PATH为交叉编译器的路径,⽬的是告诉操作系统可以到⽬录/usr/local/arm/4.3.2/bin下查找可执⾏⽂件6.[root@localhost lishuai#:source /etc/profile//使已修改的配置⽂件/etc/profile⽣效7.查看arm-linux-gcc编译器的版本[root@localhost lishuai]#arm-linux-gcc -v(五)arm-linu-gcc应⽤实例实例:如何使⽤交叉编译器编译源码包boa-0.94.13.tar.tar1. 启动SMB服务器,将源码包放在共享⽂件夹/home/lishuai下2. 输⼊命令: tar xzvf boa-0.94.13.tar.tar//解压该源码包//⼀般的源码包内有Makefile⽂件,执⾏make就可以编译,但该源码包内没有,此时执⾏make是⽆效的//仍然没有Makefile,但找到了configure⽂件,通过执⾏configure⽂件可以⽣成Makefile[root@localhost lishuai]# ./configure//运⾏configure⽂件,⽣成了Makefile⽂件//由于要编译出在ARM平台上的程序,就需要使⽤交叉编译器.在Makefile⽂件内的绿⾊⼤写字母都是Makefile变量,可以看到变量CFLAGS = -g -o2 -pipe -Wall -l,该变量是设置编译选项;变量CC = gcc,该变量是设置需要使⽤的编译器.由于要使⽤交叉编译器arm-linux-gcc,所以该变量应设置为CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存并退出.[root@localhost lishuai]#make//执⾏make进⾏编译//⽣成名为boa的可执⾏程序,该程序可下载到ARM内来执⾏其实,这个过程也叫做移植.移植就是将⼀个源码包经过修改、配置、交叉编译,然后下载到⼀个平台上运⾏.⽐如经常移植的有Bootloader、内核、QT等.。

arm-linux-gcc 4.3.2编译安装过程

arm-linux-gcc 4.3.2编译安装过程收藏arm-linux-gcc 4.3.2编译安装过程本文由《我的arm-gcc工具编译安装过程》修正而成,红字部分为与原作不同之处,希望对大家有所帮助。

原文地址:/blog/static/28351497200902193223687/我的编译环境是在ubuntu8.10 amd64,gcc版本为4.3.2,编译的linux内核版本为2.6.8,故后面需要修改少许内核头文件。

开始前确认环境里有texinfo, gawk(注意mawk编译glibc header时会有问题), bison, flex,没有就安装它们。

>sudo apt-get install texinfo gawk bison flex工作的目录是用户目录下源文件放在目录cross_source里编译的工作目录是cross_buildxxx 就是存放解压出来的源代码,例如binutils-2.19.tar.bz2,解压放在binutils-2.19 xxx_build 用于编译的目录,例如binutils-2.19.tar.bz2,编译目录是binutils-2.19_build用到的文件是binutils-2.19.tar.bz2gcc-core-4.3.2.tar.bz2gcc-g++-4.3.2.tar.bz2mpfr-2.3.2.tar.bz2gmp-4.2.4.tar.bz2linux-2.6.28.tar.bz2glibc-ports-2.7.tar.bz2glibc-2.7.tar.bz2首先创建目录>mkdir cross_source>mkdir cross_build>cd cross_build1编译,安装binutilsbinutils的配置和编译安装,binutils的编译一般不会遇到什么问题,至少我没有遇到。

>sudo apt-get install texinfo>tar -jxvf ../cross_source/binutils-2.19.tar.bz2根据[Bug gas/7026] New: ARM target wont build, error: format not a string literal and no format arguments,修改tc-arm.c>mkdir binutils-2.19_build>cd binutils-2.19_build>../binutils-2.19/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2 >make>sudo make all install这就会把binutils的编译结果安装到/usr/local/arm/4.3.2/里binutils安装后需要把路径导出。

arm-linux-gccldobjcopyobjdump使用总结

arm-linux工具的功能如下:arm-linux-addr2line 把程序地址转换为文件名和行号。

在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。

arm-linux-ar 建立、修改、提取归档文件。

归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。

arm-linux-c++flit 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。

arm-linux-gprof 显示程序调用段的各种数据。

arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。

通常,建立一个新编译程序的最后一步就是调用ld。

arm-linux-nm 列出目标文件中的符号。

arm-linux-objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。

arm-linux-objdump 显示一个或者更多目标文件的信息。

使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。

arm-linux-ranlib 产生归档文件索引,并将其保存到这个归档文件中。

在索引中列出了归档文件各成员所定义的可重分配目标文件。

arm-linux-readelf 显示elf格式可执行文件的信息。

arm-linux-size 列出目标文件每一段的大小以及总体的大小。

默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。

arm-linux-string 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。

默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其他类型的文件它打印整个文件的可打印字符。

这个程序对于了解非文本文件的内容很有帮助。

arm-linux-strip 丢弃目标文件中的全部或者特定符号。

arm-linux-gcc -wall -O2 -c -o $@ $<-o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件-Wall 指定产生全部的警告信息-O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高-c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由 .c 或 .cc 变成 .o 的目标文件-S 只激活预处理和编译,就是指把文件编译成为汇编代码arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址-Tbss ADDRESS Set address of .bss section-Tdata ADDRESS Set address of .data section-Ttext ADDRESS Set address of .text section示例:${CROSS}ld -Ttext=0x33000000 led.o -o led.elf使用连接脚本设置地址:arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf其中beep.lds 为连接脚本如下:arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换示例:arm-linux-objcopy –o binary –S elf_file bin_file常用的选项:input-file , outflie输入和输出文件,如果没有outfile,则输出文件名为输入文件名2.-l bfdname或—input-target=bfdname用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析3.-O bfdname 输出的格式4.-F bfdname 同时指明源文件,目的文件的格式5.-R sectionname 从输出文件中删除掉所有名为sectionname的段6.-S 不从源文件中复制重定位信息和符号信息到目标文件中7.-g 不从源文件中复制调试符号到目标文件中arm-linux-objdump查看目标文件(.o文件)和库文件(.a文件)信息arm-linux-objdump -D -m arm beep.elf > beep.dis-D 显示文件中所有汇编信息-m machine指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。

arm-linux-gcc软件安装

1.解压文件解压tar zxvf arm-linux-gcc-4.4.3.tar.gz -C/(直接解压后就可以,-C/会让解压的文件自动放在根目录下指定路径,不用管)下载arm-linux-gcc-4.4.3.tgz到任意的目录下,进入这个文件夹sudo tar xvzf …arm-linux-gcc-4.4.3.tar.gz‟–C /注意:C后面有个空格(不需要),并且C是大写的(必须),它是英文单词“Change”的第一个字母,在此是改变目录的意思。

执行该命令,将把arm-linux-gcc 安装到/opt/Friendlyarm/toolschain/4.4.3 目录。

2.建立目录sudo mkdir /usr/local/arm3.复制文件sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm5.添加环境变量网上很多修改环境变量的方法,很杂。

有redhat上面的,fedora。

下面一共三种方法,有人都在UBUNTU11.10上试过,可行。

(本人只用了第一种方法做过,其他的没有试过)方法一:修改/etc/bash.bashrc文件(此文件只对当前用户适用)sudo gedit /etc/bash.bashrc在最后加上export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin (路径)(注意等号那边不要有空格)方法二:修改/etc/profile文件(此文件属于系统级别的环境变量,设置在里面的东西对所有用户适用)sudo gedit /etc/profile增加路径设置,在末尾添加如下:export PATH=$PATH:/usr/local/arm/4.4.3/bin方法三:修改/etc/environment文件sudo gedit /etc/environment原文件应为PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games“将其改为PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.4.3/bin"关于环境变量问题:环境变量是什么?例如path,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path 中指定的路径去找。

arm-linux-gcc交叉工具链的安装和使用

arm-linux-gcc交叉工具链的安装和使用分类:linux内核工具使用2013-01-18 01:01 2295人阅读评论(0) 收藏举报1、安装arm-linux-gcc交叉工具链[root@localhost Denny]# lsarm-linux-gcc-4.3.2.tgz Desktop gcc kernel modules shell实验 smb.conf tftp安装包 wireshark软件包at_remind.c file gdb makefiles samba安装包 smb test wireless[root@localhost Denny]# tar zxvf arm-linux-gcc-4.3.2.tgz-C / // -C 参数指的是解压到根目录下面[root@localhost /]# cd /usr/local/[root@localhost local]# lsarm bin etc games include lib libexec sbin share src[root@localhost local]# cd arm/4.3.2/arm-none-linux-gnueabi/bin/ lib/ libexec/ share/[root@localhost local]# cd arm/4.3.2/bin/ // 安装在 /usr/local/arm/4.3.2/bin/ 的“bin”目录下面[root@localhost bin]#[root@localhost bin]# /usr/local/arm/4.3.2/bin/arm-linux-gcc // arm-linux-gcc 使用方法1:跟上“全路径”[[root@localhost bin]# echo $PATH/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bi n:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin[root@localhost bin]# export $PATHbash: export:`/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/b in:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin': not a valid identifier[root@localhost bin]# vi /etc/proprofile profile.d/ protocols[root@localhost bin]# vi /etc/profile // arm-linux-gcc 使用方法2:添加路径到环境变量中去,在系统的时候就可以“任何地方”使用 arm-linux-gcc[root@localhost bin]## Path manipulationif [ "$EUID" = "0" ]; thenpathmunge /sbinpathmunge /usr/sbinpathmunge /usr/local/sbinpathmunge /usr/local/arm/4.3.2/bin //环境变量添加的位置fi[root@localhost file]# cat hello.c#include <stdio.h>int main(){char *p="hello world!!";printf("%s:",*p); // 错误:字符串的输出 printf("%s:",p); 不用加*p(字符串指针),和其他指针不同return 0;}[root@localhost file]# vi hello.c[root@localhost file]# gcc hello.c -o hello // x86编译方式[root@localhost file]# ./hello // 在x86上能够运行hello world!!:[root@localhost file]# arm-linux-gcarm-linux-gcc arm-linux-gcc-4.3.2 arm-linux-gcov[root@localhost file]# arm-linux-gcc hello.c -o hello1 // ARM编译方式[root@localhost file]# lsfork hello hello1 hello.c lib_file sys_file time_file[root@localhost file]# ./hello1 // 在x86上不能够运行bash: ./hello1: cannot execute binary file[root@localhost file]#2、arm-linux-gcc交叉编译工具的使用今晚用了:arm-linux-objdump -S -D hello 反汇编指令时,遇到以下提示的错误:arm-linux-objdump: Can't disassemble for architecture UNKNOWN!现在还不知道是什么错误引起的,等着明天再解决了!!!!!!!原因是:由于上面用了“gcc hello.c -o hello x86编译方式” 和“arm-linux-gcc hello.c -o hello1 ARM编译方式”产生了hello 和hello1 对应不同平台的文件,当然用“arm-linux-objdump -S -D hello”用arm反汇编指令对x86平台产生的bin文件进行反汇编,肯定出现错误(1)、反汇编arm-linux-objdump 使用[root@localhost file]arm-linux-objdump -S -D helloarm-linux-objdump: Can't disassemble for architecture UNKNOWN![root@localhost file]# lsfork hello hello1 hello.c lib_file sys_file time_file // hello 是x86编译出来的,hello1是arm编译出来的[root@localhost file]# arm-linux-gcc -g hello.c -o hello1 // -g编译产生带有调试的信息的文件(反汇编后:c语言才能和汇编语言对应上)[root@localhost file]# arm-linux-objdump -D -S hello1 >log[root@localhost file]# lsfork hello hello1 hello.c lib_file log sys_file time_file[root@localhost file]# vi log // 查看对应的文件如下00008380 <main>:#include <stdio.h>int main(){8380: e92d4800 push {fp, lr}8384: e28db004 add fp, sp, #4 ; 0x48388: e24dd008 sub sp, sp, #8 ; 0x8char *p="hello world!!";838c: e59f3020 ldr r3, [pc, #32] ; 83b4 <main+0x34>8390: e50b3008 str r3, [fp, #-8]printf("%s:",p);8394: e59f001c ldr r0, [pc, #28] ; 83b8 <main+0x38>8398: e51b1008 ldr r1, [fp, #-8]839c: ebffffc7 bl 82c0 <_init+0x48>return 0;83a0: e3a03000 mov r3, #0 ; 0x0}(2)arm-linux-readelf 文件查看工具[root@localhost file]# arm-linux-readelf -a hello1 >logELF Header: //主要查看这个头文件Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2's complement, little endian //采用的是小端模式(程序运行不起来,硬件平台是打断格式,交叉工具链是小端格式)Version: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: ARM //程序运行在ARM平台上Version: 0x1Entry point address: 0x82ccStart of program headers: 52 (bytes into file)Start of section headers: 2488 (bytes into file)Flags: 0x5000002, has entry point, Version5 EABISize of this header: 52 (bytes)Size of program headers: 32 (bytes)Number of program headers: 8Size of section headers: 40 (bytes)Number of section headers: 37Section header string table index: 34[root@localhost file]# arm-linux-readelf -d hello1 // -d 指的是查看程序所用的共享链接库Dynamic section at offset 0x470 contains 24 entries:Tag Type Name/Value0x00000001 (NEEDED) Shared library: [libc.so.6] // 程序所用到的共享链接库(程序运行不起来,可能找不到共享链接库,把所需要的库考到路径下)0x0000000c (INIT) 0x82780x0000000d (FINI) 0x84340x00000019 (INIT_ARRAY) 0x104640x0000001b (INIT_ARRAYSZ) 4 (bytes)0x0000001a (FINI_ARRAY) 0x104680x0000001c (FINI_ARRAYSZ) 4 (bytes)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档