用crosstool-ng建立Linux 交叉编译环境
来源:互联网 发布:魔兽世界网络断开连接 编辑:程序博客网 时间:2024/05/16 14:54
转载自: http://hi.baidu.com/shishlv/blog/item/8699d426e3aedd1a8a82a1f5.html
用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
最近准备针对支持ARMv4指令的可执行文件进行反汇编,但是当我安装arm-linux-gcc并用其进行编译一个简单的c程序时,却只能得到支持 ARMv1指令的可执行文件,我需要的是ARMv4。查了很多资料,知道crosstool-ng这个工具了,于是上网收集了不少相关资料,但是很多不是 很满意的,最后很感谢同事--小高,是他帮我找到了一篇比较满意的文章,很感谢他。我现在正在进行很复习的crosstool-ng安装过程,不知道对我 的工作有没有帮助。但闲话不多说,现在就开始见证我的制作过程。
首先可以去crosstool-ng的主页了解一下这个工具,从那里我们可以知道他是根据crosstool写的。
本文档的重点参考资料:用crosstool-ng建立arm-linux交叉工具链
crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/
值得注意的是,下载里最新的crosstool-ng以后,记得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/看看有没有相应的补丁,有得话一起下载下来。
我使用的是crosstool-ng-1.6.2。
使用crosstool-ng必须安装一些开发用的软件,在ubuntu下必须安装(使用sudo apt-get ):
libncurses5-dev
bison
flex
texinfo
automake
libtool
patch
gcj
cvs
cvsd
gawk 根据用crosstool-ng建立arm-linux交叉工具链的介绍,最好手动安装一下termcap。
这个问题只在ubuntu 9.0.4中遇到...缺少了termcap 库,下载安装(termcap这东西的确很古老)
cd /tmp
wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
tar zxvf termcap-1.3.1.tar.gz
cd termcap-1.3.1
./configure --prefix=/usr
make
make install
crosstool-ng和crosstool不同的地方之一就是:她并不是一下载下来就可以使用了,必须先配置安装。
三、配置本次编译的交叉编译工具链
接下来就是配置你要编译的交叉编译工具链了,在crosstool-ng已很多已经做好的默认配置(位于crosstool-ng- X.Y.Z/samples目录下),你只要针对其进行修改就好了。对于编译器组件部分的版本最好不要修改,因为那个配搭应该是经过测试后的最高本版了, 但内核版本可以修改。
cd ${CROSSTOOLNG}/crosstool-ng-1.6.1_build/
#进入编译新交叉编译器的工作目录
cp ../crosstool-ng-1.6.1/samples/arm-unknown-linux-gnueabi /* ./
#拷贝默认配置文件到工作目录
mv crosstool.config .config
#修改文件名
../crosstool-ng-1.6.1_install/bin/ct-ng menuconfig
进入menuconfig,开始修改配置。
下面我只说说针对armv4t需要修改的地方,别的构架等有了板子测试再说:
1、已下载好的源码包路径和交叉编译器的安装路径。
Paths and misc options --->
(${HOME}/development/crosstool-ng/src) Local tarballs directory 保存源码包路径
(${HOME}/development/x-tools/${CT_TARGET}) Prefix directory 交叉编译器的安装路径
这两个请依据你的实际情况来修改。
2、修改交叉编译器针对的构架
Target options --->
*** Target optimisations ***
(armv4t) Architecture level
(arm9tdmi) Emit assembly for CPU
(arm920t) Tune for CPU
以上这几个参数是如何得出的可以参考gcc的man手册,你可以在你下载的gcc-4.3.2.tar.bz2解压后找到,她的位置是gcc-4.3.2/gcc/doc/gcc.1。打开方式:
man ./gcc.1
你可以在其中找到:
......
ARM Options
......
-mcpu=name (Emit assembly for CPU)
This specifies the name of the target ARM processor. GCC uses this
name to determine what kind of instructions it can emit when gener‐
ating assembly code. Permissible names are: arm2, arm250, arm3,
arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm,
arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c, arm7100,
arm7500, arm7500fe, arm7tdmi, arm7tdmi-s, arm8, strongarm, stron‐
garm110, strongarm1100, arm8, arm810, arm9, arm9e, arm920, arm920t,
arm922t, arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t,
arm9tdmi, arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e,
arm1022e, arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp,
arm1156t2-s, arm1176jz-s, arm1176jzf-s, cortex-a8, cortex-r4, cor‐
tex-m3, xscale, iwmmxt, ep9312.
-mtune=name (Tune for CPU)
This option is very similar to the -mcpu= option, except that
instead of specifying the actual target processor type, and hence
restricting which instructions can be used, it specifies that GCC
should tune the performance of the code as if the target were of
the type specified in this option, but still choosing the instruc‐
tions that it will generate based on the cpu specified by a -mcpu=
option. For some ARM implementations better performance can be
obtained by using this option.
-march=name (Architecture level)
This specifies the name of the target ARM architecture. GCC uses
this name to determine what kind of instructions it can emit when
generating assembly code. This option can be used in conjunction
with or instead of the -mcpu= option. Permissible names are:
armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t,
armv5te, armv6, armv6j, armv6t2, armv6z, armv6zk, armv7, armv7-a,
armv7-r, armv7-m, iwmmxt, ep9312.
......
3、关闭JAVA编译器,避免错误。
我这里用ubuntu 9.10编译JAVA编译器的时候会出错,也许是host的gcj的问题,反正我不用JAVA,所以就直接关闭了。如果有兄弟知道如何修正记得通知一声!!
C compiler --->
*** Additional supported languages: ***
[N] Java
error log:
[INFO ] =================================================================
[INFO ] Installing final compiler
[EXTRA] Configuring final compiler
[EXTRA] Building final compiler
[ERROR] jar: internal error:
[ERROR] make[4]: *** [libgcj-4.3.2.jar] Error 1
[ERROR] make[3]: *** [all-recursive] Error 1
[ERROR] make[2]: *** [all-target-libjava] Error 2
[ERROR] make[1]: *** [all] Error 2
[ERROR] Build failed in step 'Installing final compiler'
[ERROR] Error happened in '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/build/cc/gcc.sh' at line # 350 in function 'do_cc'
[ERROR] called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/crosstool-NG.sh' at line # 562 in function 'main'
[ERROR] Look at '/home/tekkaman/development/x-tools/arm-tekkaman-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 67:10.67)
[67:11] / make: *** [build] 错误 2
4、根据参考资料,禁止内核头文件检测(只起到节约时间的作用(不到1S的时间),不推荐禁用)
Operating System --->
5、增加编译时的并行进程数,以增加运行效率,加快编译。
Paths and misc options --->
*** Build behavior ***
(4) Number of parallel jobs
这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.
6、一些个性化的修改(可以不修改)
Toolchain options --->
*** Tuple completion and aliasing ***
(tekkaman) Tuple's vendor string
这样产生的编译器前缀就是:arm-tekkaman-linux-gnueabi-
C compiler --->
(crosstool-NG-${CT_VERSION}-tekkaman) gcc ID string
配置好以后保存。
最后,内核源码的版本号修改,请直接修改crosstool-ng-1.6.1_build目录下的.config文件,不止一处,有关的都要修改。
有:
CT_KERNEL_VERSION=
CT_KERNEL_V_2_6_??_?=y
CT_LIBC_GLIBC_MIN_KERNEL= 如果再次../crosstool-ng-1.6.1_install/bin/ct-ng menuconfig,这个修改又会复原,必须再次手工修改。
你也可以选择修改crosstool-ng-X.Y.Z_build/config/kernel/linux.in等文件,只是比较麻烦,但这可以彻底解决,实现在界面中增加内核版本。
四、为加快速度,根据配置自行下载相应的软件包。(选做)
虽然crosstool-ng发现找不到软件包的时候会自动下载,但是比较慢。根据这次的配置情况(查看“.config”文件),我预先下载了以下的软件包:
binutils-2.19.1.tar.bz2
glibc-2.9.tar.gz
dmalloc-5.5.2.tgz
glibc-ports-2.9.tar.bz2
mpfr-2.4.2.tar.bz2
duma_2_5_15.tar.gz
gmp-4.3.1.tar.bz2
ncurses-5.7.tar.gz
ecj-latest.jar
libelf-0.8.12.tar.gz
sstrip.c
gcc-4.3.2.tar.bz2
linux-2.6.33.1.tar.bz2
strace-4.5.19.tar.bz2
gdb-6.8.tar.bz2
ltrace_0.5.3.orig.tar.gz
下载完之后,记得将这些软件包放在配置时指定的文件夹。
五、开始编译。
../crosstool-ng-1.6.1_install/bin/ct-ng bluid
我的笔记本用了大概40多分钟编译完成。
六、编译好后的交叉编译器。
编译器位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/bin
库文件位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/arm-tekkaman-linux-gnueabi/lib
上一篇:嵌入式Linux图形系统快速参考手册
下一篇:ubifs文件系统构建
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- 什么是shell
- linux socket的bug??
- linux的线程是否受到了保护?...
- 修改默认端口为222,centos自...
- 用PHP做一个ftp登录页面...
- Toad for Oracle工具,为什么在...
- 本地win7安装vmw9系统winserv...
- powermt config是所什么用的...
- 用CROSSTOOL-NG建立交叉编译环境
- 用crosstool-ng建立Linux 交叉编译环境
- 用crosstool-ng建立Linux 交叉编译环境
- 用crosstool-ng建立Linux 交叉编译环境
- 用crosstool-ng建立Linux 交叉编译环境
- 用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
- 在fedora12下用crosstool-ng建立arm-linux交叉编译环境
- 用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
- 第一步在Fedora 8下用crosstool-ng建立arm-linux交叉编译环境(TQ2440 S3C2440)--->完结,测试通过
- 用crosstool-ng建立arm交叉编译工具链
- 用crosstool-ng建立arm交叉编译工具链
- 用crosstool-ng建立arm-linux交叉工具链
- 用crosstool-ng建立自己的ARM交叉编译工具链 (适用于S3C6410以及其它处理器)
- 用crosstool-ng建立自己的ARM交叉编译工具链 (适用于S3C6410以及其它处理器)
- 用crosstool-ng建立自己的ARM交叉编译工具链
- 建立arm-linux交叉工具链 crosstool-ng
- 建立arm-linux交叉工具链 crosstool-ng
- 建立arm-linux交叉工具链 crosstool-ng
- fedora 16配置nfs
- 泡妞项目进度表
- MatchBox——适合于小屏幕的GUI
- 嵌入式Linux图形系统快速参考手册
- 赵薇携手刘烨选“达人
- 用crosstool-ng建立Linux 交叉编译环境
- ubifs文件系统构建
- 第三方 cookie 写入问题
- LINUX下GDB调试(转)
- C++中的类所占内存空间总结
- JNI 中文字符串传递
- VIM 用空格替换 Tab
- 硬件工程师电路设计必须紧记的十大要点(转帖)
- C/C++不同文件夹下包含头文件的方法及#include的使用