新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

        GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

        作者: 時間:2016-11-26 來源:網絡 收藏
      1. AFLAGS:=$(AFLAGS_DEBUG)-D__ASSEMBLY__$(CPPFLAGS)
      2. LDFLAGS+=$(PLATFORM_LDFLAGS)
      3. LDFLAGS_FINAL+=-Bstatic
      4. LDFLAGS_u-boot+=-T$(obj)u-boot.lds$(LDFLAGS_FINAL)
      5. ifneq($(CONFIG_SYS_TEXT_BASE),)
      6. LDFLAGS_u-boot+=-Ttext$(CONFIG_SYS_TEXT_BASE)
      7. endif
      8. LDFLAGS_u-boot-spl+=-T$(obj)u-boot-spl.lds$(LDFLAGS_FINAL)
      9. ifneq($(CONFIG_SPL_TEXT_BASE),)
      10. LDFLAGS_u-boot-spl+=-Ttext$(CONFIG_SPL_TEXT_BASE)
      11. endif
      12. #LocationofausableBFDlibrary,wherewedefine"usable"as
      13. #"builtfor${HOST},supports${TARGET}".Sensiblevaluesare
      14. #-Whencross-compiling:therootofthecross-environment
      15. #-Linux/ppc(native):/usr
      16. #-NetBSD/ppc(native):youlose...(mustextractthesefromthe
      17. #binutilsbuilddirectory,plusthenativeandU-Bootinclude
      18. #filesdontlikeeachother)
      19. #
      20. #Sofar,thisisusedonlybytools/gdb/Makefile.
      21. ifeq($(HOSTOS),darwin)
      22. BFD_ROOT_DIR=/usr/local/tools
      23. else
      24. ifeq($(HOSTARCH),$(ARCH))
      25. #native
      26. BFD_ROOT_DIR=/usr
      27. else
      28. #BFD_ROOT_DIR=/LinuxPPC/CDK#Linux/i386
      29. #BFD_ROOT_DIR=/usr/pkg/cross#NetBSD/i386
      30. BFD_ROOT_DIR=/opt/powerpc
      31. endif
      32. endif
      33. #########################################################################
      34. exportHOSTCCHOSTCFLAGSHOSTLDFLAGSPEDCFLAGSHOSTSTRIPCROSS_COMPILE
      35. ASLDCCCPPARNMSTRIPOBJCOPYOBJDUMPMAKE
      36. exportCONFIG_SYS_TEXT_BASEPLATFORM_CPPFLAGSPLATFORM_RELFLAGSCPPFLAGSCFLAGSAFLAGS
      37. #########################################################################
      38. #Allowboardstousecustomoptimizeflagsonaperdir/filebasis
      39. BCURDIR=$(subst$(SRCTREE)/,,$(CURDIR:$(obj)%=%))
      40. ALL_AFLAGS=$(AFLAGS)$(AFLAGS_$(BCURDIR)/$(@F))$(AFLAGS_$(BCURDIR))
      41. ALL_CFLAGS=$(CFLAGS)$(CFLAGS_$(BCURDIR)/$(@F))$(CFLAGS_$(BCURDIR))
      42. EXTRA_CPPFLAGS=$(CPPFLAGS_$(BCURDIR)/$(@F))$(CPPFLAGS_$(BCURDIR))
      43. ALL_CFLAGS+=$(EXTRA_CPPFLAGS)
      44. #The_DEPversionusesthe$
      45. #Seerules.mk
      46. EXTRA_CPPFLAGS_DEP=$(CPPFLAGS_$(BCURDIR)/$(addsuffix.o,$(basename$<)))
      47. $(CPPFLAGS_$(BCURDIR))
      48. $(obj)%.s:%.S
      49. $(CPP)$(ALL_AFLAGS)-o$@$<
      50. $(obj)%.o:%.S
      51. $(CC)$(ALL_AFLAGS)-o$@$<-c
      52. $(obj)%.o:%.c
      53. $(CC)$(ALL_CFLAGS)-o$@$<-c
      54. $(obj)%.i:%.c
      55. $(CPP)$(ALL_CFLAGS)-o$@$<-c
      56. $(obj)%.s:%.c
      57. $(CC)$(ALL_CFLAGS)-o$@$<-c-S
      58. #########################################################################
      59. #Ifthelistofobjectstolinkisempty,justcreateanemptybuilt-in.o
      60. cmd_link_o_target=$(if$(strip$1),
      61. $(LD)$(LDFLAGS)-r-o$@$1,
      62. rm-f$@;$(AR)rcs$@)
      63. #########################################################################

      64. 主要是一些變量和函數的定義,編譯鏈接的參數設置以及依賴規則.

        本文引用地址:http://www.104case.com/article/201611/321714.htm

        最后分析下make:

        [cpp]view plaincopy
        1. $(obj)include/autoconf.mk.dep:$(obj)include/config.hinclude/common.h
        2. @$(XECHO)Generating$@;
        3. set-e;
        4. :Generatethedependancies;
        5. $(CC)-xc-DDO_DEPS_ONLY-M$(CFLAGS)$(CPPFLAGS)
        6. -MQ$(obj)include/autoconf.mkinclude/common.h>$@
        7. $(obj)include/autoconf.mk:$(obj)include/config.h
        8. @$(XECHO)Generating$@;
        9. set-e;
        10. :Extracttheconfigmacros;
        11. $(CPP)$(CFLAGS)-DDO_DEPS_ONLY-dMinclude/common.h|
        12. sed-n-ftools/scripts/define2mk.sed>$@.tmp&&
        13. mv$@.tmp$@
        第一個是生成include/autoconf.mk的依賴文件

        第二個是根據include/config.h的文件內容,利用tools/scripts/define2mk.sed腳本將所有的CONFIG提取到autoconf.mk文件中

        終極目標是:ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map

        u-boot.srec也是根據u-boot用objcopy工具搞出來的,不知的什么作用

        u-boot.bin也是根據u-boot用objcopy工具搞出來的,最終燒寫的二進制bin檔

        System.map是符號列表

        [cpp]view plaincopy
        1. $(obj)u-boot.bin:$(obj)u-boot
        2. $(OBJCOPY)${OBJCFLAGS}-Obinary$<$@
        3. $(BOARD_SIZE_CHECK)
        4. ###################################################################################
        5. #要得到最后的u-boot.bin,必須得到u-boot.u-boot.bin是最后要燒寫到板子上的二進制bin檔
        6. #利用objcopy來得到這個二進制文件($@是規則的目標文件名,$<是規則的第一個依賴文件名)
        7. #調用BOARD_SIZE_CHECK
        8. ###################################################################################

        u-boot的依賴分析:
        $(obj)u-boot: depend
        $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
        $(GEN_UBOOT)


        u-boot 依賴depend $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
        然后用$(GEN_UBOOT)生成最后的u-boot,GEN_UBOOT就是用ld鏈接的過程


        a.看一下depend:
        depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE)
        $(obj)include/autoconf.mk
        $(obj)include/generated/generic-asm-offsets.h
        $(obj)include/generated/asm-offsets.h
        for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do
        $(MAKE) -C $$dir _depend ; done
        對$(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR)目錄生成depend依賴文件;
        而_depend是在rules.mk中定義的,利用CC的-M選項生成依賴文件.

        b.看一下$(SUBDIR_TOOLS):
        tools目錄

        c.看一下$(OBJS):
        $(OBJS): depend
        $(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
        看下$(if $(REMOTE_BUILD),$@,$(notdir $@))
        因為$(REMOTE_BUILD)為空,所以返回的是$(notdir $@)的值;
        因為$@指的是規則的目標,所以就是$(OBJS),而$(OBJS)就是arch/arm/cpu/arm920t/start.o
        notdir內嵌函數返回的文件名;所以返回start.o
        執行makc -C arch/arm/cpu/arm920t start.o

        d.$(LIBBOARD)
        $(LIBBOARD): depend $(LIBS)
        $(MAKE) -C $(dir $(subst $(obj),,$@))
        執行make -C board/samsung/smdk2410

        e.$(LIBS)
        $(LIBS): depend $(SUBDIR_TOOLS)
        $(MAKE) -C $(dir $(subst $(obj),,$@))
        進入到LIBS包含的很多目錄,執行make,生成很多.a文件.

        f.$(LDSCRIPT)
        $(LDSCRIPT): depend
        $(MAKE) -C $(dir $@) $(notdir $@)
        在前面找鏈接腳本時已然知曉LDSCRIPT就是arch/arm/cpu/u-boot.lds
        執行make -C arch/arm/cpu u-boot.lds 這個目錄沒有makefile,這什么意思?!!!

        g.$(obj)u-boot.lds
        $(obj)u-boot.lds: $(LDSCRIPT)
        $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@

        這些就是編譯uboot的規則,分析的比較粗糙,在移植的過程中肯定還會遇到各式各樣的問題,在移植過程中再進一步深入并修正.
        上一頁 1 2 3 4 下一頁

        關鍵詞: ARM匯編u-bootmakefilemkconfi

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 府谷县| 都兰县| 桐乡市| 左云县| 乌拉特前旗| 长子县| 阿图什市| 丰顺县| 桃园市| 隆回县| 北京市| 沂水县| 射洪县| 沈阳市| 张家界市| 甘谷县| 游戏| 大田县| 逊克县| 梁山县| 台前县| 吉安市| 连云港市| 遂昌县| 陈巴尔虎旗| 阜新市| 筠连县| 高密市| 翼城县| 格尔木市| 孟州市| 镇沅| 伊川县| 翁牛特旗| 万荣县| 和田市| 通河县| 洪江市| 广平县| 含山县| 偃师市|