目的:将zephyr搬到我的stm32F4 soc上。
移置当然是有个base,所以这里是stm32f1。第一步当然是cpu上电后执行的第一个命令。
找到镜像程序被cpu执行的第一条语句,那需要知道镜像文件的组成结构,
那么根据根目录下的Makefile,其指明编译zephyr镜像文件需要的链接脚本。
ifdef CONFIG_HAVE_CUSTOM_LINKER_SCRIPT
KBUILD_LDS := $(subst $(DQUOTE),,$(CONFIG_CUSTOM_LINKER_SCRIPT))
else
# Try a board specific linker file
KBUILD_LDS := $(srctree)/boards/$(BOARD_NAME)/linker.ld
# If not available, try an SoC specific linker file
ifeq ($(wildcard $(KBUILD_LDS)),)
KBUILD_LDS := $(srctree)/arch/$(ARCH)/soc/$(SOC_PATH)/linker.ld
endif
endif
CONFIG_CUSTOM_LINKER_SCRIPT=""中定义的优先级最高,接着使用board目录下的,最后使用arch目录下的链接文件。
目前stm32f1使用的文件是arch/arm/soc/st_stm32/stm32f1->include/arch/arm/cortex_m/scripts/linker.ld
而实际上知道了这个并没有什么用,你不知道镜像的第一条指令是由那条代码提供的。
仔细查看根目录的makefile,可以得到如下的参数设定:
quiet_cmd_create-lnk = LINK $@
cmd_create-lnk = \
( \
echo $(LDFLAGS_zephyr); \
echo "$(LINKFLAGPREFIX)-Map=$(O)/$(KERNEL_NAME).map"; \
echo "-L $(objtree)/include/generated"; \
echo "-u _OffsetAbsSyms -u _ConfigAbsSyms"; \
<span style="color:#003300;"><strong>echo "-e __start"; </strong></span> \
echo "$(LINKFLAGPREFIX)--start-group"; \
echo "$(LINKFLAGPREFIX)--whole-archive"; \
echo "$(KBUILD_ZEPHYR_APP)"; \
echo "$(LINKFLAGPREFIX)--no-whole-archive"; \
echo "$(KBUILD_ZEPHYR_MAIN)"; \
echo "$(objtree)/arch/$(ARCH)/core/offsets/offsets.o"; \
echo "$(LINKFLAGPREFIX)--end-group"; \
echo "$(LIB_INCLUDE_DIR) $(LINK_LIBS)"; \
) > $@
其中颜色突出的部分即为镜像文件的入口点&