交叉编译是指在一台电脑上来编译另一种结构的电脑上的代码,编译生成的程序不是运行在本机上的,而是另一种结构的机子上(^_^,快晕了...),打个比方吧,比如我的系统是x86结构的,如果我需要编译一个arm结构的程序,那编译器等就都要重新弄过了,这个编译过程就叫做
交叉编译,在嵌入式开发中就必须要交叉编译,在开发主机x386上开发arm目标机上可以运行的代码
在<<嵌入式linux系统开发技术详解-基于arm>>这本书中,有一章是将怎样制作自己的交叉编译环境的,不过用的是gcc2.95,很早以前的东西了,而且不能编译linux.2.6的内核,为了锻炼自己,我就打算自己编译下,在网上一搜索,都是差不多的文章,比如 一步步制作自己的交叉编译环境,等,但版本都比较低,我想用最新的版本来编译,经过几天的google,发现个crosstool比较好用,只要稍微改动下就能自动编译,目前最新版本为0.43,最高支持gcc-4.1.1-glibc-2.3.6,下载地址为: http://kegel.com/crosstool/crosstool-0.43.tar.gz
还有个LFS工程,这个工程是教会大家怎样从代码制作自己的小linux系统的,主页为http://www.linuxfromscratch.org/ ,这个工程包含很多小工程,其中的CFLS是专门为跨平台用的(Cross Linux From Scratch) ,clfs sysroot 是用来测试新的编译方法的,SVN版本已经包含了对最新软件包的支持
BOOK下载地址为: http://cross-lfs.org/files/BOOK/
编译的时候用到的补丁包 :
http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-sysroot/patches/
编译用的软件包: http://cross-lfs.org/files/packages/sysroot-0.0.1/
由于编译过程复杂,又可能碰到一些莫名其妙的错误,所以最好还是用别人已经弄好的
http://opensrc.sec.samsung.com/download/arm-elf-tools-20040427.sh (arm-elf-toolchain)
http://www.handhelds.org/download/projects/toolchain/(arm-linux-toolchain)
强烈建议编译的过程中边编译边看clfs-sysroot文档中的cross-compier tool,也就是第5章,因为我是新手,不能保证编译的过程中会没有错误,或者编译后无法使用等等,所以.......
0:准备好所要用到的资料和其他准备工作
1). 首页要准备好编译用的软件包:
binutils-2.17.tar.bz2 http://ftp.gnu.org/gnu/binutils/binutils-2.17.tar.bz2
gcc-4.1.1-tar.bz2 http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2
glibc-2.5.tar.bz2 http://ftp.gnu.org/gnu/glibc/glibc-2.5.tar.bz2
glibc-ports-2.5.tar.bz2 http://ftp.gnu.org/gnu/glibc/glibc-ports-2.5.tar.bz2
gdb-6.6.tar.bz2 http://ftp.gnu.org/gnu/gdb/gdb-6.6.tar.bz2
linux-header-2.6.20-rc4 http://www.kernel.org/pub/linux/kernel/v2.6/(补丁自己打)
2). 编译过程中用到的补丁:
在 http://cross-lfs.org/files/packages/sysroot-0.0.1/里面找到gcc-4.1.1,binutils-2.17,glibc-2.5的 补丁全部下回来放到patches文件夹里面
3).编译过程的指导文件:
http://cross-lfs.org/files/BOOK/ 找到CLFS-SYSROOT-SVN....样式的包,解压后查看arm目录
4).整个编译过程的工作目录:
mkdir crosstool
cd crosstool
mkdir linux-2.6.x
mkdir patches
mkdir src
linux-2.6.x存放要用到的内核头文件,patches存放需要的补丁,src存放要用到的软件包
PS:编译完成后的文件将安装到 ~/arm-linux上
5).设置一些环境变量
export CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo ${MACHTYPE} | cut -d- -f2)/cross/")"
#export CLFS_TARGET="arm-unknown-linux-gnu"
export CLFS_TARGET="arm-linux"
export CLFS=~/arm-linux
export PATH=$CLFS/bin:$CLFS/cross-tools/bin:$PATH
unset CFLAGS
unset CXXFLAGS
新建头文件存放地址
install -dv $CLFS/include
install -dv $CLFS/usr
install -dv $CLFS/usr/include
6). 安装一些可能需要的软件包:
sudo apt-get install bison flex texinfo
1. 安装内核头文件:
新建保存头文件的目录,并生成linux/version.h文件指示内核版本,如果缺少这个文件后面编译会出错
install
-
dv ${CLFS}
/
usr
/
include
cd linux-2.6.x
make include/linux/version.h
复制必要的头文件和与体系结构(arm)相关的头文件
install
-
dv ${CLFS}
/
usr
/
include
cp
-
av include
/
{asm
-
generic,linux,mtd,scsi,sound} ${CLFS}
/
usr
/
includecp -av
include/asm-arm ${CLFS}/usr/include/asm
2. 编译binutils-2.17:
解压binutils后,进入代码目录,打上必要的补丁:
cd src
tar jxvf binutils
-
2.17
.tar.bz2
cd binutils
-
2.17
![](http://img.e-com-net.com/image/info5/48e3d422a0404483a9deefb3128506c9.gif)
patch
-
Np1
-
i ..
/
..
/
patches
/
binutils
-
2.17
-
posix
-
1
.patch
patch
-
Np1
-
i ..
/
..
/
patches
/
binutils
-
2.17
-
branch_update
-
1
.patch
创建编译目录:
mkdir
-
v ..
/
binutils
-
build
cd ..
/
binutils
-
build
配置configure:
..
/
binutils
-
2.17
/
configure
--
prefix
=
$
...
{CLFS}
/
cross
-
tools
--
host
=
$
...
{CLFS_HOST}
--
target
=
$
...
{CLFS_TARGET}
--
with
-
sysroot
=
$
...
{CLFS}
--
disable
-
nls
--
enable
-
shared
--
disable
-
multilib
编译binutils:
make configure
-
host
make
安装binutils到
$
...
{CLFS}
/
cross
-
tools:
打开~/arm-linux/cross-tools/bin,就会发现生成了好多arm-linux-开头的文件
以后会用到这个头文件,所以安装到include:
cp
-
v ..
/
binutils
-
2.17
/
include
/
libiberty.h $
...
{CLFS}
/
usr
/
include
3. 安装 glibc的头文件到内核头文件中:
编译glibc的时候需要glibc的头文件,所以要复制到内核头文件夹中
tar jxvf ../glibc-2.5.tar.bz2
cd ../glibc-2.5
去处glibc的gcc 3.4.x依赖
cp configure{,.orig}
sed -e 's/3.4/3.[0-9]/g' configure.orig > configure
安装glibc的arm支持:
tar
-
jxvf ..
/
glibc
-
ports
-
2.5
.tar.bz2
mv
-
v glibc
-
ports
-
2.5
ports
新建编译目录:
mkdir
-
v ..
/
glibc
-
build
cd ..
/
glibc
-
build
添加NPTL线程库支持:
echo
"
libc_cv_forced_unwind=yes
"
>
config.cache
echo
"
libc_cv_c_cleanup=yes
"
>>
config.cache
echo
"
libc_cv_arm_tls=yes
"
>>
config.cache
指定安装路径:
cho
"
install_root=${CLFS}
"
>
configparms
配置configure :
CC
=
gcc ..
/
glibc
-
2.5
/
configure
--
prefix
=/
usr
--
host
=
${CLFS_TARGET}
--
build
=
${CLFS_HOST}
--
with
-
headers
=
${CLFS}
/
usr
/
include
--
cache
-
file
=
config.cache
安装glibc头文件:
make install
-
headers
cp
-
v bits
/
stdio_lim.h ${CLFS}
/
usr
/
include
/
bits
touch ${CLFS}
/
usr
/
include
/
gnu
/
stubs.h
cp
-
v ..
/
glibc
-
2.5
/
ports
/
sysdeps
/
unix
/
sysv
/
linux
/
arm
/
nptl
/
bits
/
pthreadtypes.h
${CLFS}
/
usr
/
include
/
bits
4. 编译静态的gcc(不带glibc),用来编译glibc
tar jxvf ..
/
gcc
-
4.1
.
1
.tar.bz2
cd ..
/
gcc
-
4.1
.
1
打上补丁:
patch
-
Np1
-
i ..
/
gcc
-
4.1
.
1
-
posix
-
1
.patch
patch
-
Np1
-
i ..
/
gcc
-
4.1
.
1
-
cross_search_paths
-
1
.patch
新建编译目录:
mkdir
-
v ..
/
gcc
-
build
cd ..
/
gcc
-
build
配置configure:
..
/
gcc
-
4.1
.
1
/
configure
--
prefix
=
$
...
{CLFS}
/
cross
-
tools
--
host
=
$
...
{CLFS_HOST}
--
target
=
$
...
{CLFS_TARGET}
--
disable
-
multilib
--
with
-
sysroot
=
$
...
{CLFS}
--
disable
-
nls
--
disable
-
shared
--
enable
-
languages
=
c
编译安装gcc-static:
make all
-
gcc
make install
-
gcc
5. 编译安装glibc:
解压补丁并打上补丁:
tar jxvf ..
/
glibc
-
2.5
.tar.bz2
cd ..
/
glibc
-
2.5
tar
-
jxvf ..
/
glibc
-
ports
-
2.5
.tar.bz2
mv
-
v glibc
-
ports
-
2.5
ports
patch
-
Np1
-
i ..
/
glibc
-
2.5
-
libgcc_eh
-
2
.patch
patch
-
Np1
-
i ..
/
glibc
-
2.5
-
localedef_segfault
-
1
.patch
patch
-
Np1
-
i ..
/
glibc
-
2.5
-
cross_hacks
-
2
.patch
patch
-
Np1
-
i ..
/
glibc
-
2.5
-
branch_update
-
1
.patch
编译并安装:
echo
"
libc_cv_forced_unwind=yes
"
>
config.cache
echo
"
libc_cv_c_cleanup=yes
"
>>
config.cache
echo
"
install_root=${CLFS}
"
>
configparms
BUILD_CC
=
"
gcc
"
CC
=
"
${CLFS_TARGET}-gcc
"
AR
=
"
${CLFS_TARGET}-ar
"
RANLIB
=
"
${CLFS_TARGET}-ranlib
"
..
/
glibc
-
2.5
/
configure
--
prefix
=/
usr
--
libexecdir
=/
usr
/
lib
/
glibc
--
host
=
${CLFS_TARGET}
--
build
=
${CLFS_HOST}
--
disable
-
profile
--
enable
-
add
-
ons
--
with
-
tls
--
enable
-
kernel
=
2.6
.
0
--
with
-
__thread
--
with
-
binutils
=
${CLFS}
/
cross
-
tools
/
bin
--
with
-
headers
=
${CLFS}
/
usr
/
include
--
cache
-
file
=
config.cache
make
make install
本来还有个国际化支持的,我这里运行不过来,要自己运行的可以看clfs-sysroot
配置glibc:
cat
>
${CLFS}
/
etc
/
nsswitch.conf
<<
"
EOF
"
# Begin
/
etc
/
nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End
/
etc
/
nsswitch.conf
EOF
配置glibc的动态装载:
cat
>
${CLFS}
/
etc
/
ld.so.conf
<<
"
EOF
"
# Begin
/
etc
/
ld.so.conf
/
usr
/
local
/
lib
/
opt
/
lib
# End
/
etc
/
ld.so.conf
EOF
7. 完全安装gcc
打上个GCC的补丁:
cd ..
/
gcc
-
4.1
.
1
patch
-
Np1
-
i ..
/
gcc
-
4.1
.
1
-
posix
-
1
.patch
patch
-
Np1
-
i ..
/
gcc
-
4.1
.
1
-
PR20425
-
1
.patch
patch
-
Np1
-
i ..
/
gcc
-
4.1
.
1
-
cross_search_paths
-
1
.patch
配置Configure:
mkdir
-
v ..
/
gcc
-
build
cd ..
/
gcc
-
build
..
/
gcc
-
4.1
.
1
/
configure
--
prefix
=
${CLFS}
/
cross
-
tools
--
host
=
${CLFS_HOST}
--
target
=
${CLFS_TARGET}
--
disable
-
multilib
--
with
-
sysroot
=
${CLFS}
--
disable
-
nls
--
enable
-
shared
--
enable
-
languages
=
c,c
++
--
enable
-
__cxa_atexit
--
enable
-
c99
--
enable
-
long
-
long
--
enable
-
threads
=
posix
编译安装gcc:
8. 打包压缩arm-linux-toolchains (我打包的时候老出问题,郁闷)
tar cvjf
/
tmp
/
arm
-
linux
-
toolchains.tar.bz2 /
cross
-
tools
/
arm
-
linux /
cross
-
tools
/
bin
/
arm
-
linux
-*
/
cross
-
tools
/
bin
/
genext2fs /
cross
-
tools
/
include
/
c
++/
4.1
.
1
/
cross
-
tools
/
lib
/
gcc
/
arm
-
linux
/
4.1
.
1/
cross
-
tools
/
libexec
/
gcc
/
arm
-
linux
/
4.1
.
1
注意:
编译好的arm-linux工具链未经过测试,只是用来学习怎样编译自己的交叉工具链,请不要用于任何实际的开发和使用,更不要用于商业产品中,
也不要用于学习arm,以免出错,出错后会很烦的
参考资料:
1. HOWTO build arm-linux toolchain for ARM/XSCALE (build-arm-linux-4.1)
2.clfs-sysroot book for arm
3.
使用gcc 4.1.1 glibc 2.5 kernel 2.6.19 创建arm 交叉工具链
4. arm-linux建立交叉编译工具链的过程