OR1200工具链.docx
- 文档编号:6247025
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:9
- 大小:18.81KB
OR1200工具链.docx
《OR1200工具链.docx》由会员分享,可在线阅读,更多相关《OR1200工具链.docx(9页珍藏版)》请在冰豆网上搜索。
OR1200工具链
OPENRISC交叉编译工具链搭建
操作环境
内核名称:
Linux
内核发行版:
2.6.32-431.el6.i686
内核版本:
#1SMPFriNov2200:
26:
36UTC2013
硬件架构名称:
x86_64
硬件平台:
x86_64
操作系统:
GNU/Linux
当前系统gcc版本号:
4.4.7
在Linux中建立整个OPRNRISC交叉编译环境的整体过程为:
1、下载源码包放在/mnt/hgfs/Document/
2、建立编译目录并设置环境变量
3、安装内核头文件
4、安装二进制工具(binutils)
5、建立初始编译器工具链(简版gcc)
6、建立glibc库
7、建立全套编译器工具链(fullgcc)
8、验证
一、下载源码包
GNU的所有源码文件都可以到这个地址下载:
http:
//ftp.gnu.org/gnu/
LinuxKernel源代码可以去这里下载:
http:
//www.kernel.org
mpc可以去这里下载:
http:
//www.multiprecision.org
下载的源码包如下:
binutils-2.22.tar
gcc-4.6.3.tar
glibc-2.13.tar
glibc-linuxthreads-2.3.6.tar
glibc-ports-2.13.tar
gmp-5.0.4.tar
linux-3.2.12.tar
mpc-0.9.tar
mpfr-2.4.2.tar.gz
注:
mpfr不建议使用3.0.0版本。
mpfr-3.0.0有Bug,会导致gcc编译不过。
在后面编译的过程中会提示缺少头文件,去内核中找到cp就可以了。
二、建立编译目录并设置环境变量
选定自己的工作目录,选择/home/lab/openrisc作为自己的工作目录。
然后在openrisc
中建立build-tools、kernel、tools三个文件夹。
实例:
root@fedora:
/opt/ming#cd/opt/
root@fedora:
/opt#mkdirembedded
root@fedora:
/opt#cdembedded/
root@fedora:
/opt/embedded#mkdirbuild-toolskerneltools
root@fedora:
/opt/embedded#cdbuild-tools/
root@fedora:
/opt/embedded/build-tools#mkdirbuild-binutilsbuild-boot-gccbuild-glibcbuild-gcc各文件夹的作用如下:
/home/lab/openrisc:
交叉编译环境的主目录
build-tools:
存放binutils、gcc、glibc等GNU源码和用来编译这些源代码的目录
kernel:
用来存放Linux内核源代码
tools:
用来存放编译好的交叉编译工具和库文件
build-binutils:
编译binutils的目录
build-boot-gcc:
编译gcc启动部分的目录
build-glibc:
编译glibc的目录
build-gcc:
编译整个gcc的目录
建立好编译目录之后便是设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要重新运行Terminal)。
如下:
exportPRJROOT=/home/lab/openrisc
exportTARGET=or32-elf
exportPREFIX=$PRJROOT/tools
exportTARGET_PREFIX=$PREFIX/$TARGET
exportPATH=$PATH:
$PREFIX/bin
各个环境变量的意义如下:
PRJROOT:
整个交叉编译环境的根目录
TARGET:
目标文件对应的architecture,openrisc-linux表示编译出来的target只能在openriscarchitecture中运行
PREFIX:
目标文件夹的路径前缀
TARGET_PREFIX:
目标文件夹的路径前缀路径
PATH:
可执行文件路径,这里主要指定编译工具等
三、安装内核头文件
将Linux内核源码解压至$PRJROOT/kernel目录,然后建立几个文件的符号链接,最后生成version.h文件。
实例:
首先解压Linux内核源文件
[lab@localhostkernel]$cp/mnt/hgfs/share/Document/linux-3.2.12.tar.bz2./
[lab@localhostkernel]$tar-xjvflinux-3.2.12.tar.bz2
[lab@localhostkernel]$mkdir/home/lab/openrisc/tools/or32-elf
[lab@localhostkernel]$mkdir/home/lab/openrisc/tools/or32-elf/include
[lab@localhostkernel]$ln-s/home/lab/openrisc/kernel/linux-3.2.12/include/linux//home/lab/openrisc/tools/or32-elf/include/linux
[lab@localhostkernel]$ln-s/home/lab/openrisc/kernel/linux-3.2.12/include/asm-generic//home/lab/openrisc/tools/or32-elf/include/asm-generic
[lab@localhostkernel]$ln-s/home/lab/openrisc/kernel/linux-3.2.12/arch/openrisc/include/asm//home/lab/openrisc/tools/or32-elf/include/asm(也可能是是asm-arm,示内核版本而定)
下面检查上面创建的符号链接是否正确。
实例:
[lab@localhostkernel]$cd/home/lab/openrisc/tools/or32-elf/include/
[lab@localhostinclude]$ls
asmasm-genericlinux
[lab@localhostinclude]$ll
total4
lrwxrwxrwx.1lablab65May2313:
54asm->/home/lab/openrisc/kernel/linux-3.2.12/arch/openrisc/include/asm/
lrwxrwxrwx.1lablab59May2313:
53asm-generic->/home/lab/openrisc/kernel/linux-3.2.12/include/asm-generic/
lrwxrwxrwx.1lablab53May2313:
51linux->/home/lab/openrisc/kernel/linux-3.2.12/include/linux/有如上结果表示符号链接创建正确。
[lab@localhostlinux-3.2.12]$makeARCH=openriscCROSS_COMPILE=or32-elf-menuconfig*配置(注意:
or32-elf-与menuconfig之间有一个空格)*
//在随后出现的文本菜单进行配置、配置完退出并保存。
若要设置某个选项,可将光标定位在该项上,按回车键。
对于前面有[]或者<>的,可以按空格键显示所包含的子选项。
配置完退出并保存(ExitYes)。
最后生成version.h文件。
实例:
[lab@localhostlinux-3.2.12]$makeinclude/linux/version.h
CHKinclude/linux/version.h
UPDinclude/linux/version.h接着进入相应目录查看version.h文件是否建立成功。
注:
上述的做法理论上没什么问题,但实际操作时,如果用其他版本的linux内核可能会出现头文件包含不全的情况,这会直接导致后面编译glibc时出现未定义、未声明、缺少头文件(如asm/unistd.h)的错误。
如果可能的话,建议按上述操作直接copy好用的其他交叉编译工具链中的asm、asm-generic、linux目录。
四、安装二进制工具(binutils)
Binutils是一些二进制工具集合,其中包含了常用的一些命令。
首先将binutils-2.22.tar.bz2解压至build-tools,然后进入build-binutils目录,配置并编译binutils,最后使用makeinstall进行安装。
实例:
[lab@localhostbuild-tools]$cp/mnt/hgfs/share/Document/binutils-2.22.tar.bz2./
[lab@localhostbuild-tools]$tar-xjvfbinutils-2.22.tar.bz2
[lab@localhostbuild-binutils]$../binutils-2.22/configure--target=$TARGET--prefix=$PREFIX
[lab@localhostbuild-binutils]$make
[lab@localhostbuild-binutils]$makeinstall
完成后,去$PREFIX中检查一下生成的工具。
实例:
[lab@localhostbin]$ll
total39076
-rwxr-xr-x.1lablab2413313May2314:
12or32-elf-addr2line
-rwxr-xr-x.2lablab2538196May2314:
12or32-elf-ar
-rwxr-xr-x.2lablab3427341May2314:
12or32-elf-as
-rwxr-xr-x.1lablab2374466May2314:
12or32-elf-c++filt
-rwxr-xr-x.1lablab62861May2314:
12or32-elf-elfedit
-rwxr-xr-x.1lablab2826685May2314:
12or32-elf-gprof
-rwxr-xr-x.4lablab3315918May2314:
12or32-elf-ld
-rwxr-xr-x.4lablab3315918May2314:
12or32-elf-ld.bfd
-rwxr-xr-x.2lablab2432224May2314:
12or32-elf-nm
-rwxr-xr-x.2lablab2980759May2314:
12or32-elf-objcopy
-rwxr-xr-x.2lablab3257210May2314:
12or32-elf-objdump
-rwxr-xr-x.2lablab2538191May2314:
12or32-elf-ranlib
-rwxr-xr-x.1lablab694086May2314:
12or32-elf-readelf
-rwxr-xr-x.1lablab2426105May2314:
12or32-elf-size
-rwxr-xr-x.1lablab2399907May2314:
12or32-elf-strings
-rwxr-xr-x.2lablab2980754May2314:
12or32-elf-strip
[lab@localhostbin]$pwd
/home/lab/openrisc/tools/bin有如下文件:
or32-elf-addr2line
or32-elf-ar
or32-elf-as
or32-elf-c++filt
or32-elf-elfedit
or32-elf-gprof
or32-elf-ld
or32-elf-ld.bfd
or32-elf-nm
or32-elf-objcopy
or32-elf-objdump
or32-elf-ranlib
or32-elf-readelf
or32-elf-size
or32-elf-strings
or32-elf-strip
这些生成的文件的作用分别为:
or32-elf-addr2line:
将你要找的地址转成文件和行号,它要使用debug信息
or32-elf-ar:
产生、修改和解开一个存档文件
or32-elf-as:
GNU的汇编器
or32-elf-c++filt:
C++和java中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标号,c++filt就是实现这种反向的转化,根据标号得到函数名
or32-elf-elfedit:
用途暂时未知
or32-elf-gprof:
GNU汇编器预编译器
or32-elf-ld:
GNU的连接器
or32-elf-ld.bfd:
用途暂时未知
or32-elf-nm:
列出目标文件的符号和对应的地址
or32-elf-objcopy:
将某种格式的目标文件转化成另外格式的目标文件
or32-elf-objdump:
显示目标文件的信息
or32-elf-ranlib:
为一个存档文件产生一个索引,并将这个索引存入存档文件中
or32-elf-readelf:
显示elf格式的目标文件的信息
or32-elf-size:
显示目标文件各个节的大小和目标文件的大小
or32-elf-strings:
打印出目标文件中可以打印的字符串,有个默认的长度,为4
or32-elf-strip:
剥掉目标文件的所有的符号信息
注:
编译过程中有可能出现的错误:
gcc-DHAVE_CONFIG_H-I.-I.-I.-I../bfd-I./config-I./../include-I./..-I./../bfd-DLOCALEDIR="\"/tools/cross/share/locale\""-W-Wall-Wstrict-prototypes-Wmissing-prototypes-Werror-g-O2-MTtc-arm.o-MD-MP-MF.deps/tc-arm.Tpo-c-otc-arm.o`test-f'config/tc-arm.c'||echo'./'`config/tc-arm.c
cc1:
warningsbeingtreatedaserrors
config/tc-arm.c:
Infunction‘make_mapping_symbol’:
config/tc-arm.c:
2489:
警告:
if语句体为空
make[4]:
***[tc-arm.o]错误1//排错要充分利用报错信息。
make[4]:
Leavingdirectory`/root/build/binutils-2.20_cross/gas'
make[3]:
***[all-recursive]错误1
make[3]:
Leavingdirectory`/root/build/binutils-2.20_cross/gas'
make[2]:
***[all]错误2
make[2]:
Leavingdirectory`/root/build/binutils-2.20_cross/gas'
make[1]:
***[all-gas]错误2
make[1]:
Leavingdirectory`/root/build/binutils-2.20_cross'
make:
***[all]错误2
解决方案:
1)网上说的在tc-arm.c中加个括号,没研究,可能好用;
2)在make这一步中,可能会在编译../binutils-2.22/gas/config/tc-arm.c出现gcc把警告当成错误的错误,其原因在于编译该文件时使用了-Werror选项,解决办法是修改../binutils-2.22/gas/configure文件第10624行,把ERROR_ON_WARNING=yes改为ERROR_ON_WARNING=no,保存退出,重新执行make即可。
3)在配置时,关闭Warning报错,也可以编译成功:
(我用的是这种)
[root@localhostbinutils-2.20_cross_no_2]#./configure--target=arm-linux--disable-werror&&make
参考:
...1f095af819b853.html
五、建立初始编译器(简版gcc)
Gcc是最主要的编译器。
首先将gcc-4.6.3.ta解压至build-tools,然后将gmp-5.0.2.tar.bz2、mpfr-2.4.2.tar.gz、mpc-0.9.tar.gz分别解压至gcc源码所在目录,并将目录重命名为gmp、mpfr、mpc,然后进入build-boot-gcc目录,进行编译配置,然后makeall-gcc并安装,最后makeall-target-gcc并安装。
实例:
root@fedora:
/opt/embedded/build-tools#cd/opt/embedded/build-tools/
root@fedora:
/opt/embedded/build-tools#cp/mnt/hgfs/Document/gcc-4.6.3.ta.
root@fedora:
/opt/embedded/build-tools#tar-xvfgcc-4.6.3.ta
root@fedora:
/opt/embedded/build-tools#cdgcc-4.6.3/
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#cp/mnt/hgfs/Document/mpfr-2.4.2.tar.gz.
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#cp/mnt/hgfs/Document/gmp-5.0.2.tar.bz2.
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#cp/mnt/hgfs/Document/mpc-0.9.tar.gz.
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#tar-xvfmpfr-2.4.2.tar.gz
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#mvmpfr-2.4.2/mpfr
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#tar-xjfgmp-5.0.2.tar.bz2
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#mvgmp-5.0.2/gmp
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#tar-xvfmpc-0.9.tar.gz
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#mvmpc-0.9mpc
这里需要修改一下编译配置文件:
/opt/embedded/build-tools/gcc-4.6.3/gcc
/config/arm/t-linux
将“TARGET_LIBGCC2_CFLAGS=-fomit-frame-pointer–fPIC”改为
“TARGET_LIBGCC2-CFLAGS=-fomit-frame-pointer-fPIC-Dinhibit_libc-D__gthr_posix_h”。
然后便可以切换到目录build-boot-gcc进行编译了,实例:
root@fedora:
/opt/embedded/build-tools/gcc-4.6.3#cd/opt/embedded/build-tools/build-boot-gcc/
root@fedora:
/opt/embedded/build-tools/build-boot-gcc#../gcc-4.6.3/configure--target=$TARGET--prefix=$PREFIX--without-headers--enable-languages=c--disable-threads--with-newlib--disable-shared--disable-libmudflap--disable-libssp
root@fedora:
/opt/embedded/build-tools/build-boot-gcc#makeall-gcc
root@fedora:
/opt/embedded/build-tools/build-boot-gcc#makeinstall-gcc
root@fedora:
/opt/embedded/build-tools/build-boot-gcc#makeall-target-libgcc
root@fedora:
/opt/embedded/build-tools/build-boot-gcc#makeinstall-target-libgcc
完成之后,$PREFIX/bin下又多了几个文件:
arm-linux-cpp*
arm-linux-gcc*
arm-linux-gcc-4.6.3*
arm-linux-gcov*
这些生成的文件的作用分别为:
arm-linux-cpp:
GNU的C的预编译器
arm-linux-gcc:
GNU的C语言编译器
arm-linux-gcc-4.6.3:
GNU的C语言编译器,其实和arm-linux-gcc是一样的
arm-linux-gcov:
gcc的辅助测试工具,用来分析和优化程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OR1200 工具