ubuntu 12.04 交叉编译(linux交叉编译)

Ubuntu14.04 用arm-linux-gcc 4.4.3 配置交叉编译环境问题

安装步骤

1、将压缩包arm-linux-gcc-4.4.3.tar.gz存放在一个目录下,这个目录就是你等会解压缩的目录,以后这个目录就不能随便删掉了

2、使用tar命令:tar zxvf arm-gcc-4.4.3.tar.gz将software文件夹下的arm-linux-gcc-4.4.3.tar.gz解压缩安装到当前目录下如下图

通过下图可以看到解压成功了,并且解压后的文件存放了/home/song/software/opt/FriendlyARM/toolschain/4.4.3文件夹下,如下图所示,这个存放路径可得记住,如下图

3、接下来配置系统环境变量,把交叉编译工具链的路径添加到环境变量PATH中去,这样就可以在任何目录下使用这些工具。记下上一步中的安装路径,使用命令:vim/etc/profile编辑profile文件,添加环境变量。

在profile中最后一行添加: export PATH=$PATH:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin这个路径就是那个bin目录所在的路径,可能你的不一样,按照你实际的目录填就可以了,如下图32行

编写完保存就好了

4、使用命令:source/etc/profile使环境变量生效

5、在终端上输入命令 arm-linux再按Tab键,可以看到下图,说明环境变量设置成功了

6、使用命令:arm-linux-gcc-v会出现下面的错误提示:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-gcc: 15: exec:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-gcc: not found

说是出现这种问题的原因是由于Ubuntu12.04用的是64位的,解决方法就是使用命令:sudo apt-get install ia32-libs装一些32位的库

7、待安装完32位的库之后,再使用命令:arm-linux-gcc-v,这一次就成功了,如下图

8、验证,编译一个hello.c文件

使用命令:arm-linux-gcc hello.c-o hello看是否编译成功

如何构建MIPS交叉编译工具链

运行环境:Ubuntu12.04

PC提前安装库:flex,bison,libncureses5-dev,texinfo,这些库提前apt-get install。

需要重新安装:gawk(先apt-get remove mawk,然后apt-get install gawk,工具链构建完成后可恢复)。

交叉编译需要软件包,几乎都可以在GNU下载得到:

binutils-2.22:GNU的工具包;

gcc-4.6.2:GCC;

glibc-2.14:GNU的C库;

glibc-ports-2.14:GNU的C库的补丁;

gmp-5.0.4:GNU的数学运算库;

mpc-0.9:GNU的复数运算库;

mpfr-3.0.1:GNU的浮点运算库。中mpfr依赖于gmp,mpc依赖于mpfr与gmp;

linux-2.6.38(用来编译Linux内核以及提供相应头文件)。

第一步创建目录以及环境变量

在当前用户目录下创建target-project文件夹,在该文件夹下创建mips-module文件夹,在mips-module文件夹下创建三个文件夹:build-tools,kernel,tools,最后,在build-tools文件夹下创建build-gcc,build-boot-gcc,build-glibc,build-binutils文件夹。命令如下:

$ cd~

$ mkdir-p./target-project/mips-module/{kernel/,tools/,build-tools/{build-gcc,build-boot-gcc,build-glibc,build-binutils}}

$ tree./target-project/mips-module/

观察目录结构,如下图:

使用脚本构建环境变量,脚本内容如下图:

注意修改/home/用户名,修改正确后,使用source使脚本生效

$ cd target-project

$ chmod+x mips.sh

$ source mips.sh

可以使用echo査看相关变量名以观察环境变量是否生效。

最后把linux-2.6.38.tar.bz2下载放置在kernel文件夹下,binutils-2.22.tar.gz,gcc-4.6.2.tar.gz,glibc-2.14.tar.gz,glibc-ports-2.14.tar.gz,gmp-5.0.4.tar.gz,mpc-0.9.tar.gz,mpfr-3.0.1.tar.gz下载放置在build-tools文件夹下。

第二步安装基于MIPS的linux头文件

