搜索
bottom↓
回复: 88

给像我一样的新手,一套完整的ARM交叉编译环境的搭建过程

  [复制链接]

出0入0汤圆

发表于 2012-3-26 17:19:50 | 显示全部楼层 |阅读模式
在网上查看了不少资料,参考别人的,在加上一些自己遇到的问题结合的,内容直接转载过来了,给和我一样,刚入门ARM的新手的。虽然网上很多现成的,但是自己动手做作,还是很好的。
编译环境:

内核名称:Linux

内核发行版: 3.3.0-4.fc16.x86_64

内核版本:#1 SMP Tue Mar 20 18:05:40 UTC 2012         

硬件架构名称: x86_64

硬件平台:x86_64

操作系统:GNU/Linux

当前系统gcc版本号:4.6.3

在Linux中建立整个ARM交叉编译环境的整体过程为:

1、  下载源码包放在/mnt/hgfs/Document/

2、  建立编译目录并设置环境变量

3、  安装内核头文件

4、  安装二进制工具(binutils)

5、  建立初始编译器工具链(简版gcc)

6、  建立glibc库

7、  建立全套编译器工具链(full gcc)

8、  验证

一、下载源码包

GNU的所有源码文件都可以到这个地址下载:http://ftp.gnu.org/gnu/

Linux Kernel源代码可以去这里下载: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编译不过。
C 库我试用了很多的版本,只有这套组合才能编译成功
在后面编译的过程中会提示缺少头文件,去内核中找到cp里就可以了。

二、建立编译目录并设置环境变量



选定自己的工作目录,如我选择/opt/embedded作为自己的工作目录。然后再embedded中建立build-tools、kernel、tools三个文件夹。实例:

root@fedora:/opt/ming# cd /opt/

root@fedora:/opt# mkdir embedded

root@fedora:/opt# cd embedded/

root@fedora:/opt/embedded# mkdir build-tools kernel tools

root@fedora:/opt/embedded# cd build-tools/

root@fedora:/opt/embedded/build-tools# mkdir build-binutils build-boot-gcc build-glibc build-gcc

各文件夹的作用如下:

/opt/embedded:交叉编译环境的主目录



/opt/embedded/build-tools:存放binutils、gcc、glibc等GNU源码和用来编译这些源代码的目录



/opt/embedded/kernel:用来存放Linux内核源代码

/opt/embedded/tools:用来存放编译好的交叉编译工具和库文件

/opt/embedded/build-tools/build-binutils:编译binutils的目录

/opt/embedded/build-tools/build-boot-gcc:编译gcc启动部分的目录

/opt/embedded/build-tools/build-glibc:编译glibc的目录

/opt/embedded/build-tools/build-gcc:编译整个gcc的目录



建立好编译目录之后便是设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要重新运行Terminal)。如下:

export PRJROOT=/opt/embedded

export TARGET=arm-linux

export PREFIX=$PRJROOT/tools

export TARGET_PREFIX=$PREFIX/$TARGET

export PATH=$PREFIX/bin:$PATH

各个环境变量的意义如下:



PRJROOT:整个交叉编译环境的根目录

TARGET:目标文件对应的architecture,arm-linux表示编译出来的target只能在arm architecture中运行

PREFIX:目标文件夹的路径前缀

TARGET_PREFIX:目标文件夹的路径前缀路径

PATH:可执行文件路径,这里主要指定编译工具等



三、安装内核头文件

将Linux内核源码解压至$PRJROOT/kernel目录,然后建立几个文件的符号链接,最后生成version.h文件。实例:

首先解压Linux内核源文件



root@fedora:/opt/embedded/kernel# cp /mnt/hgfs/Document/linux-3.2.12.tar .

root@fedora:/opt/embedded/kernel# tar -xvf linux-3.2.12.tar

root@fedora:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux

root@fedora:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux/include

root@fedora:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-3.2.12/include/linux /opt/embedded/tools/arm-linux/include/linux

root@fedora:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-3.2.12/include/asm-generic /opt/embedded/tools/arm-linux/include/asm-generic

root@fedora:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-3.2.12/arch/arm/include/asm /opt/embedded/tools/arm-linux/include/asm (也可能是是asm-arm,示内核版本而定)



