在Fedora 7 下建立 ARM-Linux 交叉编译环境 (转载)_hongjiujing的博客-程序员秘密

技术标签: 编译器  gcc  linux  工具  程序开发  嵌入式  

在Fedora 7 下建立 ARM-Linux 交叉编译环境
    这几天忙着在Fedora 7下建立ARM-Linux的交叉编译环境。一开始参考了《构建嵌入式Linux系统》,这是一本很经典的书。上面介绍了建立ARM-Linux的交叉编译环境的许多知识,建立的原则和方法。我一开始想按照上面的一般方法,建立一个自己的、最新的交叉编译环境。但是 ,试了才知道这个过程是一个繁琐、耗时的工作。对于没有编译原理知识的我来说,更是耗时又毫无意义。 引用《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》的原话:“在这项工作上浪费时间似乎没有任何意义,我也是这么认为的,”。由于在公司做事,时间不多,最后,我利用crosstool-0.43,自动完成了这项工作。 在是否有必要自己建立交叉编译环境的问题上,我建议:如果你是一个学生,建议你认真学习编译原理、Linux和GNU的编译器原理,再一步一步的自己建立交叉编译环境(学生比较有时间,少泡MM,少玩游戏,时间就挤出来了。好好学习,以后MM来泡你,别人玩你编的游戏。 )。如果你是程序员(不是交叉编译器的开发者),建议不要在这上面浪费时间了,赚钱要紧,把这个作为业余爱好吧!

    这次建立
交叉编译环境我主要参考的资料是:
1、 《构建嵌入式Linux系统》
2、 《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》
3、
ARM Linux 交叉编译 工具链 制作攻略
4、
AT91RM9200引导程序的建立--------建立交叉编译工具链


   Host CPU:i686
        RAM: 768MB
        OS: Fedora 7

   TARGET CPU :S3C2410A
          RAM :64MB
          OS : Linux-2.6.22.2/2.6.15.4

    现在进入正题,我在Fedora7下快速、成功地建立ARM-Linux的交叉编译环境,是看了《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》中关于crosstool的介绍。
    crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。写这篇文章时的最新版本是0.43。
    在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。
    你也可以到http://kegel.com/crosstool/#download看看是否有更新的版本。
     
    第一步:保证你装Fedora7时,安装了需要的软件开发工具。在 ARM Linux 交叉编译 工具链 制作攻略》中说:“0、制作之前确保你的机子上有如下几个工具:bison、flex、build-essential。   我的机子上有bison和flex,至于build-essential是包含一个在建立deb包过程中起关键作用的包的信息列表,Fedora下并不需要。
 
   第二步:下载crosstool,并解压到你的工作目录。
  

tar -xzvf crosstool-0.43.tar.gz

cd crosstool-0.43

 
   第三步:察看crosstool文件夹中,可以看到目录下有很多.sh脚本和.dat配置文件。找到你要交叉编译的CPU所对应的脚本,如我要交叉编译的CPU是S3C2410A,则选用demo-arm9tdmi.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/tekkaman/working/source
RESULT_TOP=/home/tekkaman/working/crosstool
//这两行是需要修改的参数,TARBALLS_DIR是下载的工具源码压缩包的存放目录。
//RESULT_TOP是要生成的工具链的存放目录,一定要改到有写权限的目录,不然无法编译。
//如用root登录进行编译,可以无需建立以上文件夹,运行时会自动建立。但不推荐!!!!(可能
//会出错,详情请见后记)
//以上是我的修改,他人可以根据实际情况修改。

export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="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 
//上面表示要选工具链的版本号!"#"起注释功能!可以选择一行!
//这行是默认的工具链的版本号(最新的),我就是用这一行,也可以选别的。
echo Done.
第三步(可选):根据你所选的工具链的版本号,打开相应的.dat文件,察看所需的源码包,并下载到 ${TARBALLS_DIR} 目录中
 
例如:我在demo-arm9tdmi.sh选的是eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest  ,那么我就打开arm9tdmi.dat 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"
到网上去下载红色标记的.bz2源码包注意其版本号,下载后存放到${TARBALLS_DIR}目录下。注意:不要解压!
 
