GNUFreestanding(Naked)CARM交叉式开发设计自然环境
摘要: 0 来历在我的博闻 GNU ARM交叉式选编自然环境的构建与检测中,详尽解读了GNU ARM选编自然环境的建立与应用方式。具体开发设计中,立即应用选编語言写的编码通常非常少,尽在系统软...
在我的博闻 GNU ARM交叉式选编自然环境的构建与检测中,详尽解读了GNU ARM选编自然环境的建立与应用方式。具体开发设计中,立即应用选编語言写的编码通常非常少,尽在系统软件起动和特性规定极为严苛的情况下才用到到选编编码。在易读性、可扩展性、逻辑性表述工作能力层面,C語言的主要表现要比选编强过多,更是C語言的这类优点铸就了Unix全球,铸就了Linux在多种多样服务平台上圆满编译程序运作的开朗场景。
因此,在置入式开发设计行业,C語言是主要語言。在应用开发设计ARM上运作的程序以前,务必搭建一个功能强大的C交叉式编译程序自然环境。在博闻Freestanding C与交叉式编译程序器的转化成基本原理剖析中,论述了Freestanding C的定义和交叉式编译程序器搭建的基本原理。搭建一个详细的Hosted C交叉式编译程序器是一个非常繁杂的全过程,特别是在是针对GCC来讲,这一全过程也是填满艰辛艰险。以便防止新手挫败,大家从简易刚开始,先搭建一个Freestanding 的C交叉式编译程序器,随后写一个实际的C新项目来检测。
1 Freestanding C的搭建GCC新项目关键有几大作用,一是出示C,C++,Fortran等多种多样語言的前端开发(front end)编译程序器,也便是承担把高級語言编码汉语翻译成选编编码;二是做为全部开发设计自然环境的总通道,承担启用别的选编、连接专用工具,来操纵全部编译程序 选编 连接全过程。由此可见GCC自身其实不能单独工作中,务必依靠于外界出示的选编、连接等专用工具,而出示这种外界专用工具的最知名手机软件便是binutils。
<编译程序的全过程中,必须运作binutils出示的专用工具来开展检测,并依据检测結果来动态性操纵本身源代码编译程序。。 1.1 应用binutils搭建交叉式选编自然环境binutils的编译程序安裝详细 GNU ARM交叉式选编自然环境的构建与检测,文中已不反复描述。为有利于参照,只得出binutils的配备指令:
../binutils-2.27/configure --prefix=/home/smstong/ARM --target=arm-linux-gnueabihf
后边配备GCC时,必须出示与之彻底一致的配备主要参数才行。
1.2 应用GCC搭建Freestanding C交叉式编译程序自然环境 1.2.1官方网站免费下载GCC全新源代码包GCC的官方网站首页是software/gcc,它是GCC的绿本营,也是全部GNU的关键构件。
截止今日(-6.2.-6.2.0.tar.-6.2.0。
-6.2.0文档夹,实行./contrib/download_prerequisites脚本制作,这一脚本制作会全自动免费下载编译程序GCC务必的库isl,mpc,gmp,mpfr等。不知道道为什么GCC供免费下载的源代码包里不立即附加这好多个手机软件包,还非要让客户再次免费下载它。
别的的基本编译程序自然环境:当地GCC,GNU make,perl,awk,bash这些,也不在这里里唠叨了,一一样的用以开发设计的Linux服务器上面早已安裝好啦这种基本的开发设计自然环境。
1.2.2 配备安裝GCC新项目也是应用GNU autotools 管理方法编译程序全过程的,因此转化成它第一步务必是实行configure指令。与binutils一样,gcc也提议把搭建文件目录和源代码文件目录分离出来,因此在建一个文件目录名叫 build-gcc,随后进到这一文件目录开展全部搭建全过程。
mkdir build-gcc cd build-gcc ../gcc-6.2.0/configure --prefix=/home/smstong/ARM # 要与binutils配备时同样 --target=arm-linux-gnueabihf # 要与binutils配备时同样 --enable-languages=c # 只转化成C编译程序器 --without-headers # 不应用头文档 --disable-multilib # 不长成好几个库版本号 make all-gcc # 留意这里的总体目标是all-gcc,也便是freestanding C make install-gcc # 相对的安裝的也仅仅GCC
安裝进行之后,会发觉新生儿成的交叉式编译程序器 /home/smstong/ARM/bin/arm-linux-gnueabihf-gcc,同时也有一个硬连接在/home/smstong/ARM/arm-linux-gnueabihf/bin/gcc。实行以下指令检测:
[]$ ./arm-linux-gnueabihf-gcc -v 应用內建 specs。 COLLECT_GCC=./arm-linux-gnueabihf-gcc COLLECT_LTO_WRAPPER=/home/smstong/ARM/libexec/gcc/arm-linux-gnueabihf/6.2.0/lto-wrapper 总体目标:arm-linux-gnueabihf 配备为:../gcc-6.2.0/configure --prefix=/home/smstong/ARM/ --target=arm-linux-gnueabihf --enable-languages=c --without-headers --disable-multilib 进程实体模型:posix gcc 版本号 6.2.0 (GCC)2 检测自然环境
总体目标设备自然环境:
(1)硬件配置服务平台TQ2440开发设计板,Soc CPU为三星2440, ARM920T关键。
(2)Norflash配有u-boot,能够根据tfgtp免费下载程序到特定物理学运行内存详细地址并实行
(3)Nandflash配有Linux2.6系统软件,含有tftp顾客端专用工具。
开发设计服务器:
(1)Centos 7 PC设备
(2)配有tftp server,服务文件目录为/var/www/tftpboot/。
源代码文档构造:
├── Makefile ├── test.c ├── test.lds └── test.s
test.c
#define rGPBCON (*(volatile unsigned*)0x) #define rGPBDAT (*(volatile unsigned*)0x) #define rGPBUP (*(volatile unsigned*)0x) void init() /* 原始化led1 */ rGPBCON = ~(3 10); rGPBCON |= (1 10); rGPBUP = ~(1 5); /* 灭掉led1 */ rGPBDAT |= (1 5); return;
test.lds
ENTRY(init) SECTIONS { . = 0x; .text : { *(.text) *(.rodata) .data ALIGN(4): { *(.data) .bss ALIGN(4): { *(.bss)
Makefile
CC = arm-linux-gnueabihf-gcc LD = arm-linux-gnueabihf-ld OBJCPY = arm-linux-gnueabihf-objcopy all: test.bin sudo cp test.bin /var/lib/tftpboot/ test.bin: test $(OBJCPY) -O binary $ $@ test: test.o $(LD) --script=test.lds -o $@ $ test.o: test.c $(CC) -c $ .PHONY: clean clean: rm -rf *.o test test.bin2.2 编译程序连接表明
交叉式联接器默认设置的通道训话称之为_start,默认设置的编码段产业基地址为0x,转化成的exe文件文件格式为elf。而大家要想让程序在原装机上运作,必须编码段产业基地址为0x,文档文件格式为纯二进制镜像系统。这都可以以根据连接脚本制作轻轻松松进行。此外大家还手动式特定了程序通道点为init涵数。
根据Norflash里的u-boot把转化成的test.bin载入到物理学运行内存0x处并实行,会发觉LED1灯被灭掉。并且实行进行后全自动回到来到u-boot中。由于init()涵数的最终是return句子。
2.3 看一下编译程序器转化成的选编编码 < test.c -c 时,gcc会把正中间造成的选编编码文档掩藏,以便见到这一正中间文档,来转化成选编编码文档。arm-linux-gnueabihf-gcc -S test.c
所述指令会转化成test.s文档以下:
.eabi_attribute 18, 4 .file test.c .text .align 2 .global init .syntax unified .arm .fp .type init, %function init: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 1, uses_anonymous_args = 0 @ link register save eliminated. str fp, [sp, #-4]! add fp, sp, #0 ldr r2, .L2 ldr r3, .L2 ldr r3, [r3] bic r3, r3, #3072 str r3, [r2] ldr r2, .L2 ldr r3, .L2 ldr r3, [r3] orr r3, r3, #1024 str r3, [r2] ldr r2, .L2+4 ldr r3, .L2+4 ldr r3, [r3] bic r3, r3, #32 str r3, [r2] ldr r2, .L2+8 ldr r3, .L2+8 ldr r3, [r3] orr r3, r3, #32 str r3, [r2] sub sp, fp, #0 @ sp needed ldr fp, [sp], #4 bx lr .align 2 .word .word .word .size init, .-init .ident GCC: (GNU) 6.2.0 .section .note.GNU-stack, ,%progbits<转化成的选编编码,大家还可以学习培训GNU ARM选编的基本英语的语法。 4 Linux自然环境下Freestanding C程序检测案例
因为是Freestanding C自然环境,因此即便在Linux系统软件下,依然沒有能用的规范C库。而C語言又不可以立即实行软终断命令启用Linux的系统软件启用,这就造成实际操作系统软件出示的API彻底不能用!(选编語言反倒能够立即根据swi命令来启用系统软件API)由此可见在实际操作系统软件下,假如沒有C库,C語言压根没法对硬件配置开展实际操作,也也不将会操纵开发设计板上的LED灯,乃至都不能复印简易的hello world,它是何其的可悲!
以便有利于检测,大家不可不依靠选编的协助,选用C語言和选编語言混和程序编写的方法。在其中选编語言出示一个复印标识符串的涵数和一个撤出过程的涵数,C語言启用之。
实际上这就非常于自身用选编語言完成了一个非常简单化的POSIX系统软件启用C库。
C語言和选编开展相互启用,就务必要遵循相对的涵数启用标准,及APCS(ARM Process Call Standard),请大伙儿自主学习培训之。
新项目文档构造图:
├── api.h # api 头文档表明 ├── api.s # api 完成 ├── Makefile ├── test.c └── test.lds # 连接脚本制作,标示程序通道
文档 api.h
void print(int fd, char* msg, int len); int exit(int code);
文档api.s
void print(int fd, char* msg, int len); int exit(int code); .text .global print .global exit print: swi #0x900004 mov pc,lr exit: swi #0x900001 mov pc,lr
文档test.c
#include api.h void test() char* msg = hello, freestanding C int i; for (i = 0; i i++) { print(1, msg, 22); exit(0);
文档test.lds
ENTRY(test)
文档Makefile
CC = arm-linux-gnueabihf-gcc AS = arm-linux-gnueabihf-as LD = arm-linux-gnueabihf-ld OBJCPY = arm-linux-gnueabihf-objcopy all: test sudo cp test /var/lib/tftpboot/ test: test.o api.o $(LD) --script=test.lds -o $@ $^ test.o: test.c api.h $(CC) -c $ api.o: api.s $(AS) -o $@ $ .PHONY: clean clean: rm -rf *.o test4.2 编译程序连接表明
交叉式连接器默认设置转化成elf文件格式文档,能够立即被Linux载入实行。应是是Freestanding C,必须在连接脚本制作中特定程序通道点。
程序运行結果:
[ /]# tftp -g -r test 172.16.35.188 [ /]# ./test hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C hello, freestanding C5 对Freestanding C的思索
在原装机下,Freetanding C还行以根据指针的方法立即操纵一部分硬件配置資源;在OS下,全部硬件配置資源遭受实际操作系统软件的维护(根据MMU),Freestanding C压根没法单独操纵一切硬件配置。
因此在具体的开发设计中:
假如是原装机新项目,C库原本也不能用,Freestanding C是唯一可选择C自然环境,并且可以极致进行每日任务; 假如是根据OS的新项目,那麼Freestanding C工作能力不够,务必要有详细的Hosted C自然环境才可以担任(自然,还可以自身用选编写一个中小型C库,可是有现有的GLIBC,为什么要反复造车轮子呢?)。到现阶段才行,博闻 GNU ARM交叉式选编自然环境的构建与检测进行了ARM选编自然环境的构建,文中进行了Freestanding C 编译程序自然环境的构建,并得出了详尽的流程和运用案例。
下一步,便是在这里2个自然环境下多多的训练,等娴熟了,再刚开始构建最后的Hosted C详细开发设计自然环境。