交叉编译

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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-

相关文档
最新文档