以下是 ARM Linux 交叉编译 工具链 制作攻略》介绍的可下载源码包的中国镜像站点(我并没都试过):

http://mirrors.shlug.org/ 

http://www.cn.kernel.org/pub/linux

http://www.cn.kernel.org/pub/software

ftp://ftp.cn.kernel.org/pub/linux

ftp://ftp.cn.kernel.org/pub/software

这一步可以省略,因为如果运行demo-arm9tdmi.sh 时在${TARBALLS_DIR}目录下没有相应的源码包,会自动下载其.bz2源码包。但是建议事先用下载工具下好,这样更省时间。

根据《构建嵌入式Linux系统》中的介绍,如果为不同的内核编译交叉编译工具,交叉编译工具要根据其内核重新编译过。由于我想使用最新的2.6.22.2 内核,所以在编译完以上配置的工具链后,我将“LINUX_DIR=linux-2.6.15.4 ”改成“LINUX_DIR=linux-2.6.22.2 ”,并下载linux-2.6.22.2.tar.bz2${TARBALLS_DIR}目录下,重新编译了一次。

最后一步:进入crosstool-0.43目录,输入./demo-arm9tdmi.sh,然后就是泡茶、看书。经过不到3小时的编译(公司的烂电脑所用的时间,配置好的可以更快),就可以在${ RESULT_TOP}目录中看到想要的工具链、头文件、库文件等文件了!一般不会失败,我编了2.6.15.4内核和2.6.22.2内核都顺利结束,且下载到博创2410-S实验箱(2.4.18内核)里测试,证明编译出的Hello,world!程序(在${ RESULT_TOP}/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/tmp文件夹中)绝对可用(除了需要库文件的程序,因为2410-S系统中没有相应的库文件无法执行。静态编译的都可用!)!


后记:

1、有位网友按以上的方法做,碰到了如下错误提示:

 abort 'Don'/''t run all.sh or crosstool.sh as root, it'/''s dangerous'
 echo 'Don'/''t' run all.sh or crosstool.sh as root, 'it'/''s' dangerous
Don't run all.sh or crosstool.sh as root, it's dangerous
 exec false

原因是他用root登录编译,后来他以普通用户登录,就成功了!

所以我在这里再次建议:在嵌入式开发时,最好以普通用户登录,这样Host系统会比较安全。

《构建嵌入式Linux系统》里也是这样建议的!!!

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongjiujing/article/details/1790835

智能推荐

Android 关于用adb设置sdcard文件夹目录权限的问题_awen_PC的博客-程序员秘密

首先需要说明下,这里说的sdcard的权限并不是指在Android application程序中设置sdcard的权限读取问题。而是指在DDMS看到的目录下的那个sdcard目录的权限问题。 有时候,当你想在sdcard目录下面导入某个文件时,突然发现sdcard目录没有权限,它的权限状态为(d-------即000)。这时候我们需要做的事:1.如果你没有配置好adb运行环境...

在android平台上编译libpcap-0.9.8 和 jnetpcap-1.3.0-1_aswang的博客-程序员秘密

昨天尝试编译libpcap0.9.8和jnetpcap1.2成功了,今天想着能不能编译libpcap0.9.8和jnetpcap-1.3.0-1。因为jnetpcap-1.3.0-1也支持libpcap的0.9.8版本。 libpcap0.9.8的源码下载参见前一篇文章:http://aswang.iteye.com/blog/1036305 jnetpcap-1.3.0-...

Java版五子棋程序_java五子棋登录_普通网友的博客-程序员秘密

一、实验题目       五子棋游戏。二、问题分析       五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策略型。棋盘通常15*15,即15行,15列,共225个交叉点,即棋子落点;棋子由黑白两色组成,黑棋123颗,白棋122颗。游戏规则为黑先白后,谁先五子连成一条直线谁赢,其中直线可以是横的、纵的、45度、135度。      本次Java编程我的目的是现实人机对战,即游

WEB前端学习日志第三周 Day1_DBXupup的博客-程序员秘密

