linux内核 编译 arm?ubuntu移植到arm步骤

大家好,关于linux内核 编译 arm很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于ubuntu移植到arm步骤的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

Linux下的交叉编译环境设置

采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。

linux下的交叉编译环境重要包括以下几个部分:

1.对目标系统的编译器gcc

2.对目标系统的二进制工具binutils

3.目标系统的标准c库glibc

4.目标系统的linux内核头文件

交叉编译环境的建立步骤

一、下载源代码下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。

二、编译binutils首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。

三、配置linux内核头文件

首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。

配置完成之后,需要将内核头文件拷贝到安装目录: cp-dR include/asm-arm$PREFIX/arm-linux/include/asm cp-dR include/linux$PREFIX/arm-linux/include/linux

四、第一次编译gcc

首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。

五、交叉编译glibc

这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。

configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc./configure--prefix=$PREFIX/arm-linux--host=arm-linux--enable-add-ons最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。

六、第二次编译gcc

运行configure,参数设置为--prefix=$PREFIX--target=arm-linux--enable-languages=c,c++。

运行make install。

到此为止整个交叉编译环境就完全生成了。

几点注意事项

第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。

怎么安装arm-linux-gcc4.8

CrossBuild很蛋疼的,以目标内核2.6.x为例,我们需要以下基本包:

binutils-2.23.1.tar.bz2

gcc-4.8.2.tar.bz2

glibc-2.18.tar.bz2

glibc-linuxthreads-2.5.tar.bz2

gdb-7.6.1.tar.bz2

linux-2.6.34.14.tar.xz

mpfr-3.1.2.tar.bz2

mpc-1.0.1.tar.gz

gmp-5.1.3.tar.bz2

因为编译过程很费时,你要在bash配置文件中直接声明环境变量:

vim~/.bashrc

export TARGET=arm-linux-gnueabi

export PREFIX=/usr/local/arm/4.8.2

export TARGET_PREFIX=$PREFIX/$TARGET

export PATH=$PATH:$PREFIX/bin

#source~/.bashrc

以便下次工作继续恢复现场。

工具链创建:

先来安装mpfr、mpc、gmp。#号表示在root下工作。

#tar-xjf gmp-5.1.3.tar.bz2&&cd gmp-5.1.3

#mkdir build&& cd build&&\

../configure--prefix=/usr/local/gmp--build=x86_64-linux-gnu&&\

make&& make install

OK,gmp done,Next,搞搞mpfr:

#tar-xjvf mpfr-3.1.2.tar.bz2&& cd mpfr-3.1.2

#../configure--build=x86_64-linux-gnu--prefix=/usr/local/mpfr--with-gmp=/usr/local/gmp&&\

make&&make install

OK, mpfr done, Next we build mpc:

#tar-xzvf mpc-1.0.1.tar.gz&& cd mpc-1.0.1

mkdir build&& cd build

#../configure--build=x86_64-linux-gnu--prefix=/usr/local/mpc--with-gmp=/usr/local/gmp--with-mpfr=/usr/local/mpfr&&\

make&&make install

After, we need to copy linux-kernel-headers:

xz-d linux-2.6.34.14.tar.xz

tar-xvf linux-2.6.34.14.tar

cd linux-2.6.34.14

make menuconfig

这里我们不作任何个性,直接保存退出。

#make include/linux/version.h

#mkdir-p$TARGET_PREFIX/include

#cp-r./include/linux/$TARGET_PREFIX/include

#cp-r./include/asm-generic/$TARGET_PREFIX/include

#cp-r./arch/arm/include/asm/$TARGET_PREFIX/include

然后编译binutils:

#tar-xjvf binutils-2.23.1.tar.bz2

#cd binutils-2.23.1

#mkdir build&& cd build

#../configure--prefix=$PREFIX--target=$TARGET

#make

#make install

$TARGET得到一大堆工具,我就不一一介绍了。

接下来为ARM平台编译不带链接库的原初编译器,这一步称作恐龙蛋生小鸡。

解开tar-xjvf gcc-4.8.2.tar.bz2,并把mpfr-3.1.2.tar.bz2、mpc-1.0.1.tar.gz、gmp-5.1.3.tar.bz2也解开,去掉版本号放到gcc源目录下。

先删除 gcc下上述几个包,如果存在的话:

rm-rf mpfr-3.1.2 mpc-1.0.1 gmp-5.1.3

然后解包,并移入gcc下:

#tar-xjvf gmp-5.1.3.tar.bz2

#mv gmp-5.1.3 gmp

#mv./gmp./gcc-4.8.2

#tar-xjvf mpfr-3.1.2.tar.bz2

#mv mpfr-3.1.2 mpfr

#mv./mpfr./gcc-4.8.2

#tar-xzvf mpc-1.0.1.tar.gz

#mv mpc-1.0.1 mpc

#mv./mpc./gcc-4.8.2

可以编译gcc了:

#cd gcc-4.8.2

#mkdir build&& cd build

#../configure--prefix=$PREFIX--target=$TARGET--without-headers--enable-languages=c--disable-threads--with-newlib--disable-shared--disable-libmudflap--disable-libssp--disable-decimal-float&&\

make all-gcc&& make install-gcc&& make all-target-libgcc&&\

make install-target-libgcc

如果没出错的话,这里的预编译就快搞好了,擦把汗先。

#tar-xvf glibc-2.18.tar.xz

#tar-xvf glibc-linuxthreads-2.5.tar.bz2--directory=./glibc-2.18

# cd glibc-2.18