$ cd$PRJROOT/kernel

$ tar-xjvf linux-2.6.38.tar.bz2

$ cd linux-2.6.38

在指定路径下创建include文件夹,用来存放相关头文件。

$ mkdir-p$TARGET_PREFIX/include

保证linux源码是干净的。

$ make mrproper

生成需要的头文件。

$ make ARCH=mips headers_check

$ make ARCH=mips INSTALL_HDR_PATH=dest headers_install

将dest文件夹下的所有文件复制到指定的include文件夹内。

$ cp-rv dest/include/*$TARGET_PREFIX/include

最后删除dest文件夹

$ rm-rf dest

$ ls-l$TARGET_PREFIX/include

査看生成的include文件夹,如下图:

第三步安装binutils-2.22

$ cd$PRJROOT/build-tools

$ tar-xzvf binutils-2.22.tar.gz

$ cd build-binutils

$../binutils-2.22/configure--target=$TARGET--prefix=$PREFIX

$ make

$ make install

我在安装binutils-2.22时会产生这样一个bug,如下图所示:

错误原因就是-Werror,把warning当成error处理,需要修改相关位置的Makefile文件。而经过察看后,发现binutils都是automake,因此需要重新automake。class="keylink">qqwstewYXV0by10b29sc6Osx9Kw5rG+sdjQ69PruMNtYWtlZmlsZS5pbrDmsb7Su9bCo6xhdXRvbWFrZbDmsb4xLjExLjGjrGF1dG9jb25msOaxvjIuNjShozxiciAvPtDo0qrPyLCy17BhdXRvY29uZqGjPC9wPgoKPHByZSBjbGFzcz0="brush:java;">$ tar-xzvf autoconf-2.64.tar.gz$ cd autoconf-2.64$./configure$ make$ sudo make install

再安装automake。

$ tar-xzvf automake-1.11.1.tar.gz

$ cd automake-1.11.1

$./configure

$ make

$ sudo make install

下面开始修改相关文件,主要是去掉-Werror。

$ cd$PRJROOT/build-tools/binutils-2.22/gas

$ gedit configure

将下面内容

# Enable-Werror by default when using gcc

if test"${GCC}"= yes-a-z"${ERROR_ON_WARNING}"; then

ERROR_ON_WARNING=yes

fi

修改为

# Enable-Werror by default when using gcc

if test"${GCC}"= yes-a-z"${ERROR_ON_WARNING}"; then

ERROR_ON_WARNING=no

fi

但是,需要重新configure生成Makefile.in。

$./configure(在binutils/gas路径下的configure)

$ make distclean(切记)

然后重新执行第三步,这次编译可过。

最后,$ ls$PREFIX/bin,如下图:

第四步安装gcc引导器

$ cd$PRJROOT/build-tools

$ tar-xzvf gcc-4.6.2.tar.gz

$ tar-xjvf gmp-5.0.4.tar.bz2

$ mv gmp-5.0.4./gcc-4.6.2/gmp

$ tar-xzvf mpc-0.9.tar.gz

$ mv mpc-0.9./gcc-4.6.2/mpc

$ tar-xzvf mpfr-3.0.1.tar.gz

$ mv mpfr-3.0.1./gcc-4.6.2/mpfr

$ cd build-boot-gcc

$../gcc-4.6.2/configure--target=$TARGET--prefix=$PREFIX--disable-shared

--without-headers--with-newlib--enable-languages=c--disable-decimal-float

--disable-libgomp--disable-libmudflap--disable-libssp--disable-threads--disable-multilib

编译并安装gcc引导器、libgcc库。

$ make all-gcc

$ make all-target-libgcc

$ make install-gcc

$ make install-target-libgcc

第五步编译glibc

$ cd$PRJROOT/build-tools

$ tar xzvf glibc-2.14.tar.gz

$ cd glibc-2.14

删除Makefonfig文件中的内容-lgcc_eh。

$ cp-v Makeconfig{,.bk}

$ sed-e's/-lgcc_eh//g' Makeconfig.bk> Makeconfig

$ cd..

$ tar-xjvf glibc-ports-2.14.tar.bz2

$ mv glibc-ports-2.14./glibc-2.14/ports

$ cd build-glibc

$ CC=mipsel-linux--gcc../glibc-2.14/configure--host=$TARGET--prefix="/usr"

--enable-add-ons--with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

注意:此时如何设置了LD_LIBRARY_PATH环境变量会configure error,需要删除该变量重新configure。

$ make

$ make install_root=$TARGET_PREFIX prefix=”” install

第六步完全安装gcc

首先,也是很重要的是去掉libc等库文件的绝对路径。

$ cd$TARGET_PREFIX/lib

备份一下。

$ cp libc.so libc.so.bk

$ gedit libc.so

将原内容

GROUP(/lib/libc.so.6/lib/libc_nonshared.a AS_NEEDED(/lib/ld.so.1))

修改为

GROUP( libc.so.6 libc_nonshared.a AS_NEEDED( ld.so.1))

$ cp libpthread.so libpthread.so.bk

$ gedit libpthread.so

将原内容

GROUP(/lib/libpthread.so.0/lib/libpthread_nonshared.a)

修改为

GROUP( libpthread.so.0 libpthread_nonshared.a)

然后可以完全编译gcc。

$ cd$PRJROOT/build-tools/build-gcc

$../gcc-4.6.2/configure--target=$TARGET--prefix=$PREFIX--enable-languages=c,c++

$ make all

$ make install

注意,编译或者在qemu仿真的时候一定要指定相关库文件的路径。

完全安装gcc,$ ls$PREFIX/bin,如下图:

编译任意C文件。

$ mipsel-linux-gcc-o test test.c(注意需要设置环境变量或者source mips.sh)

$ file test

Ubuntu下如何构建交叉编译环境

下面就一些问题作一个说明,以期抛砖引玉。基于Linux操作系统的应用开发环境一般是由目标系统硬件(开发板)和宿主PC机所构成。目标硬件开发板用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主PC机来完成(所以称为交叉编译)。双方之间一般通过串口,并口或以太网接口建立连接关系。但在此我建议构建如下的交叉编译环境,适合个人或研发小组使用:单独拿出一台PC机(PII以上即可,就用以前淘汰的旧机器就可以),在该PC上安装桌面的Linux操作系统(如Red Hat Linux 8.0及以上),可以采用默认的安装选项(注意要包含FTP服务),这台PC作为Linux服务器,除管理员以外,一般不直接让其他人去操作。将该Linux服务器接入局域网,并新建一些合法用户,以便其他的PC机(在此我们将其称为工作站)的合法用户能访问到Linux服务器。而其他的PC机(工作站)仍然使用Windows操作系统,原来干啥继续干啥。需要的软件工具包括:
1、FTP客户端程序(如Cuteftp,可到网上下载)。
2、Telnet工具(如SecureCRT,可到网上下载)。
3、移植到某一特定ARM平台的Linux操作系统内核源码(一般由销售商整理提供)。
4、GNU编译工具,可由相关网站下载,或由销售商整理提供。在工作站安装:在某工作站PC上安装FTP客户端程序和Telnet工具,安装完毕后应该可以在该工作站PC和Linux服务器之间进行文件的传输,并在工作站PC可以通过Telnet登陆到Linux服务器(可能需要将Linux服务器的防火墙服务关闭才能完成)。在Linux服务器安装:将工作站PC上的Linux操作系统内核源码压缩包和GNU编译工具通过FTP传送到Linux服务器的某个目录(如合法的用户目录),然后在该目录下解压,并将GNU编译工具安装到默认的工作目录即可,以上工作通过在工作站PC使用Telnet工具完成,而不需要在Linux服务器上进行。
Linux操作系统内核的编译:
Linux操作系统内核的编译一般有一个比较固定的步骤,会根据MakeFile文件的不同而略有差异,可参考相关文档,编译的工作在工作站PC使用Telnet工具完成。

阅读剩余
THE END