WEB前端学习日志第三周 Day1今日总结:通过今天的学习,共学习了5个知识点,分别是固定定位,用定位实现子元素在父元素中的剧中问题,粘性定位,锚点以及PC端网页的宽高自适应。并且解决了遗留下来的两个问题,分别是当banner图超出版心时的解决方法和轮播图的结构。固定定位固定定位很常见,几乎每个网页中都会涉及到,比如固定在网页右下角的回到顶部按钮。position:fixed; 固定定位...

linux SPI测试spidev_test_Jarvis000的博客-程序员秘密

【代码】linux SPI测试spidev_test。

JAVA Runtime.addShutdownHook()方法{拿到线程句柄,在程序关闭之前调用释放资源}_奔跑-起点的博客-程序员秘密

Runtime#addShutDownHook方法是给虚拟机增加一个虚拟机关闭时的调用钩子,在虚拟机关闭的时候调用这些钩子线程。还是非常有用的一个方法,最直接的用法就是监控了,因为其是在虚拟机临关闭时被调用,所以天生可以记录虚拟机关闭这件事情,及其相关的信息;再就是清理资源什么的,也可以做一个钩子线程,这样就不用再应用中为这些清理资源的操作找合适的位置了;下面先翻译一下这个方法的Java do

随便推点

Java-day-03_我是小菜皮的博客-程序员秘密

今天学习了用Java写递归问题,以下就是用Java对fibo函数的应用:public class fibo {public int fibo(int n) {if(n1||n2)return 1;elsereturn fibo(n-1)+fibo(n-2);}public static void main(String []args){fibo x=new fibo();int a =x.fibo(7);System.out.println(a);}}编译运行结果如下:C:\U

vue2.0 router遇到的问题_vue 2.0 router 模块没有_可乐少点冰的博客-程序员秘密

昨天按照教程安装好vue-router模块后,在应用中引入router 发现没有router.map方法,百度后原来是vue2.0里的路由改了// 1. 定义(路由)组件。// 可以从其他文件 import 进来const Foo = { template: 'foo' }const Bar = { template: 'bar' }// 2. 定义路由// 每个路由应该映射一个组件。

pycharm 安装使用paho-mqtt_pycharm使用mqtt库_倾听雪的声音的博客-程序员秘密

在pycharm中的file->setting->plugins中搜索paho-mqtt显示找不到网上只有python pip安装paho-mqtt的方法,如何在pycharm中使用呢?1、查看pycharm中使用的python的路径可见我用的是vs中安装的python3.62、在cmd中cd进入\Python36_64\Scripts文件夹,目的是使用pip。(运气好的话,直接执行pip install paho-mqtt就成功了)3、cmd中执行pip show pip查看自己的

mysql数据库查询笔记_Mysql数据库笔记_雀投江的博客-程序员秘密

第一节:Mysql注意事项:1.程序代码默认大写,程序员代码为小写。2.每个语句都以;或者\g结束。3.任何数据都有自己的数据类型。库级操作语句:1.show databases;查找数据库里面的所有的库,所以加s。2.MySQL -uusername -ppassword 进入MySQL, exit 退出MySQL。3.show create database 数据库名字; 显示创建数据库的信息...

JQuery——Html代码获取修改等操作_老陈聊架构的博客-程序员秘密

JQuery中HTML代码操作1. 获取或者修改标签中的HTML代码2. html()和text()的区别<script type="text/javascript"> $(function(){ var html_txt=$("div.left").html(); alert(html_txt); $("input[type=button]").clic...

ETCD源码分析——主要模块_etcd中有多少类型/模块,怎么查看_肥叔菌的博客-程序员秘密

etcd 核心模块下图中展示了 etcd 如何处理一个客户端请求涉及到的模块和流程。图中淡紫色的矩阵表示 etcd ,它包括如下几个模块:etcd server:对外接受客户端的请求,请求 etcd 代码中的 etcd server 目录,其中还有一个 raft.go 的模块与 etcd raft 库进行通信。etcd server 中与存储相关的模块是 applierV3,这里封装了 V3 版本的数据存储, WAL(write ahead log),用于写数据日志,etcd 启动时会根据这部分内容进行

推荐文章

热门文章

相关标签