下面检查上面创建的符号链接是否正确。实例:

root@fedora:/opt/embedded/kernel# cd /opt/embedded/tools/arm-linux/include/

root@fedora:/opt/embedded/tools/arm-linux/include# ll

asm -> /opt/embedded/kernel/linux-3.2.12/arch/arm/include/asm/

asm-generic -> /opt/embedded/kernel/linux-3.2.12/include/asm-generic/

linux -> /opt/embedded/kernel/linux-3.2.12/include/linux/

有如上结果表示符号链接创建正确。

root@fedora:/opt/embedded/kernel/linux-3.2.12#make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig  *配置(注意:arm-linux- 与menuconfig之间有一个空格)*
//在随后出现的文本菜单进行配置、配置完退出并保存。若要设置某个选项,可将光标定位在该项上,按回车键。对于前面有[]或者<>的,可以按空格键显示所包含的子选项。
注意在选项System Types中选择正确的硬件类型。配置完退出并保存(Exit Yes)。


最后生成version.h文件。实例:

root@fedora:/opt/embedded/kernel/linux-3.2.12# cd /opt/embedded/kernel/linux-3.2.12/

root@fedora:/opt/embedded/kernel/linux-3.2.12# make include/linux/version.h

  CHK     include/linux/version.h

  UPD     include/linux/version.h



接着进入相应目录查看version.h文件是否建立成功。



注:上述的做法理论上没什么问题,但实际操作时,如果用其他版本的linux内核可能会出现头文件包含不全的情况,这会直接导致后面编译glibc时出现未定义、未声明、缺少头文件(如asm/unistd.h)的错误。如果可能的话,建议按上述操作直接copy好用的其他交叉编译工具链中的asm-arm、asm-generic、linux目录。



四、安装二进制工具(binutils)



Binutils是一些二进制工具集合,其中包含了常用的一些命令。首先将binutils-2.22.tar.bz2解压至build-tools,然后进入build-binutils目录,配置并编译binutils,最后使用make install进行安装。实例:

root@fedora:/opt/embedded/build-tools# cd /opt/embedded/build-tools/

root@fedora:/opt/embedded/build-tools# cp /mnt/hgfs/Document/binutils-2.22.tar.bz2 .

root@fedora:/opt/embedded/build-tools# tar -xjf binutils-2.22.tar.bz2

root@fedora:/opt/embedded/build-tools# cd build-binutils/

root@fedora:/opt/embedded/build-tools/build-binutils#../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX

root@fedora:/opt/embedded/build-tools/build-binutils# make

root@fedora:/opt/embedded/build-tools/build-binutils# make install



完成后,去$PREFIX中检查一下生成的工具。实例:

root@fedora:/opt/embedded/build-tools/build-binutils# cd /opt/embedded/tools/bin

root@fedora:/opt/embedded/tools/bin# ll

有如下文件:

arm-linux-addr2line*

arm-linux-ar*

arm-linux-as*

arm-linux-c++filt*

arm-linux-elfedit*

arm-linux-gprof*

arm-linux-ld*

arm-linux-ld.bfd*

arm-linux-nm*

arm-linux-objcopy*

arm-linux-objdump*

arm-linux-ranlib*

arm-linux-readelf*

arm-linux-size*

arm-linux-strings*

arm-linux-strip*



这些生成的文件的作用分别为:

arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息

arm-linux-ar:产生、修改和解开一个存档文件

arm-linux-as:GNU的汇编器

arm-linux-c++filt:C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt 就是实现这种反向的转化,根据标号得到函数名

arm-linux-elfedit:用途暂时未知

arm-linux-gprof:GNU汇编器预编译器

arm-linux-ld:GNU的连接器

arm-linux-ld.bfd:用途暂时未知

arm-linux-nm:列出目标文件的符号和对应的地址

arm-linux-objcopy:将某种格式的目标文件转化成另外格式的目标文件

arm-linux-objdump:显示目标文件的信息

arm-linux-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中

arm-linux-readelf:显示 elf 格式的目标文件的信息

arm-linux-size:显示目标文件各个节的大小和目标文件的大小

arm-linux-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4

