OR1200工具链.docx

上传人:b****5 文档编号:6247025 上传时间:2023-01-04 格式:DOCX 页数:9 大小:18.81KB
下载 相关 举报
OR1200工具链.docx_第1页
第1页 / 共9页
OR1200工具链.docx_第2页
第2页 / 共9页
OR1200工具链.docx_第3页
第3页 / 共9页
OR1200工具链.docx_第4页
第4页 / 共9页
OR1200工具链.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

OR1200工具链.docx

《OR1200工具链.docx》由会员分享,可在线阅读,更多相关《OR1200工具链.docx(9页珍藏版)》请在冰豆网上搜索。

OR1200工具链.docx

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的辅助测试工具,用来分析和优化程序

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1