您的位置 首页 动态

arm穿插编译环境建立

arm交叉编译环境搭建今天搭建了一个基于arm的嵌入式开发环境,特记录搭建过程及其中遇到的问题。一:准备1、使用的软件版本kernel:(http:

arm穿插编译环境树立

今日树立了一个根据arm的嵌入式开发环境,特记载树立进程及其间遇到的问题。

一:预备
1、运用的软件版别
kernel:(http://www.kernel.org/pub/linux/kernel/v2.4/)
linux-2.4.21.tar.gz
(patch下载地址:ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)
patch-2.4.21-rmk1.gz

binutils:(ftp://ftp.gnu.org/gnu/binutils)
binutils-2.14.tar.gz

gcc:(ftp://ftp.gnu.org/gnu/gcc)
gcc-core-2.95.3.tar.gz
gcc-g++-2.95.3.tar.gz
(patch下载地址:http://www.linuxfromscratch.org/patches/downloads/gcc/)
gcc-2.95.3-2.patch
gcc-2.95.3-no_fixinc-1.patch
gcc-2.95.3-returntype_fix-1.patch

glibc:(ftp://ftp.gnu.org/gnu/glibc)
glibc-2.2.4.tar.gz
glibc-linuxthreads-2.2.4.tar.gz

gdb:(ftp://ftp.gnu.org/gnu/gdb)
gdb-6.0.tar.bz2

二:树立作业目录
#cd /
#mkdir crosstool
#mkdir linux-2.4.21 binutils gcc glibc gdb

把下载的源代码的压缩文件放入对应的文件夹:
/crosstool/linux-2.4.21:linux-2.4.21.tar.gz、patch-2.4.21-rmk1.gz
/crosstool/binutils: binutils-2.14.tar.gz
/crosstool/gcc: gcc-core-2.95.3.tar.gz、gcc-g++-2.95.3.tar.gz、gcc-2.95.3-2.patch、gcc-2.95.3-no_fixinc-1.patch、gcc-2.95.3-returntype_fix-1.patch
/crosstool/glibc: glibc-2.2.4.tar.gz 、glibc-linuxthreads-2.2.4
/crosstool/gdb: gdb-6.0.tar.bz2

三:树立二进制东西
#cd /crosstool/binutils
#tar -xvzf binutils-2.14.tar.gz
#cd binutils-2.14
#mkdir build-arm-linux
#../binutils-2.14/configure –target=arm-linux –prefix=/usr/local/arm/2.95.3
#make
#make install
–target 选项是指出穿插东西的体系结构,一切运转在主机上的穿插东西都要
装备这个选项。
–prefix 选项是指定途径前缀,编译完结之后,将装置到这个目录下。

要运用这些东西,咱们必须在 linux 的发动脚本中增加如下环境变量:
#vi /etc/profile
在 profile 文件中增加如下 PATH 环境变量:
pathmunge /usr/local/arm/2.95.3/bin
保存。
运用source /etc/profile使修正收效。

四:树立gcc编译器(初始编译器)
#cd /crosstool/gcc
#tar -xvzf gcc-core-2.95.3.tar.gz
#tar –xvzf gcc-g++-2.95.3.tar.gz
#cd gcc-2.95.3
#patch -p1< ../gcc-2.95.3-2.patch
#patch -p1< ../gcc-2.95.3-no_fixinc-1.patch
#patch -p1< ../gcc-2.95.3-returntype_fix-1.patch 装备 t-linux 文件。由于咱们现在还没有 glibc 库的支撑,所以需求简略装备一些简略的选项。关于arm-linux 东西能够经过修正
/crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux 装备文件。
修正 t-linux 文件,在文件结尾参加如下 2 行:
#vim /crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux
TARGET_LIBGCC2-CFLAGS += -Dinhibit_libc -D__gthr_posix_h
T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h
-Dinhibit_libc 的意思是制止运用 libc,由于现在还没有编译出 glibc 库。

#mkdir build-arm-linux
#cd build-arm-linux
#../configure –target=arm-linux –prefix=/usr/local/arm/2.95.3 –with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include –disable-shared –disable-threads –enable-languages=”c”

该编译指令中:
–target 指定穿插编译东西的方针体系结构是 arm-linux
–prefix 指定装置途径为/usr/local/arm/2.95.3
–with-headers 指定内核头文件地点的途径为:/crosstool/linux-2.4.21/linux-2.4.21/include
–disable-shared 选项指定不运用同享库,这样就不依靠 glibc 了
–disable-threads 选项指定不运用线程,也就不运用线程库了。
–enable-languages 指定仅支撑 c 言语

#make
在make的时分呈现过错,在/crosstool/gcc/gcc-2.95.3/gcc/config/arm目录下的arm.c文件中,“arm_prog_mode = TARGET_APCS_32 ? PROG_MODE_PROG32 : PROG_MODE_PROG26;”句报错。能够将其刊出。能够正常编译。
#make install

五:生成glibc库
#cd /crosstool/glibc
#tar -xvzf glibc-2.2.4.tar.gz
#cd glibc-2.2.4
#tar -xzvf ../glibc-linuxthreads-2.2.4.tar.gz
#mkdir build-arm-linux
#cd build-arm-linux
#CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld ../configure –host=arm-linux –with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include/ –enable-add-ons=linuxthreads –enable-shared –prefix=/usr/local/arm/2.95.3/arm-linux

CC=arm-linux-gcc 是把 CC 变量设成你刚编译生成的 arm-linux-gcc,用它来编译你的glibc。
–host 指定方针板的体系结构
–with-headers 指定内核头文件的途径为/crosstool/linux-2.4.21/linux-2.4.21/include
–enable-add-ons=linuxthreads 支撑线程库。
–enable-shared 选项支撑同享库
–prefix 指定东西链方针板相关文件的目录

#make
#make install

此刻在/usr/local/arm/2.95.3/arm-linux 目录下的 lib 等目录中,装置了 glibc同享库等文件。然后修正/usr/local/arm/2.95.3/arm-linux/lib/目录下的libc.so文件:

#vim /usr/local/arm/2.95.3/arm-linux/lib/libc.so

将“GROUP ( /usr/local/arm/2.95.3/arm-linux//lib/libc.so.6 /usr/local/arm/2.95.3/arm-linux//lib/libc_nonshared.a )”
修正为
“GROUP ( libc.so.6 libc_nonshared.a )”
这样衔接程序 ld 就会在 libc.so 地点的目录查找它需求的库,由于你的机子的/lib 目录或许现已装了一个相同姓名的库,一个为编译能够在你的宿主机上运转的程序的库,而不是用于穿插编译的。

假如不这样修正,会在后边第六步树立g++编译器的时分报错。(/crosstool/gcc/gcc-2.95.3/build-arm-linux/arm-linux/libiberty目录下找不到Makefile文件。)
呈现编译过错问题。

六:树立全套编译器(gcc和g++)
#cd /crosstool/gcc/gcc-2.95.3

首要,将咱们增加的2行-Dinhibit_libc去掉,由于此刻不需求制止运用libc了,咱们在第 5 步中现已生成了libc。
#vim gcc/cpmfog/arm/t-linux

然后,进入 build-arm-linux 铲除暂时目录及暂时文件。
#cd build-arm-linux
#make distclean
#rm –rf ./*

#../configure –target=arm-linux –prefix=/usr/loacal/arm/2.95.3 –with-headers=/crosstool/linux-2.4.21/linux2.4.21/include –enable-threads=pthreads –enable-shared –enable-static –enable-languages=”c,c++”
#make
#make install

最终在/usr/loacal/arm/2.95.3/bin目录多了arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++几个文件

七:验证穿插编译东西
#cd /crosstool/
#mkdir test
#cd test
#vim helloworld.c

#include

int main(void)
{
printf(“Hello World!n”);
return 0;
}

#arm-linux-gcc helloworld.c -o helloworld
#file helloworld
helloworld: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
表明编译了一个能在 arm 体系结构下运转的helloworld程序,阐明编译东西做成功了。

八:其它制造穿插编译环境的办法
1、运用的东西
crosstool-0.43.tar.gz
Download URL:http://kegel.com/crosstool/crosstool-0.43.tar.gz

2、需求下载的源代码(以制造arm-linux gcc-4.1.1为比如)
binutils-2.16.1.tar.bz2
Download URL:http://ftp.gnu.org/gnu/binutils/

glibc-2.3.2.tar.bz2
Download URL:http://ftp.gnu.org/gnu/glibc/

glibc-linuxthreads-2.3.6.tar.bz2
Download URL:http://ftp.gnu.org/gnu/glibc/

linux-2.6.25.tar.bz2
Download URL:http://ftp.kernel.org/pub/linux/kernel/v2.6/

gdb-6.5.tar.bz2
Download URL:http://ftp.gnu.org/gnu/gdb/

gcc-4.1.1.tar.bz2
Download URL:http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/

gcc-3.3.6.tar.bz2
Download URL:http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/

linux-libc-headers-2.6.12.0.tar.bz2
glibc-linuxthreads-2.3.2.tar.bz2

3、注意事项
您能够事前下载相关源代码到本地机器,也能够不必下载,由于在编译的时分,会主动下载相关的文件到本地文件夹。可是,那样的话,编译速度会很慢的。所以,这儿引荐事前将这些源代码给下载下来。
编译需求在非root用户下才能够进行。假如您是root用户,请您切换到普通用户形式。

4、操作流程
[test@localhost ~]$ echo $HOME
/home/test
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$

可见,当时用户为test,当时地点目录为/home/test。

[test@localhost ~]$ mkdir download crosstool-4.1.1
[test@localhost ~]$
创立download 和 crosstool-4.1.1文件夹;然后将下载好的源代码放置到download文件夹中。

[test@localhost ~]$ tar -zxvf crosstool-0.43.tar.gz
[test@localhost ~]$ cd crosstool-0.43
[test@localhost crosstool-0.43]$
解压crosstool-0.43,然后进入crosstool-0.43目录。

[test@localhost crosstool-0.43]$ vim demo-arm.sh
*********************************************

#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt

set -ex
#TARBALLS_DIR=$HOME/downloads
TARBALLS_DIR=/home/test/downloads
#RESULT_TOP=/opt/crosstool
RESULT_TOP=/home/test/crosstool-4.1.1
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES=”c,c++”
export GCC_LANGUAGES

…………

#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh –notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh –notest
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh –notest

echo Done.

*********************************************
修正TARBALLS_DIR和RESULT_TOP的值,一起增加句子“eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh –notest”。
TARBALLS_DIR:是下载的东西源码压缩包的寄存目录。
RESULT_TOP :是要生成的东西链的寄存目录,要有写权限的目录,否则无法编译。

[test@localhost crosstool-0.43]$ vim gcc-4.1.1-glibc-2.3.2.dat
*********************************************

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.25
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5

*********************************************
将“LINUX_DIR=LINUX_DIR=linux-2.6.15.4”修正为“LINUX_DIR=LINUX_DIR=linux-2.6.25”;

[test@localhost crosstool-0.43]$ vim arm.dat
*********************************************

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS=”-O”

*********************************************
将“TARGET=arm-unknown-linux-gnu”修正为“TARGET=arm-linux”

[test@localhost crosstool-0.43]$ ./demo-arm.sh
履行编译操作。生成的东西链在如下的方位:/home/test/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2,也便是咱们方才树立的crosstool-4.1.1文件夹中。

九:跋文
那些组合能够编译成功,能够参阅:http://kegel.com/crosstool/crosstool-0.43/buildlogs/表格

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/263055.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部