交叉编译
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、基础知识
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-