转自:https://blog.csdn.net/shengnan_wu/article/details/8149466
1.获取Buildroot路径:
1)所有的发行版可以在以下官网下载 :
http://buildroot.net/downloads/
2)最新版可以在以下链接下载 :
http://buildroot.net/downloads/snapshots/buildroot-snapshot.tar.bz2
3)先前老版本的可以在以下链接下载 :
http://buildroot.net/downloads/snapshots/
2.buildroot提供了一个很不错的类似配置Linux内核的配置工具,在启动配置工具之前,需要安装如下某些包:
1)libncurses5-dev包 : 用于使用menuconfig 配置界面.
2)libqt4-dev包 : 用于使用xconfig配置界面.
3)libglib2.0-dev,
libgtk2.0-dev,
libglade2-dev : 用于使用gconfig配置界面.
3.解压buildroot压缩包
# tar jxvf /mnt/buildroot-snapshot.tar.bz2 -C ./
4.启动配置工具的3个不同配置接口 :
1)make menuconfig
2)make xconfig
3)make gconfig
5.配置完成后,配置工具会产生一个 .config文件 包含了所有我们配置的信息.这个文件将被用于Makefile, 使用make进行编译:
1)make
这里不能使用make-jN,因为Buildroot不支持top-levelparallel make , 反之 , 使用BR2_JLEVEL选项来告诉Buildroot运行编译每一个package使用make -JN.
使用make命令之后会执行下面几个步骤:
①下载源文件(所要求的)
②配置,编译和安装cross-compiling toolchain(如果使用内部工具链),或者输出一个toolchain(如果一个外部工具链使用)
③构建/安装杯选择的目标包
④构建内核镜像(如果有选择)
⑤构建启动代码镜像(如果有选择)
⑥创建一个选择好格式的根文件系统
2)make source
当我们现在是离线的时候并且只是想使用之前配置下载了的sources,可以使用这个命令 , 这样就可以不用上网或者从我们的dl目录直接拷贝内容来构建.
6.使用out-of-tree构建
make menuconfig O=/tmp/build
或者
cd /tmp/build; makemenuconfig O=$PWD -C path/to/buildroot
当想把配置和编译输出文件都放在Buildroot树外面的话,可以在配置命令添加上如上选项O=...,-C...,这样输出的文件就会被被放置在/tmp/build目录下.
使用out-of-tree构建时, .config和临时文件也被存放在我们指定的输出目录.这就意味着我们能够安全地并行执行多个编译通过使用同一个相同的源码树,只要他们使用各自独立的输出目录.
在第一次make menuconfig使用了上面选项之后,第二次make就不需要加上上述选项了.
7.输出目录output/ ; 这个目录下还有几个子目录:
· images/ : 存放编译后产生的所有镜像文件( 内核镜像 , 加载引导镜像 和 根文件系统镜像)
· build/ : 存放所有的组件除了构建交叉编译工具链的组件 , 在这个目录里面每一个功能对应一个子目录存放他们各自的组件.
· staging/ : 包含一个类似于根文件系统等级层次的层级 . 这个目录包含了 安装的交叉编译工具链 和 所有被选择用于目标板的所有用户空间包.
· target/ : 包含了几乎所有的用于目标板的完整的根文件系统 除了 /dev/里面的驱动文件 , 所以这个目录是不能用于你的开发板的 . 取而代之,我们应该使用构建在 images/ 里的镜像. 假如你需要使用一个选出的根文件系统镜像通过NFS来引导,那么使用产生在images/里面的压缩镜像并引出它作为根引导.
· host/ : 包含了编译给主机的安装工具,比如cross-compilationtoolchain.
· toolchain/ : 包含了用于构建交叉编译工具链的各种组件的目录.
有了以上的一些了解之后 , 就可以开始使用Buildroot来制作交叉编译工具链了:
1.下载buildroot源码包,安装启动配置工具所需的包(不演示)
2.在/opt/创建工作目录,解压源码包到工作目录里,进入工作目录并创建一个build目录用于放置编译产生的文件,命令如下:
# make buildroot
# tar jxvf/mnt/buildroot-snapshot.tar.bz2 -C ./
# mkdir bulid
执行之后buildroot目录内容如下:
3.进入build目录,启动配置工具,执行命令如下:
# cd build/
# make menuconfigO=$PWD -C ../buildroot/
执行完上面命令后出现下面配置界面,这个跟配置linux内核很像:
根据之前对交叉编译工具链的介绍,我们大致可以知道,重点在以下几个选择:
1)Linux headers (Toolchain--> Kernel Headers选项)
2)binary utilities (Toolchain-->BinutilsVersion选项)
3)the C library (Toolchain-->uClibcC library Version选项)
4)the bootstrap compiler
5)the fullcompiler 4,5都需要用到GCC (Toolchain-->GCC compiler Version)
简单解释几个比较重要的选项:
Target Architecture ---> 用于选择目标的架构,我这里选择ARM (little endian)(s3c2440可以运行在小端模式和大端模式,默认是小端模式)
Target Architecture Variant ---> 内核类型, 这里我的是(arm920t)
Target ABI (EABI) ---> 目标使用的应用程序二进制接口,其中有两个选择
①EABI(Embedded ABI)
②OABI(Old ABI)
这里我选择默认的EABI.具体区别可以百度上查看.
Build options ---> 主要是一些编译时用到的选项,比如dl的路径,下载代码包使用的路径,同时运行多个编译的上限,是否使能编译器缓冲区等等,这里按照默认就行了.
Toolchain ---> 工具链选项
Toolchain type (Buildroottoolchain) ---> 工具链类型,这里我们没使用外部Buildroot,也不使用crosstool-ng的工具链,默认使用Buildroottoolchain就行 .
*** Kernel Header Options *** 选择使用的哪个版本的内核头文件
Kernel Headers (Linux 3.6.x kernel headers) ---> 我选择了里面的最新版
***uClibc Options ***
uClibc C library Version (uClibc 0.9.33.x) ---> 选择里面最新版
(toolchain/uClibc/uClibc-0.9.33.config)uClibc configuration file
[ ] Threadlibrary debugging
[ ] Compileand install uClibc tests
*** Binutils Options ***
Binutils Version (binutils 2.21.1) ---> 选择binutils版本
() Additional binutilsoptions
*** GCCOptions ***
GCC compiler Version (gcc 4.6.x) ---> 选择GCC版本
() Additional gcc options
[ ] Build/install Objective-C compiler and runtime?
[ ] Build/install Fortran compiler and runtime?
[*] Build/install a shared libgcc?
[ ] Enable compiler OpenMP support
*** Gdb Options ***
*** Gdbdebugger for the target needs WCHAR support in toolchain ***
[ ] Build gdb server for the Target
[ ] Build gdb for the Host
[ ] Purge unwanted locales
() Generate locale data
[*]Enable MMU support
[*] Usesoftware floating point by default
(-pipe)Target Optimizations
() Target linker options
*** Toolchain Options*** (以下是选择一些工具链的选项)
[] Enable large file (files > 2 GB) support
[] Enable IPv6 support
[] Enable RPC support
[] Enable WCHAR support
[] Enable toolchain locale/i18n support
[*] Enable C++ support (选择是否提供C++功能)
[] Enable stack protection support
Thread library implementation(linuxthreads (stable/old)) --->
[ ] Enable elf2flt support? (选择是否提供elf2flt选项功能)
Buildroot2012.11-git Configuration 下其它的配置就不属于配置工具链的范畴了,如下:
Systemconfiguration --->
PackageSelection for the target --->
Hostutilities --->
Filesystemimages --->
Bootloaders --->
4.配置保存好后, 通过ls -la命令可以看到.config文件已经生成了,Makefile也生成了,如下图:
5.执行最后一次编译
# make
可惜在编译过程中出现了一个错误如下错误信息:
从上面用红线圈起来的地方,我们可以了解到,ucbilc库是不支持大文件的,估计在按照linux头文件的那部分时,对应linux内核版本或者在gcc的被用到的库里支持了大文件的,也就是定义了_FILE_OFFSET_BITS ,这里我找了一段时间,找不到这个宏在哪个文件定义了,最后我是直接在上面提到的features.h头文件里把_FILE_OFFSET_BITS取消了宏定义.
修改如下:
之后重新make一下,通过了.
我们可以在host/usr/bin/里面看到很多我们需要的二进制文件,如下所示:
# cd host/usr/bin/
在使用命令ls -l来看一下:我们可以发现其实蓝色的命令只是链接文件连接到对应的绿色二进制文件,如下所示:
6.接下来把路径加到PATH环境变量里面,可以在/etc/profile文件里加入:
# vim/etc/profile
添加上:
exportPATH=$PATH:/opt/Buildroot/build/host/usr/bin
保存之后,执行以下命令使其生效:
# source/etc/profile
7.在Buildroot/buildroot/dl目录下我们可以看到,整个编译过程使用到被下载了的文件及版本如下:
mpc,mpfr和gmp,都是用于安装gcc时用到的库,其中mpfr和mpc都依赖于gmp.所以在安装gcc之前 , gmp , mpfr和mpc这3个库都会被先安装了.
GNU M4 :
m4 是 POSIX 标准中的一部分,所有版本的 UNIX下都可用。虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的“configure” 脚本依赖它。 宏处理器(或预处理器)一般用作文本替换工具。最终用户经常会用它来处理要反复使用的文本模板,典型的是用于编程工具,还会用于文本编辑和文字处理工具
GNU Autoconf:
Autoconf是一个用于生成可以自动地配置软件源代码包以适应多种Unix类系统的shell脚本的工具。由Autoconf生成的配置脚本在运行的时候与Autoconf是无关的, 就是说配置脚本的用户并不需要拥有Autoconf。
GNU Automake:
GNU Automake是一种编程工具,可以产生供make程式使用的Makefile,用来编译程式。它是自由软件基金会所所制作的GNU程式的其中一项,作为GNU建构系统的一部分。automake所产生的Makefile符合GNU编程标准。
automake是由Perl语言所写的,必须和GNUautoconf一并使用 .
GNU libtool :
GNU libtool是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中。
亲测此工具链可用