使用Crosstool 0.43 在ubuntu0.94上制作arm交叉编译器arm-linux-gcc .

简介:

一。 保证ubuntu 上安装如下软件包

 

Bison
flex
build-essential
patch
libncurses5-dev

 

查看该软件包的依赖关系,可以看到以下内容:

$ apt-cache depends build-essential

 

安装软件包使用 $sudo apt-get install 软件包名

 

二。 Crosstool

Crosstool 是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http: //kegel.com/crosstool。用Crosstool构建交叉工具链要比分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源下所示。

表2.2  所需资源

安装包
 下载地址
 
crosstool-0.43.tar.gz
 http://kegel.com/crosstool
 
linux-2.6.15.4.tar.gz
 ftp.kernel.org
 
binutils-2.16.1.tar.bz2
 ftp.gnu.org
 
gcc-3.3.6.tar.gz
 ftp.gnu.org

 

gcc-4.1.tar.gz
 ftp.gnu.org 
 
glibc-2.3.2.tar.gz
 ftp.gnu.org 
 
glibc-linuxthreads-2.3.2.tar.gz
 ftp.gnu.org 
 
linux-libc-headers-2.6.12.0.tar.bz2
 ftp.gnu.org 
 

gdb6.5.tar.bz2

 

三。crosstoo 安装基本步骤

 

1.准备资源文件

首先从网上下载所需资源文件,然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/downloads目录下解压crosstool-0.43.tar.gz,命令如下:

# cd /home/zhoug/downloads(注$HOME = /home/zhoug)

# tar –xzvf crosstool-0.42.tar.gz

(

对于tar.bz2的文件,其解压命令

#tar -xjvf xxx.tar.bz2

)

2.建立脚本文件

# cd HOME/downloads/crosstool0.43

# cp demo-arm9tdmi.sh arm.sh

# sudo gedit arm.sh

 

#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture.  Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt

set -ex
TARBALLS_DIR=$HOME/downloads   #资源下载目录
RESULT_TOP=/opt/crosstool             #编译工具最终生成目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                 # 定义支持C, C++语言
export GCC_LANGUAGES

# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP

#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest --nounpack


echo Done

 

3..建立配置文件 

# gedit arm9tdmi .dat

----------------------------------------------------------------------------------------------------------

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux    # 编译生成的工具链名称
GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi"
TARGET_CFLAGS="-O"

 

----------------------------------------------------------------------------------------------------------

# gedit gcc-4.1.0-glibc-2.3.2-tls.dat

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"

----------------------------------------------------------------------------------------------------------

4.执行脚本

将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

# cd crosstool-0.43

# ./arm.sh 

 

5.设置环境变量

# sudo gedit /etc/bash.bashrc

export PATH=$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:

 

 

四。编译中出现的错误

 

1. 我机器上的gcc 版本是gcc 4.3.3 ,进行编译时出错。

   gcc 版本高或低,sudo apt-get remove gcc ,sudo apt-get install gcc-4.1 。由于ubuntu 可以安装多种版本的gcc.我只执行

   sudo apt-get install gcc-4.1。

   安装gcc-4.1后

   sudo rm /usr/bin/gcc            (删除GCC,它只是个到gcc-4.3.2的软连接文件)
   sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc        (建立GCC到gcc-4.1的软连接)

 

2. 错误如下:

make[2]: *** [/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 错误 1
bash: make[2]::找不到命令
make[2]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2/csu'
make[1]: *** [csu/subdir_lib] 错误 2
make[1]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc

 

解决方法:

修改如下文件:
gedit /crosstool0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h 
"Available extensions:/n"
"/n"
vim Demo-arm.sh
在工具链版本后加 --notest --nounpack

 

3.网上介绍的其他错误

1)《安装gcc后》安装了gcc-4.1之后,重新编译。心想这回好了吧?!不想,有出了以下错误: 
In file included from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
google后发现,原来是ubuntu将系统默认的shell设置成了dash (the Debian Almquist Shell),所以通过脚本生成的文件格式和bash的不一样,导致了编译错误。在使用了
ursa
的方法后问题解决。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh

 

2)今天在编译skyeye时又报错 
/usr/include/bits/fcntl2.h:51: 错误: 调用‘__open_missing_mode’,声明有错误属性:open with O_CREAT in second argument needs 3 arguments 
按理说在Fedora 10中都可以编译过的,在ubuntu下应该也没什么问题才对,可是偏偏出现这个问题。赶紧跟踪,首先对比两个版本的/usr/include/bits/fcntl2.h,发现没有区别,那么就是代码的问题了。改代码,报错是在612行 
if(!nf->writebuffer) 
free(nf->writebuffer); 
free(nf); 
提示是open有错,但是612行是free,注释掉前两行,居然误报成了free(nf),继续注释掉free(nf),终于,错误给出来了,是在519行的 if ((nf->fdump= open(dev->dump, FILE_FLAG)) 0) 
open在调用的时候只有两个参数,赶紧给加上个0777,代码成了 if ((nf->fdump= open(dev->dump, FILE_FLAG,0777)) 0) 
谢天谢地,终于编译通过了。

