ARM编译器介绍
显然,执行# make smdk2410_config时,先执行unconfig目标,注意不指定输出目标时,obj,src变量均为空,unconfig下面的命令清理上一次执行make *_config时生成的头文件和makefile的包含文件。主要是include/config.h 和include/config.mk文件。 然后才执行命令 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 对于smdk2410_config而言,mkconfig主要做三件事: 在include文件夹下建立相应的文件(夹)软连接, #如果是ARM体系将执行以下操作: #ln -s arch-s3c24x0 asm-arm/arch 生成Makefile包含文件include/config.mk,内容很简单,定义了四个变量: ARCH = arm 生成include/config.h头文件,只有一行: /* Automatically generated - do not edit */ linux操作系统文章专题:linux操作系统详解(linux不再难懂) mkconfig脚本文件的执行至此结束,继续分析Makefile剩下部分。 3)包含include/config.mk,其实也就相当于在Makefile里定义了上面四个变量而已。 4) 指定交叉编译器前缀: ifeq ($(ARCH),arm)#这里根据ARCH变量,指定编译器前缀。 5)包含config.mk: #包含顶层目录下的config.mk,这个文件里面主要定义了交叉编译器及选项和编译规则 下面分析config.mk的内容: @包含体系,开发板,CPU特定的规则文件: ifdefARCH #指定预编译体系结构选项 ifdefBOARD #指定特定板子的镜像连接时的内存基地址,重要! @定义交叉编译链工具 @定义AR选项ARFLAGS,调试选项DBGFLAGS,优化选项OPTFLAGS 预处理选项CPPFLAGS,C编译器选项CFLAGS,连接选项LDFLAGS LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS) #指定了起始地址TEXT_BASE @指定编译规则: $(obj)%.s:%.S 回到顶层makefile文件: 6)U-boot需要的目标文件。 OBJS = cpu/$(CPU)/start.o # 顺序很重要,start.o必须放第一位 7)需要的库文件: LIBS = lib_generic/libgeneric.a LIBS := $(addprefix $(obj),$(LIBS)) 根据上面的include/config.mk文件定义的ARCH、CPU、BOARD、SOC这些变量。硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录及对应生成的库文件如下。
MKCONFIG 是顶层目录下的mkcofig脚本文件,后面五个是传入的参数。
#ln -s asm-arm asm
#ln -s proc-armv asm-arm/proc
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
#include config/smdk2410.h
CROSS_COMPILE = arm-linux-
endif
# load other configuration
include $(TOPDIR)/config.mk
sinclude $(TOPDIR)/$(ARCH)_config.mk# include architecture dependend rules
endif
ifdefCPU #定义编译时对齐,浮点等选项
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk# include CPUspecific rules
endif
ifdefSOC #没有这个文件
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk# include SoCspecific rules
endif
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk# include board specific rules
endif
# Include the make variables (CC, etc...)
#
AS= $(CROSS_COMPILE)as
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
CPP= $(CC) -E
AR= $(CROSS_COMPILE)ar
NM= $(CROSS_COMPILE)nm
STRIP= $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB= $(CROSS_COMPILE)RANLIB
$(CPP) $(AFLAGS) -o $@ $
$(obj)%.%.S
$(CC) $(AFLAGS) -c -o $@ $
$(obj)%.%.c
$(CC) $(CFLAGS) -c -o $@ $
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
.PHONY : $(LIBS)
board/smdk2410/ :库文件board/smdk2410/libsmdk2410.a
cpu/arm920t/ :库文件cpu/arm920t/libarm920t.a
cpu/arm920t/s3c24x0/ :库文件cpu/arm920t/s3c24x0/libs3c24x0.a
lib_arm/ :库文件lib_arm/libarm.a
include/asm-arm/ :下面两个是头文件。
include/configs/smdk2410.h
- RS232、RS485和RS422介绍与比较(12-14)
- ARM处理器模式介绍和模式切换(11-28)
- EZ-USB FX2单片机CY7C68013的特性介绍(10-15)
- MCS-51单片机的中央处理器CPU介绍(05-13)
- PIC12F683微控制器实验板介绍(11-10)
- 详细介绍用51单片机解密任何红外遥控器(10-23)
