<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2016-11-26 來源:網(wǎng)絡 收藏
        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. 主要是一些變量和函數(shù)的定義,編譯鏈接的參數(shù)設(shè)置以及依賴規(guī)則.

          本文引用地址:http://www.ex-cimer.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的依賴文件

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

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

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

          u-boot.bin也是根據(jù)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來得到這個二進制文件($@是規(guī)則的目標文件名,$<是規(guī)則的第一個依賴文件名)
          7. #調(diào)用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 $@)的值;
          因為$@指的是規(guī)則的目標,所以就是$(OBJS),而$(OBJS)就是arch/arm/cpu/arm920t/start.o
          notdir內(nèi)嵌函數(shù)返回的文件名;所以返回start.o
          執(zhí)行makc -C arch/arm/cpu/arm920t start.o

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

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

          f.$(LDSCRIPT)
          $(LDSCRIPT): depend
          $(MAKE) -C $(dir $@) $(notdir $@)
          在前面找鏈接腳本時已然知曉LDSCRIPT就是arch/arm/cpu/u-boot.lds
          執(zhí)行make -C arch/arm/cpu u-boot.lds 這個目錄沒有makefile,這什么意思??。。?br />
          g.$(obj)u-boot.lds
          $(obj)u-boot.lds: $(LDSCRIPT)
          $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@

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

          關(guān)鍵詞: ARM匯編u-bootmakefilemkconfi

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();