# mkdir build

# cd build

# CC=$TARGET-gcc

#export CFLAGS="-g-O2-march=arm"

# ln-s/usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc.a/usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc_eh.a

这里编译好的glibc就是for arm的glibc了。

创建config.cache配置文件

# vim config.cache

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_arm_tls=yes

#../configure--host=$TARGET--target=$TARGET--prefix=$TARGET_PREFIX--enable-add-ons--disable-profile--cache-file=config.cache--with-binutils=$PREFIX/bin--with-headers=$TARGET_PREFIX/include

#make all

#make install

预编译环境搭好,我擦已经下班了,明天继续。

好了,为正式开始 arm铸刀:

# cd gcc-4.8.2/build/

# rm-rf*

#../configure--prefix=$PREFIX--target=$TARGET--enable-shared--enable-languages=c,c++

# make

# make install

这就是arm版的gcc了

编译gdb

# tar-xvf gdb-7.6.1.tar.bz2

# make

# make install

创建链接

# cd$PREFIX/bin

# ln-s arm-linux-gnueabi-addr2line arm-linux-addr2line

# ln-s arm-linux-gnueabi-ar arm-linux-ar

# ln-s arm-linux-gnueabi-as arm-linux-as

# ln-s arm-linux-gnueabi-c++ arm-linux-c++

# ln-s arm-linux-gnueabi-c++filt arm-linux-c++filt

# ln-s arm-linux-gnueabi-cpp arm-linux-cpp

# ln-s arm-linux-gnueabi-elfedit arm-linux-elfedit

# ln-s arm-linux-gnueabi-g++ arm-linux-g++

# ln-s arm-linux-gnueabi-gcc arm-linux-gcc

# ln-s arm-linux-gnueabi-gcc-4.6.3 arm-linux-gcc-4.6.3

# ln-s arm-linux-gnueabi-gcov arm-linux-gcov

# ln-s arm-linux-gnueabi-gdb arm-linux-gdb

# ln-s arm-linux-gnueabi-gdbtui arm-linux-gdbtui

# ln-s arm-linux-gnueabi-gprof arm-linux-gprof

# ln-s arm-linux-gnueabi-ld arm-linux-ld

# ln-s arm-linux-gnueabi-ld.bfd arm-linux-ld.bfd

# ln-s arm-linux-gnueabi-nm arm-linux-nm

# ln-s arm-linux-gnueabi-objcopy arm-linux-objcopy

# ln-s arm-linux-gnueabi-objdump arm-linux-objdump

# ln-s arm-linux-gnueabi-ranlib arm-linux-ranlib

# ln-s arm-linux-gnueabi-readelf arm-linux-readelf

# ln-s arm-linux-gnueabi-run arm-linux-run

# ln-s arm-linux-gnueabi-size arm-linux-size

# ln-s arm-linux-gnueabi-strings arm-linux-strings

# ln-s arm-linux-gnueabi-strip arm-linux-strip

这把可以杀人了,开始为你树莓派编译软件吧。

如何编译arm linux的go

Golang也就是Go语言,现在已经发行到1.4.1版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。

注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。

1、编译工具配置

据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:

1.1在Ubuntu或Debian平台上可以使用sudo apt-get install gcc libc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。

1.2在RedHat或CentOS 6平台上可以使用sudo yum install gcc libc-devel命令安装。

安装完成后可以输入 gcc--version命令验证是否成功安装。

2、获取golang源代码

2.1直接从官网下载源代码压缩包。

golang官网提供golang的源代码压缩包,可以直接下载,最新的1.4.1版本源代码链接:

2.2使用git工具获取。

golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。

2.2.1首先确认ARM平台上已经安装了git工具,可以使用git--version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:

2.2.2克隆远程golang的git仓库到本地

在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:

git clone

大陆地区可能会获取失败,在不翻墙的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:

git clone

视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆==

下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cd go命令进入该目录。

执行下面命令检出go1.4.1版本的源代码,因为现在已经有新的代码提交上去了,最新的代码可能不是最稳定的:

git checkout go1.4.1

至此,最新1.4.1发行版的源代码获取完毕

3、设置golang的编译环境变量

主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。

3.1 GOROOT

主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的all.bash脚本运行时的父目录作为GOROOT的值。为了保险起见,可以直接设置为go目录的路径。

3.2 GOOS和GOARCH

分别代表编译的目标系统和平台,可选值如下:

GOOS GOARCH

darwin 386

darwin amd64

dragonfly 386

dragonfly amd64

freebsd 386

freebsd amd64

freebsd arm

linux 386

linux amd64

linux arm

netbsd 386

netbsd amd64

netbsd arm

openbsd 386

openbsd amd64

plan9 386

plan9 amd64

solaris amd64

windows 386

windows amd64

需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。

3.3 GOARM

表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。

总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/.bashrc文件,在末尾添加下面内容:

export GOROOT=你的go目录路径

export GOOS=linux

export GOARCH=arm

编辑完后保存,执行source~/.bashrc命令让修改生效。

4、编译源代码

环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有all.bash和make.bash两个脚本(另外还有两个all.bat和make.bat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于all.bash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行make.bash脚本。使用cd命令进入go下src目录,执行./all.bash或者./make.bash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。

5、配置golang运行环境变量

编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/.bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上

export PATH=$PATH:$GOROOT/bin

保存后同样执行source~/.bashrc命令让环境变量生效。

至此,golang源代码编译安装成功。执行go version应该就能看到当前golang的版本信息,表示编译安装成功。

阅读剩余
THE END