遇到arm-linux-ar堆栈溢出的问题

主要是4.3.2编译器的问题,改为4.1的编译器即可



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/archive/2012/04/02/2430084.html,如需转载请自行联系原作者

相关文章
|
8月前
|
Ubuntu 编译器 开发工具
在Ubuntu系统上搭建RISC-V交叉编译环境
以上步骤涵盖了在Ubuntu系统上搭建RISC-V交叉编译环境的主要过程。这一过程涉及了安装依赖、克隆源码、编译安装工具链以及设置环境变量等关键步骤。遵循这些步骤,可以在Ubuntu系统上搭建一个用于RISC-V开发的强大工具集。
885 22
|
Ubuntu Linux UED
Ubuntu和Debian系统与Hat Linux系列的使用比较
所以,如果你想搞一个家用服务器,或者是个人使用,喜欢新鲜事物,那Ubuntu可能是你的最好选择。如果你需要一个在商业环境中经受住考验的系统,那Fedora或CentOS可能更符合你的口味。不过记住,CentOS现在是CentOS Stream,中途换马了,所以如果你是稳定性的极端追求者,可能得考虑一下这一变化。而Debian,则适合那些对稳定性需求极高,不太追求软件版本新旧的用户。
426 26
|
11月前
|
Ubuntu 编译器 C语言
在Ubuntu22.04平台上交叉编译针对Rv1126架构的GCC13.2.0编译器的步骤。
遵循上述步骤,您应该能够在Ubuntu 22.04平台上成功交叉编译适用于RISC-V架构RV1126的GCC 13.2.0编译器,允许您为目标硬件构建应用程序和操作系统组件。
715 10
|
Ubuntu 搜索推荐 Linux
Ubuntu/Debian Hat系Linux的便捷操作指南
总的来说,虽然Ubuntu/Debian和Red Hat系列在操作方法上有所不同,但基本概念类似。掌握了包管理和服务管理,可以应对大多数常见的系统管理任务。同时,这两个系统都有丰富的在线资源可以查询,不管你在任务中遇到什么困难,搜索引擎都能帮你找到答案。这些基本技能能让你在Linux的世界里更加自如。
343 26
|
Ubuntu Linux Shell
Linux环境下VSCode快速安装终极指南:debian/ubuntu/linux平台通用
以上就是在Linux环境下安装VSCode的终极指南,抛开繁复的专业词汇,以平易近人的文字、形象生动的比喻让你轻松学会这一过程。别忘了,你的小伙伴VSCode已经在应用菜单里等你了!
3338 23
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
558 32
|
11月前
|
Ubuntu 编译器
在Ubuntu中设置QT Creator的交叉编译环境。
在进行交叉编译设置时,请确保遵循你的目标硬件平台和软件的具体指南。以上步骤给出的是一个概括的指南,具体步骤可能因你的特定需求而有所不同。务必参照相关硬件和软件的官方文档进行操作,以获得具体的、针对性的指导。
941 0
|
Ubuntu Linux 编译器
linux下交叉编译licensecc
通过本文的步骤,您可以在Linux环境下成功交叉编译LicenseCC。本文详细介绍了环境准备、工具链安装、源代码下载、CMake配置、编译和验证的全过程。希望这些内容对您的学习和工作有所帮助。
497 62
|
Ubuntu 安全 Linux
Linux错误排查:解决Ubuntu 20.4执行sudo apt-get update时出现的libnettle.so.6错误。
很有可能在你得到解决方案时,你也学到了不少Linux修复技巧。祝你处理计算机问题时顺利如麻!永远记得,各种问题总是像老鼠一样从意想不到的地方冒出来。但记住,不管它们跑到哪里,最终都逃不过你的捕鼠器。盖起你的计算机,拾起你的代码,大步向前!
483 28
|
Ubuntu Linux 编译器
在Ubuntu Linux系统下如何搭建并安装EDK2
以上就是在Ubuntu Linux系统下搭建并安装EDK2的过程。这个过程可能会有些复杂,但只要按照步骤一步步来,应该不会有太大问题。如果在过程中遇到任何问题,都可以在网上找到相应的解决方案。希望这个指南能对你有所帮助!
740 17