BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #9011同步于 2010/6/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

Arm From Scratch-打造自己的交叉编译链

mybays
2010/6/28镜像同步4 回复
也许标题改为Cortex From Scratch或许更为合适. 上个月收到了台湾新唐公司航空邮寄来的几块Cortex-M0评估板,由于官方提供的是Keil ARM MDK和IAR编译工具,虽然网上针对Keil和IAR的破解工具一大堆.而且在Linux用VirtualBox虚拟机上的WindowsXP跑Keil4也没什么问题,而且VirtualBox的NONE-OSE版本对USB设备的支持特别好.但是,混了6,7年开源社区的我还是挺希望在Linux下用GNU工具来开发Cortex-M0. Cortex-M0的指令集和Cortex-M3的完全兼容.而且网上也有老外制作了GCC-4.4.0版本的Cortex-M3交叉编译链.但是官方的GCC只有GCC-4.5.0才支持Cortex-M0.不同的GCC版本和不同的Cortex构架间毕竟会有一些微妙的差异.所以我还是希望做一套针对Cortex-M0 thumb和thumb2指令集的GCC-4.5.0交叉编译链. 首先是准备源码,binutils,gcc,gdb,newlib这些是必须的,但是GCC-4.5.0的编译必须得需要MPC的支持,而MPC又依赖gmp和mpfr库. 这里是我从各个项目官方网站上下载的最新的源码: ee2d3e996e9a2d669808713360fa96f8 binutils-2.20.tar.bz2 ff27b7c4a5d5060c8a8543a44abca31f gcc-4.5.0.tar.bz2 21dce610476c054687b52770d2ddc657 gdb-7.1.tar.bz2 3dae127d4aa659d72f8ea8c0ff2a7a20 newlib-1.18.0.tar.gz 6bac6df75c192a13419dfd71d19240a7 gmp-5.0.1.tar.bz2 5b34aa804d514cc295414a963aedb6bf mpc-0.8.1.tar.gz f45bac3584922c8004a10060ab1a8f9f mpfr-3.0.0.tar.bz2 准备好源码后,剩下的就是环境准备和编译工作了,首先系统必须得有编译环境比如gcc,在Ubuntu下可以通过apt-get安装: sudo apt-get install curl flex bison libgmp3-dev libmpfr-dev autoconf texinfo build-essential texlive libncurses5-dev 剩下的步骤,由于手工编译要耗费大量的时间,所以就参考老外的脚本写了一个Makefile,只要把源码和Makefile放在同一目录,在当前目录下执行make,不出问题的话,根据你的CPU速度,1-3小时就能编译完成. Makefile: #此次主要是为Cortex-M0处理器制作交叉编译链,但这一套交叉编译链使用的是GCC-4.5.0,所以基本上能包括所有最新的ARM处理器了. TARGET= arm-cortex-eabi #目标目录为主目录下的arm-cortex-tools,可以修改为你想当作目标目录的任何目录 PREFIX=$(HOME)/arm-cortex-tools/ #由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录.当然,如果这些库没有其他用的话,放在/tmp/lib/里会更好. TEMP_PREFIX=$(HOME)/build-temp/ #编译时的线程数,一般为机器CPU核心的数目加1,比如我的CPU是T5500 Core 2 Duo Processor,有两个核心,所以这里的PROCS=3不用修改,如果你的CPU核心数只有1个,那么可以把这一项的值修改为2. PROCS=3 #以下下载的源码当前都为最新版本 #binutils,二进制文件处理工具集合. #下载地址:http://ftp.gnu.org/gnu/binutils/ BINUTILS_REV = 2.20 #GNU Compiler Collection,GNU编译器集合 #下载地址:http://gcc.parentinginformed.com/releases/ GCC_REV = 4.5.0 #下面是编译GCC-4.5.0的依赖库 #GNU Multiple Precision Arithmetic Library. #下载地址:ftp://ftp.gmplib.org/pub/ GMP_REV = 5.0.1 #C library for multiple-precision floating-point computations with correct rounding #下载地址http://www.mpfr.org/mpfr-current/ MPFR_REV = 3.0.0 #C library for the arithmetic of complex numbers with arbitrarily high precision and correct rounding of the result #下载地址:http://www.multiprecision.org/mpc/download/ MPC_REV = 0.8.1 #newlib是有redhat公司维护的,专门用在嵌入式开放上面的C语言库,具有很好的兼容性 #下载地址:ftp://sources.redhat.com/pub/newlib/ NEWLIB_REV = 1.18.0 NEWLIB_FLAGS="-ffunction-sections -fdata-sections -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -Os -fomit-frame-pointer -fno-unroll-loops -D__BUFSIZ__=256 -mabi=aapcs" #GNU Project debugger #下载地址:http://ftp.gnu.org/gnu/gdb/ GDB_REV = 7.1 all:prerequest install-deps install-cross prerequest: mkdir -p $(PREFIX)/bin mkdir -p $(TEMP_PREFIX) export PATH=$(PREFIX)/bin:$(PATH) sudo apt-get install curl flex bison libgmp3-dev libmpfr-dev autoconf texinfo build-essential texlive libncurses5-dev #依赖库 install-deps:gmp mpfr mpc #交叉编译部分 install-cross:cross-binutils cross-gcc cross-g++ cross-newlib cross-gdb #这里的gmp并不是交叉编译,而是作为编译gcc的支持库 gmp:gmp-$(GMP_REV).tar.bz2 tar -xvf $< mkdir -p build/gmp && cd build/gmp && \ pushd ../../gmp-* ; \ make clean; \ popd ; \ ../../gmp-*/configure --disable-shared --prefix=$(TEMP_PREFIX) && \ $(MAKE) -j$(PROCS) && \ $(MAKE) install mpfr:mpfr-$(MPFR_REV).tar.bz2 tar -xvf $< mkdir -p build/mpfr && cd build/mpfr && \ bushed ../../mpfr-* ; \ make clean ; \ popd ; \ ../../mpfr-*/configure LDFLAGS="-Wl,-search_paths_first" --disable-shared --prefix=$(TEMP_PREFIX) && \ $(MAKE) -j$(PROCS) all && \ $(MAKE) install mpc: mpc-$(MPC_REV).tar.gz gmp mpfr tar -xvf $< mkdir -p build/mpc && cd build/mpc && \ pushed ../../mpc-* ; \ make clean ; \ popd ; \ ../../mpc-*/configure --with-mpfr=$(TEMP_PREFIX)/lib --with-gmp=$(TEMP_PREFIX)/lib --prefix=$(TEMP_PREFIX); \ $(MAKE) -j$(PROCS) && \ $(MAKE) install #下面是交叉编译部分 cross-binutils: binutils-$(BINUTILS_REV).tar.bz2 tar -xvf $< mkdir -p build/binutils && cd build/binutils && \ pushd ../../binutils-* ; \ make clean ; \ popd ; \ ../../binutils-*/configure --prefix=$(PREFIX) --target=$(TARGET) --disable-nls --disable-werror && \ $(MAKE) -j$(PROCS) && \ $(MAKE) install cross-gcc:gcc-$(GCC_REV).tar.bz2 cross-binutils tar -xvf $< mkdir -p build/gcc && cd build/gcc && \ pushd ../../gcc-* ; \ make clean ; \ popd ; \ ../../gcc-*/configure --prefix=$(PREFIX) --target=$(TARGET) --enable-languages="c" --with-gnu-ld --with-gnu-as --with-newlib --disable-nls --disable-libssp --with-newlib --without-headers --disable-shared --disable-threads --disable-libmudflap --disable-libgomp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-libffi --enable-extra-sgxxlite-multilibs --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX) && \ $(MAKE) -j$(PROCS) && \ $(MAKE) install cross-newlib:newlib-$(NEWLIB_REV).tar.gz cross-binutils cross-gcc tar -xvf $< mkdir -p build/newlib && cd build/newlib && \ pushd ../../newlib-* ; \ make clean ; \ popd ; \ ../../newlib-*/configure --prefix=$(PREFIX) --target=$(TARGET) --disable-newlib-supplied-syscalls --disable-libgloss --disable-nls --disable-shared && \ $(MAKE) -j$(PROCS) CFLAGS_FOR_TARGET=$(NEWLIB_FLAGS) CCASFLAGS=$(NEWLIB_FLAGS) && \ $(MAKE) install cross-g++:gcc-$(GCC_REV).tar.bz2 cross-gcc cross-newlib tar -xvf $< mkdir -p build/g++ && cd build/g++ && \ pushd ../../gcc-* ; \ make clean ; \ popd ; \ ../../gcc-*/configure --prefix=$(PREFIX) --target=$(TARGET) --enable-languages="c++" --with-gnu-ld --with-gnu-as --with-newlib --disable-nls --disable-libssp --with-newlib --without-headers --disable-shared --disable-threads --disable-libmudflap --disable-libgomp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-libffi --enable-extra-sgxxlite-multilibs --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX) && \ $(MAKE) -j$(PROCS) && \ $(MAKE) install cross-gdb: gdb-$(GDB_REV).tar.bz2 tar -xvf $< mkdir -p build/gdb && cd build/gdb && \ pushd ../../gdb-* ;\ make clean ; \ popd ; \ ../../gdb-*/configure --prefix=$(PREFIX) --target=$(TARGET) --disable-werror && \ $(MAKE) -j$(PROCS) && \ $(MAKE) install .PHONY:clean clean: rm -fr build binutils-$(BINUTILS_REV) gcc-$(GCC_REV) gdb-$(GDB_REV) gmp-$(GMP_REV) mpc-$(MPC_REV) mpfr-$(MPFR_REV) newlib-$(NEWLIB_REV) Makefile结束. 编译完成后,在终端输入: $ export PATH=$HOME/arm-cortex-tools/bin:$PATH 然后进入Cortex的GCC例程,进行编译验证: mybays@spaceship:~/temp/cortex-m0/cortex-example$ ls example.lds Makefile start.c mybays@spaceship:~/temp/cortex-m0/cortex-example$ make arm-cortex-eabi-gcc -g -mcpu=cortex-m3 -mthumb start.c -nostartfiles -T example.lds -c -o start.o arm-cortex-eabi-ld -T example.lds start.o -o start.dbg arm-cortex-eabi-objcopy -O binary -S -R .note -R .comment start.dbg start.bin arm-cortex-eabi-objdump -t start.dbg > start.map mybays@spaceship:~/temp/cortex-m0/cortex-example$ file start.dbg start.dbg: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped 可以看到为cortex-m0做的交叉编译链cortex-m3也能使用. 其实,不知cortex-m3能用,其他的arm cpu都能够使用,通过查看arm-cortex-eabi-gcc --help-target的输出结果来看,这套编译链支持的arm构架有: Known ARM CPUs (for use with the -mcpu= and -mtune= options): cortex-m0, cortex-m1, cortex-m3, cortex-r4f, cortex-r4, cortex-a9, cortex-a8, cortex-a5, arm1156t2f-s, arm1156t2-s, mpcore, mpcorenovfp, arm1176jzf-s, arm1176jz-s, arm1136jf-s, arm1136j-s, arm1026ej-s, arm926ej-s, iwmmxt2, iwmmxt, xscale, arm1022e, arm1020e, arm10e, arm968e-s, arm966e-s, arm946e-s, arm9e, arm1020t, arm10tdmi, ep9312, arm940t, arm922t, arm920t, arm920, arm9tdmi, arm9, arm740t, arm720t, arm710t, arm7tdmi-s, arm7tdmi, strongarm1110, strongarm1100, strongarm110, strongarm, arm810, arm8, arm7dmi, arm7dm, arm7m, arm7500fe, arm7500, arm7100, arm710c, arm720, arm710, arm700i, arm700, arm70, arm7di, arm7d, arm7, arm620, arm610, arm600, arm60, arm6, arm3, arm250, arm2 Known ARM architectures (for use with the -march= option): iwmmxt2, iwmmxt, ep9312, armv7e-m, armv7-m, armv7-r, armv7-a, armv7, armv6-m, armv6t2, armv6zk, armv6z, armv6k, armv6j, armv6, armv5te, armv5e, armv5t, armv5, armv4t, armv4, armv3m, armv3, armv2a, armv2 附件为RAW格式的Makefile: 附件(5.7KB) Makefile
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
ssailing机器人#1 · 2010/6/29
顶 支持原创
guo机器人#2 · 2010/6/29
build tool chain是一件很讓人吐血的事 尤其是自己寫script或者makefile來build 之前build過for arm1176和cortex-A9的 深受其害...
lymickey机器人#3 · 2011/4/8
吐血+1: 为何这里不要编译glibc?
mybays机器人#4 · 2011/4/10
cortex-m3,不用glibc,用newlib. 【 在 lymickey 的大作中提到: 】 : 吐血+1: 为何这里不要编译glibc?