arm-linux-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 -MT tc-arm.o -MD -MP -MF .deps/tc-arm.Tpo -c -o tc-arm.o `test -f 'config/tc-arm.c' || echo './'`config/tc-arm.c

cc1: warnings being treated as errors

config/tc-arm.c: In function ‘make_mapping_symbol’:

config/tc-arm.c:2489: 警告:if 语句体为空

make[4]: *** [tc-arm.o] 错误 1  // 排错要充分利用报错信息。

make[4]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[3]: *** [all-recursive] 错误 1

make[3]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[2]: *** [all] 错误 2

make[2]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[1]: *** [all-gas] 错误 2

make[1]: Leaving directory `/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@localhost binutils-2.20_cross_no_2]# ./configure --target=arm-linux --disable-werror && make

参考:http://hi.baidu.com/thinke365/bl ... 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目录,进行编译配置,然后make all-gcc并安装,最后make all-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 -xvf gcc-4.6.3.ta

root@fedora:/opt/embedded/build-tools# cd gcc-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 -xvf mpfr-2.4.2.tar.gz

root@fedora:/opt/embedded/build-tools/gcc-4.6.3# mv mpfr-2.4.2/ mpfr

root@fedora:/opt/embedded/build-tools/gcc-4.6.3# tar -xjf gmp-5.0.2.tar.bz2

root@fedora:/opt/embedded/build-tools/gcc-4.6.3# mv gmp-5.0.2/ gmp

root@fedora:/opt/embedded/build-tools/gcc-4.6.3# tar -xvf mpc-0.9.tar.gz

root@fedora:/opt/embedded/build-tools/gcc-4.6.3# mv mpc-0.9 mpc



这里需要修改一下编译配置文件:/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# make all-gcc

root@fedora:/opt/embedded/build-tools/build-boot-gcc# make install-gcc

root@fedora:/opt/embedded/build-tools/build-boot-gcc# make all-target-libgcc

root@fedora:/opt/embedded/build-tools/build-boot-gcc# make install-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 的辅助测试工具,用来分析和优化程序



六、建立glic库



Glibc是交叉编译环境的运行库。首先将glibc-2.13.tar解压至build-tools,然后将glibc-linuxthreads-2.3.6.tar解压至glibc源码所在目录,将glibc-ports-2.13.tar.gz解压至glibc源码所在目录,并重命名为ports。进入build-glibc文件夹,建立用于配置glibc的config.cache文件,然后配置并编译glibc,安装glibc,最后修改libc.so。实例:



root@fedora:/opt/embedded/build-tools# cd /opt/embedded/build-tools/

root@fedora:/opt/embedded/build-tools# cp /mnt/hgfs/Document/glibc-2.13.tar .

root@fedora:/opt/embedded/build-tools# tar -xvf glibc-2.13.tar

root@fedora:/opt/embedded/build-tools# cd glibc-2.13/

root@fedora:/opt/embedded/build-tools/glibc-2.13# cp /mnt/hgfs/Document/glibc-linuxthreads-2.3.6.tar .

root@fedora:/opt/embedded/build-tools/glibc-2.13# tar -xjf glibc-linuxthreads-2.3.6.tar

root@fedora:/opt/embedded/build-tools/glibc-2.13# cp /mnt/hgfs/Document/glibc-ports-2.13.tar.gz .

root@fedora:/opt/embedded/build-tools/glibc-2.13# tar -xvf glibc-ports-2.13.tar.gz

root@fedora:/opt/embedded/build-tools/glibc-2.13# mv glibc-ports-2.13/ ports

root@fedora:/opt/embedded/build-tools/glibc-2.13# cd ../build-glibc/



建立用于配置glibc的config.cache文件,文件内容为:

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_arm_tls=yes



注:在编译过程中可能会发现本应自动生成的posix/config-name.h并没有自动生成,找不到config-name.h这个文件。这个文件是用来编译uname的。暂时没办法让它自动生成,只好自己比照uname-a的信息建一个config-name.h文件:

在build-glibc目录下建立一个posix目录

# vim build-glibc/posix/config-name.h

在vim编辑器里输入:

/* This file is generated by ../scripts/config-uname.sh.  DO NOT EDIT.

   This is used only by the generic uname function for systems with no real

   uname call.  If this data is not correct, it does not matter much.  */

#ifdef config_name_h

#define config_name_h



#define UNAME_SYSNAME “Linux”   

#define UNAME_RELEASE “3.3.0-4.fc16.x86_64”

#define UNAME_VERSION “#1 SMP Tue Mar 20 18:05:40 UTC 2012”

#define UNAME_MACHINE “x86_64”



#endif /* config_name_h */



建立完成之后,便可以开始配置并编译glibc了,实例:

root@fedora:/opt/embedded/build-tools/build-glibc# (PATH=$PREFIX/bin:$PATH ) BUILD_CC="gcc" CC=$TARGET-gcc ../glibc-2.13/configure --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/

root@fedora:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make



编译出错:

1)checking for suffix of object files... configure: error: in `/opt/embedded/build-tools/build-glibc':

