linux下编译arm-gcc的交叉编译总结

一、基础知识
1、交叉编译的概念
你的本机是linux,你的目标代码是STM32(arm指令的子集)
用linux系统的gcc1,编译一个gcc2,gcc1是linux本机的用于生成x86代码,gcc2本质是x86代码,但是gcc2生成的目标代码是stm32的代码。gcc2是一个干净的编译器,通常还需要集成一个newlib库,或者glibc库。生成gcc3
所以:gcc1是本机的gcc,gcc2是个没有实用价值的gcc(除非你有自己的库),gcc3是你真正需要的gcc。

2、编译的步骤
1、下载binutils
2、下载gcc,不建议下载gcc-core,下载包含全部的包。
3、下载newlib
4、下载linux内核,用gcc-core需要,下载gcc全部的包不需要,gcc全部的包,包含了头文件。建议下载gcc全部的包。这个是理由。
补充:头文件传奇。http://www.linuxsir.org/bbs/thread303531.html

5、编译binutils for arm 需要gcc1,即本机要有gcc环境
6、编译gcc for arm ,生成的是gcc2,需要gcc1
7、编译newlib ,使用的是gcc2。
8、再次编译gcc,同时使用嵌入newlib的参数。同样使用的是gcc2,这个时候生成的是gcc3,我们称为gcc with newlib。

3、2条说的gcc2和gcc3有什么区别
gcc2是一个干净的编译器,如果你的系统不需要使用任何标准的库文件或浮点运算,可以使用gcc2
比如在stm32里,你需要使用浮点运算,你需要自己写个浮点库,使用cos或sin等数学_运算,你同样需要自己去建立。就像一个汇编器,你什么都要自己建立。
gcc3是一个包含newlib的库,里面实现了一些基本功能,包括浮点运算,数学库,等等。这样你不需要重复造车。

4、arm编译器在gcc的一些概念
binutils+gcc+glibc = arm-linux-gcc 在以arm为处理器的linux系统
binutils+gcc+newlib = arm-elf-gcc 在以arm为处理器的裸系统
eabi = arm的fpu
none-eabi =arm无软件浮点,如stm32.

5、arm-linux-gcc和arm-elf-gcc有什么区别
在第2条编译步骤1到6相同,使用的库不同。
比如printf这个函数,在arm-linux-gcc里是调用linux内核的syscall。
而在arm-elf-gcc里需要将完整的printf函数编译进你的程序里。
所以arm-elf-gcc可以编译linux内核,生成linux操作系统,然后用arm-linux-gcc去生成基于linux的应用程序。

6、自己编译的arm-gcc有什么好处。
可以使用最新版本的gcc的功能。比如yagarto,winarm很久才更新,有的很久没更新了。

7、如果你看不懂,我就没办法了。建议你去直接下载yagarto,winarm,或cygwin armtoolschain。

二、编译经过
1、我使用的是debian linux.
首先下载一个gcc
用的是sudo apt-get install gcc4.4(这个就是上面说的gcc1)


2、下载binutils源代码,我使用的是binutils 2.20
在ftp://ftp.gnu.org/gnu/binutils下找

3、下载gcc源代码,我使用的是gcc4.5.1
在ftp://ftp.gnu.org/gnu/gcc下找
同时gcc-4.5.1需要gmp,mpfr,mpc库

4、下载newlib源代码,我使用的是newlib-1.18
在http://sourceware.org/newlib/ 网页上找。

好了现在开始编译过程
1、编译binutils
解压你下载的包。这个过程省略,本文假定你会使用一些linux基本操作。
(1)./configure
./configure --target=arm-none-eabi --prefix=/home/embedded/armelf/install/  --disable-nls --with-sysroot=/home/embedded/armelf/install/arm-none-eabi --enable-poison-system-directories

--target=arm-none-eabi 生成目标是arm工具的前缀,同时也会建立一个这样的目录,比如as,ld等会变成arm-none-eabi-as,arm-none-eabi-ld
--prefix=/home/embedded/armelf/install/ 生成的目标工具集存放的位置,如果你把它存到你/home/tools则改成--prefix=/home/tools/
--disable-nls 这里nls的意思是本地语言支持(Native Language Support)
--with-sysroot=/home/embedded/armelf/install/arm-none-eabi,如果你的目标目录是/home/tools,则改成--prefix=/home/tools/arm-none-eabi
--enable-poison-system-directories 我也不太清楚,照葫芦画瓢。

(2)make
(3) make install
这个过程没什么难,基本比较容易。

2、编译gcc,生成gcc2的过程
解压你下载的包。
(1)./configure
/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c --disable-shared --with-newlib --prefix=/home/embedded/armelf/install/ --disable-shared --disable-threads --disable-libssp --disable-libgomp --without-headers --with-newlib --disable-decimal-float --disable-libffi --enable-languages=c --with-sysroot=/home/embedded/armelf/install/arm-none-eabi --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/home/embedded/armelf/install/arm-none-eabi/bin/ --with-cpu=arm7tdmi
里面的disable和enable的一些参数可以自己查下。
目录的解释参考过程1的解释
(2)make
(3)make install
补充。要下载gmp,mpfr,mpc,是一些大整数用途的。gcc-4.5.1依赖这些包。这个过程可以提前进行
在ftp://gcc.gnu.org/pub/gcc/infrastructure目录下有这三个包。然后make make install
最后还要注意要使用ldconfig一下,让系统载入这三个动态库。


注意,现在生成的是gcc2,一个裸的gcc编译器。

3、编译newlib.
解压你下载的包。
(1)./configure
./configure --build=i686-pc-linux-gnu --target=arm-none-eabi --prefix=/home/embedded/armelf/install/ --host=i686-pc-linux-gnu --enable-newlib-io-long-long --disable-newlib-supplied-syscalls --disable-libgloss --disable-newlib-supplied-syscalls --disable-nls
参数的解释,自己上网查下,基本都是把一些不需要的功能个弄掉。以适用于嵌入式系统
(2)make
(3)make install
注意这个过程newlib 提示arm-none-eabi-cc找不到的错误。解决方法
用系统权限 ln -s /usr/bin/arm-none-eabi-cc /(你安装的位置)/arm-none-eabi/bin/arm-none-eabi-gcc

4、再次编译gcc,即我说的gcc3,包含newlib的。
(1)./configure
./configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-shared --with-newlib --prefix=/home/embedded/armelf/install/ --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/home/embedded/armelf/install/arm-none-eabi/bin/ --with-headers=/home/embedded/armelf/install/arm-none-eabi/include/ --with-libs="/home/embedded/armelf/install/arm-none-eabi/lib/" --with-cpu=arm7tdmi
注意目录和newlib的目录基本一次搞定。如果你到了这步:-)
(2) make
(3)make install

5、如果编译过程出错,建议看前面的基础知识,然后弄好你的目录,基本可以搞定。

你可能感兴趣的:(八方来文)