configure: error: cannot compute suffix of object files: cannot compile

See `config.log' for more details

## ----------- ##

## Core tests. ##

## ----------- ##



configure:2363: checking build system type

configure:2377: result: x86_64-unknown-linux-gnu

configure:2397: checking host system type

configure:2410: result: arm-unknown-linux-gnu

configure:2439: checking for arm-linux-gcc

configure:2466: result: arm-linux-gcc

configure:2735: checking for C compiler version

configure:2744: arm-linux-gcc --version >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -v >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -V >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -qversion >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2760: checking for suffix of object files

configure:2782: arm-linux-gcc -c conftest.c >&5

../glibc-2.13/configure: line 2784: arm-linux-gcc: command not found

configure:2786: $? = 127

configure: failed program was:

| /* confdefs.h */

| #define PACKAGE_NAME "GNU C Library"

| #define PACKAGE_TARNAME "c-library"

| #define PACKAGE_VERSION "(see version.h)"

| #define PACKAGE_STRING "GNU C Library (see version.h)"

| #define PACKAGE_BUGREPORT "glibc"

| #define PACKAGE_URL "http://www.gnu.org/software/c-library/"



解决方法:PATH=$PREFIX/bin:$PATH ../glibc-2.13/configure BUILD_CC="gcc" CC=arm-linux-gcc --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ ,在配置前面加上PATH=$PREFIX/bin:$PATH ,虽然你可能已加到bash.bashrc或/etc/profile,即将编译成的arm-linux-gcc设置了环境变量,用arm-linux-gcc -v检查发现已存在,但就是不好使,编译会报错(上述),故在配置前面加上此句。



2)[ALL ]     mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)

   [ALL ]     /[^

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...

在gen-sorted.awk第19行,出错,这是一个简单的错误,缺少了转义符

解决办法:

  查找一个看有没有类似的

  cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts

sed '/\^\//p' gen-sorted.awk -n

输出的则是存在语法错误的语句

可以直接用

sed -i 's/\^\//\^\\\//g' gen-sorted.awk

  这种方法不完善,后面的还是会出现错误。

网上搜了下,需要用/usr/bin/gawk 替换/usr/bin/mawk,即

   sudo apt-get install gawk

   cd /usr/bin

   sudo mv mawk mawk.bak

   sudo ln -s gawk mawk



3)../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S

找到如下行:

ENTRY(__default_sa_restorer)

在其下添加:

END(__default_sa_restorer)

找到如下行:

ENTRY(__default_rt_sa_restorer)

在其下添加:

END(__default_rt_sa_restorer)



4)继续make编译

root@fedora:/opt/embedded/build-tools/build-glibc# make

编译出错:

../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/unix/syscall-template.S

找到如下行:



#define T_PSEUDO(SYMBOL, NAME, N)                PSEUDO (SYMBOL, NAME, N)

在其上添加:

#define PSEUDO(name, syscall_name, args)   \

  .text;                                \

  ENTRY (name);                        \

    DO_CALL (syscall_name, args);         \

    cmn r0, $4096;

5)继续make编译

root@fedora:/opt/embedded/build-tools/build-glibc# make

编译出错:

allocatestack.c:247:33: 错误:‘TLS_DTV_UNALLOCATED’未声明(在此函数内第一次使用)

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/nptl/allocatestack.c

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/elf/dl-tls.c

分别在文件中的include后面添加:

#define TLS_DTV_UNALLOCATED      ((void *) -1l)

6)继续make编译

root@fedora:/opt/embedded/build-tools/build-glibc# make

编译出错:

/opt/embedded/tools/lib/gcc/arm-linux/4.6.3/../../../../arm-linux/bin/ld: cannot find -lgcc_eh

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# ln -s /opt/embedded/tools/lib/gcc/arm-linux/4.6.3/libgcc.a /opt/embedded/tools/lib/gcc/arm-linux/4.6.3/libgcc_eh.a

7)继续make编译

root@fedora:/opt/embedded/build-tools/build-glibc# make

编译出错:

../sysdeps/ieee754/dbl-64/s_fma.c:152:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fma.c

在文件中的include后面添加:

#define FE_TOWARDZERO 0xc00000

#define FE_INEXACT 16

8)继续make编译

root@fedora:/opt/embedded/build-tools/build-glibc# make

编译出错:

../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)

解决方法:

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fmaf.c

在文件中的include后面添加:

#define FE_TOWARDZERO 0xc00000

#define FE_INEXACT 16

9)继续make编译



root@fedora:/opt/embedded/build-tools/build-glibc# make

root@fedora:/opt/embedded/build-tools/build-glibc# make install_root=$TARGET_PREFIX prefix="" install



10)最后,修改libc.so便完成此步骤

root@fedora:/opt/embedded/build-tools/build-glibc# vi ../../tools/arm-linux/lib/libc.so

找到如下行:

GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) )

将其改为:

GROUP ( libc.so.6 libc_nonshared.a )





七、建立全套编译器(full gcc)



首先进入build-gcc目录,然后配置并编译full gcc,最后安装就完成了。实例:

root@fedora:/opt/embedded/build-tools/build-glibc# cd /opt/embedded/build-tools/build-gcc/

root@fedora:/opt/embedded/build-tools/build-gcc# ../gcc-4.6.3/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libgomp

root@fedora:/opt/embedded/build-tools/build-gcc# make

root@fedora:/opt/embedded/build-tools/build-gcc# make install

完成之后,$PREFIX/bin下又多了几个文件:

arm-linux-c++*

arm-linux-g++*

这些生成的文件的作用分别为:

arm-linux-g++:GNU的c++编译器

arm-linux-c++:等同于arm-linux-g++



八、验证

使用vim编写一个简单文件,这里以hello.c为例:

然后执行编译命令:

root@fedora:/opt/embedded/tmp# arm-linux-gcc -static hello.c –o hello

编译完成后验证最终编译出的文件。实例:

root@fedora:/opt/embedded/tmp# file hello

hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.0.0, not stripped

有如上输出表示编译ARM版本程序成功。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-3-26 17:27:45 | 显示全部楼层
好长,这ID也能注册了,果然很牛。

出0入0汤圆

发表于 2012-3-26 17:49:36 | 显示全部楼层
收藏一个,哪天想玩,再整整,谢谢

出100入143汤圆

发表于 2012-3-26 17:56:10 | 显示全部楼层
mark一下!

出0入0汤圆

发表于 2012-3-26 18:02:32 | 显示全部楼层
赚钱路过!

出0入0汤圆

发表于 2012-3-26 18:06:08 | 显示全部楼层
最好介绍一下 什么版本的核心 什么版本的库 究竟是怎么选择的,具体过程意义不一定大家都这样搞的

出0入4汤圆

发表于 2012-3-26 20:24:32 | 显示全部楼层
哈哈,这个过程锻练折腾能力。
头像被屏蔽

出0入0汤圆

发表于 2012-3-26 21:32:53 | 显示全部楼层
cool !

出0入0汤圆

发表于 2012-3-26 22:53:23 | 显示全部楼层
内核,编译工具用的都是最近的。
很好的一个帖子!
谢谢!

出0入0汤圆

 楼主| 发表于 2012-3-26 23:06:48 来自手机 | 显示全部楼层
kanprin 发表于 2012-3-26 17:27
好长,这ID也能注册了,果然很牛。

新论坛v5哈

出0入0汤圆

 楼主| 发表于 2012-3-26 23:09:49 来自手机 | 显示全部楼层
yirenonege 发表于 2012-3-26 18:06
最好介绍一下 什么版本的核心 什么版本的库 究竟是怎么选择的,具体过程意义不一定大家都这样搞的 ...

呃,,,我就想弄个最新环境的哈,编译器,内核什么的,只要能编译成功尽量用最新,而且每一步都写的很清楚了。

出0入0汤圆

 楼主| 发表于 2012-3-26 23:17:07 来自手机 | 显示全部楼层
sunliezhi 发表于 2012-3-26 20:24
哈哈,这个过程锻练折腾能力。

是啊,总会有些莫名其妙的问题,版本匹配才是最头疼的,有需要编译好的工具的吗?有需要的我传上来,直接移植到linux里就成。

出0入0汤圆

 楼主| 发表于 2012-3-26 23:19:42 来自手机 | 显示全部楼层
armok 发表于 2012-3-26 21:32
cool !

哈哈,阿莫来了,谢谢哈,会再接再厉的哈。

出0入0汤圆

发表于 2012-3-26 23:39:15 | 显示全部楼层
绝对经典,必须mark,学习ing

出0入0汤圆

发表于 2012-3-26 23:51:26 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-3-27 17:10:34 | 显示全部楼层
不错,很详细。      

出0入0汤圆

发表于 2012-3-27 17:45:05 来自手机 | 显示全部楼层
很详细,谢谢了。

出0入0汤圆

发表于 2012-3-27 18:32:31 | 显示全部楼层
我的做法是在友善下个包,解压,设置环境变量-ok

出0入0汤圆

发表于 2012-3-27 19:04:51 | 显示全部楼层
exilefox 发表于 2012-3-27 18:32
我的做法是在友善下个包,解压,设置环境变量-ok

- - 又碰到你了~~~
太给力了!

出0入0汤圆

发表于 2012-3-27 21:54:40 | 显示全部楼层
Mark 谢谢分享

出0入0汤圆

发表于 2012-3-27 22:52:35 | 显示全部楼层
收下了。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2012-4-1 21:56:26 | 显示全部楼层
牛啊,标记,以后用到

出0入0汤圆

发表于 2012-4-1 22:55:22 | 显示全部楼层
很实用,很适合入门者

出0入0汤圆

发表于 2012-4-1 23:27:04 | 显示全部楼层
这个好,先收藏,改天试下。

出0入0汤圆

发表于 2012-4-2 03:54:13 来自手机 | 显示全部楼层
果断收藏,改天试试

出0入0汤圆

发表于 2012-4-3 10:38:15 | 显示全部楼层
弱弱地问一下,以上所有命令都是自己手动输入的吗?

出0入0汤圆

 楼主| 发表于 2012-4-3 12:56:14 | 显示全部楼层
brahen 发表于 2012-4-3 10:38
弱弱地问一下,以上所有命令都是自己手动输入的吗?

其实还真没多少命令,大多数都是路径,其实路径可以不用输入这么繁琐的,只是为了通用性,所以才每次都打上完整路径的。。。你可以根据自己的情况输入路径用TAB辅助,就没多少了。

出0入0汤圆

发表于 2012-4-4 17:03:59 | 显示全部楼层
可以留着以后用了

出0入0汤圆

发表于 2012-4-5 21:52:20 | 显示全部楼层
就冲着当时自己制作编译环境的辛苦,这帖子得顶。

出0入0汤圆

发表于 2012-4-11 15:47:16 来自手机 | 显示全部楼层
必须顶,mark

出0入0汤圆

发表于 2012-4-12 13:00:48 | 显示全部楼层
谢谢楼主分享了。

出0入0汤圆

发表于 2012-4-12 13:26:03 | 显示全部楼层
顶,不错啊,不过这个过程很折腾人,第一次搞的话肯定搞得欲仙欲死的。
我当时折腾了2天多,差点想砸电脑了 .....

出90入372汤圆

发表于 2012-6-7 13:46:40 | 显示全部楼层
马渴!谢谢分享

出0入0汤圆

发表于 2012-6-7 21:26:46 | 显示全部楼层
复制啊粘贴,不解释

出0入0汤圆

发表于 2012-6-7 22:47:00 | 显示全部楼层
不错,赞一个

出0入0汤圆

 楼主| 发表于 2012-6-8 10:29:54 | 显示全部楼层
wzqq666 发表于 2012-6-7 21:26
复制啊粘贴,不解释

哥们,请仔细看帖子,不解释。说过转载了。

出0入0汤圆

发表于 2012-6-8 22:51:26 | 显示全部楼层
留步学习
头像被屏蔽

出0入0汤圆

发表于 2012-6-9 12:18:38 | 显示全部楼层
学习,本人也尝试过搭建,参考了一些书籍,没能凑效,不知按楼主的办法,行否?楼上的有验证过的吗?现在没时间和条件去试了。

出0入0汤圆

发表于 2012-6-9 17:21:10 | 显示全部楼层
太详细了,新人必顶之!

出0入0汤圆

发表于 2012-6-9 18:21:32 | 显示全部楼层
这个必须顶,弄个交叉编译环境真的能折腾死人的。

出0入0汤圆

发表于 2012-6-9 20:40:57 | 显示全部楼层
正在学这个,头都大了

出0入0汤圆

 楼主| 发表于 2012-6-9 22:10:25 | 显示全部楼层
waszyawcz 发表于 2012-6-9 12:18
学习,本人也尝试过搭建,参考了一些书籍,没能凑效,不知按楼主的办法,行否?楼上的有验证过的吗?现在没 ...

完全可行的,是我做出交叉编译环境后才发上来的。有改动也都写在上面饿了。

出0入0汤圆

发表于 2012-6-10 17:34:12 | 显示全部楼层
这个是好东西啊

出0入0汤圆

发表于 2012-6-10 18:37:55 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-6-10 19:38:36 | 显示全部楼层
记下了,谢楼主
头像被屏蔽

出0入0汤圆

发表于 2012-6-26 16:33:15 | 显示全部楼层
过几天就能用到,,

出0入0汤圆

发表于 2013-5-22 20:51:08 | 显示全部楼层
必须顶!

出0入0汤圆

发表于 2013-5-28 15:40:48 | 显示全部楼层
收下,正在自学

出0入0汤圆

发表于 2013-6-11 09:28:27 | 显示全部楼层
为什么我没经历那么多步骤就搞定了?

出0入4汤圆

发表于 2013-6-11 10:00:17 | 显示全部楼层
楼主,好样的!!!

出0入0汤圆

发表于 2013-6-12 08:44:11 | 显示全部楼层
个人看法:感觉搭建这个 cross toolchain 不是很适合初学者,等对Linux有个足够的了解弄能好点。

谢谢LZ分享,受教了!

出0入0汤圆

发表于 2013-7-16 09:00:11 | 显示全部楼层
mark一直想搞这个

出0入0汤圆

发表于 2013-7-16 09:34:39 | 显示全部楼层
ARM交叉编译环境的搭建过程,mark.

出0入0汤圆

发表于 2013-7-16 13:08:45 | 显示全部楼层
先顶后看

出0入0汤圆

发表于 2014-2-21 23:44:43 | 显示全部楼层
exilefox 发表于 2012-3-27 18:32
我的做法是在友善下个包,解压,设置环境变量-ok

我也是这样做的

出0入0汤圆

发表于 2014-2-22 00:13:27 | 显示全部楼层
MARK         

出0入0汤圆

发表于 2014-2-22 10:40:26 | 显示全部楼层
嗯,mark, thanks for sharing, good for newer

出0入0汤圆

发表于 2014-2-22 10:55:48 | 显示全部楼层
弱弱地问一句,这是做什么的?

出0入0汤圆

发表于 2014-3-11 11:54:21 | 显示全部楼层
本座到此宝地一游~

出0入0汤圆

发表于 2014-3-11 12:33:19 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2014-3-11 12:42:28 | 显示全部楼层
新手做这个中间肯定会遇到很多问题难以解决。顺利编译下来的可能性很小。
喝奶何须养奶牛。新手不如直接去用buildroot或者crosstool-ng自动化生成所需交叉工具链

出0入0汤圆

发表于 2014-3-11 12:42:48 | 显示全部楼层
感谢楼主分享  已收藏。。

出0入0汤圆

发表于 2014-3-17 06:40:22 | 显示全部楼层
收藏,

出0入0汤圆

发表于 2014-3-17 07:03:05 | 显示全部楼层
标记下            

出0入0汤圆

发表于 2014-3-17 13:16:28 | 显示全部楼层
编译了几次,每次都遇到了各种令人头疼的问题,最后决定直接用现成的了。先标记一下,有机会也跟着楼主学习自己编译一个交叉编译环境。希望楼主能够将编译好的交叉编译环境发上来,大家共享。这样就好了。

出0入0汤圆

发表于 2014-4-16 14:31:03 | 显示全部楼层
   顶一下

出0入0汤圆

发表于 2014-4-17 23:02:18 | 显示全部楼层
虽然是2012年的帖子,但以后也会学到Linux,楼主提供了不少好网站,给力!~

出0入0汤圆

发表于 2014-4-18 00:20:35 | 显示全部楼层
帮忙顶一下

出0入0汤圆

发表于 2014-4-21 23:15:21 | 显示全部楼层
这种东西,懒得自己做了,直接网上下个交叉编译工具完事。不过楼主的探索精神很赞,

出0入0汤圆

发表于 2014-4-25 21:43:18 | 显示全部楼层
mark                       

出0入0汤圆

发表于 2014-4-30 14:56:39 | 显示全部楼层
mark 必须要顶

出0入0汤圆

发表于 2014-5-5 09:36:36 | 显示全部楼层
今晚回去刚好需要安装,先收藏了

出0入0汤圆

发表于 2014-5-6 15:18:30 | 显示全部楼层
mark                                

出0入4汤圆

发表于 2016-2-23 11:20:53 | 显示全部楼层
mark,到时候估计用得上。

出0入0汤圆

发表于 2016-2-23 13:42:54 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-2-23 15:01:13 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-2-23 17:14:33 | 显示全部楼层
正好需要。谢谢。

出0入0汤圆

发表于 2016-2-23 19:01:46 | 显示全部楼层
why not cross-tools-ng  ?

出0入0汤圆

发表于 2016-2-23 21:18:42 | 显示全部楼层
学习了~~~~

出0入0汤圆

发表于 2016-2-23 21:28:06 | 显示全部楼层
新人会看不懂的...

出0入0汤圆

发表于 2016-2-23 21:56:48 | 显示全部楼层
非常有用,刚好在玩linux ,谢谢

出0入0汤圆

发表于 2016-2-24 14:29:08 | 显示全部楼层
先收藏,正在抽空学,谢谢楼主^_^

出0入0汤圆

发表于 2016-2-24 14:30:16 | 显示全部楼层
不错,学习一下

出0入0汤圆

发表于 2016-2-27 09:12:46 | 显示全部楼层
不错,思路清晰。适合初学者

出0入0汤圆

发表于 2016-9-28 20:13:50 | 显示全部楼层
zlzdsp 发表于 2014-3-11 12:42
新手做这个中间肯定会遇到很多问题难以解决。顺利编译下来的可能性很小。
喝奶何须养奶牛。新手不如直接去 ...

我这几天分别用crosstool-ng和buildroot工具制作,在编译过程中也遇到一些问题。。都不太好解决。。

出0入0汤圆

发表于 2016-9-28 20:54:34 | 显示全部楼层
楼主,你这个教程写的老好了,很精彩,一看就特专业。
看完第三行俺就庆幸俺们只会用 win到死,而且,有keil,VS,Ultraedit,ADS,CodeWarrior,Protel,Candence,Pads。。。
感谢上帝,哦,不对,感谢前辈们的辛苦付出,让俺们不用为了写单片机而挣扎着弄一坨一坨东东。
哈利路亚

出0入0汤圆

发表于 2016-9-28 21:15:51 | 显示全部楼层
不错 我需要

出0入0汤圆

发表于 2016-9-28 22:04:43 | 显示全部楼层
太酷了,留着

出0入0汤圆

发表于 2016-10-4 15:40:54 | 显示全部楼层
很长啊,楼主能写个主要流程,再把代码附件上不?这样大家很容易看.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 12:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表