![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| binutils-2.18/bfd/Makefile分析 | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-9-1 ![]() |
|||||
1 bfd/Makefile这个文件由主控Makefile调用configure脚本生成并执行make操作。要求生成的目标为all。 1.1 all在Makefile中的第一个目标就是all: $(MAKE) $(AM_MAKEFLAGS) all-recursive all diststuff: info 因此它将首先生成info目标,再执行all-recursive这个目标。 info规则定义为: info: info-recursive 对于这两个目标的生成都是由RECURSIVE_TARGETS来完成的。 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" 在这段脚本中将分别进入各子目录并执行make xxx操作,xxx为-recusive目标的前面一部分。 doc 和po两个子目录略过不做分析。当在bfd目录下执行all-recursive操作时,上述脚本转而执行all-am目标,因此下面转而分析all-am目标。这条规则定义为: all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) config.h LIBRARIES = $(noinst_LIBRARIES) noinst_LIBRARIES = libbfd.a LTLIBRARIES = $(bfdlib_LTLIBRARIES) bfdlib_LTLIBRARIES = libbfd.la 看看libbfd.a的规则: stamp-lib: libbfd.la libtooldir=`$(LIBTOOL) --config | sed -n -e 's/^objdir=//p'`; \ if [ -f $$libtooldir/libbfd.a ]; then \ cp $$libtooldir/libbfd.a libbfd.tmp; \ $(RANLIB) libbfd.tmp; \ $(SHELL) $(srcdir)/../move-if-change libbfd.tmp libbfd.a; \ else true; fi touch stamp-lib libbfd.a: stamp-lib ; @true 因而实际工作都由libbfd.la完成,最后这段脚本将之复制为libbfd.a。 1.2 libbfd.la这条规则定义为: libbfd.la: $(libbfd_la_OBJECTS) $(libbfd_la_DEPENDENCIES) $(LINK) -rpath $(bfdlibdir) $(libbfd_la_LDFLAGS) $(libbfd_la_OBJECTS) $(libbfd_la_LIBADD) $(LIBS) 在生成所有的.o文件后,这段脚本将它们链接为libbfd.la文件。 1.2.1 bfd.h这个文件将先于.lo文件的生成,但是没查到为什么。奇怪得很,不知道是哪条依赖关系使用到了bfd.h。这个文件的生成由以下规则完成: BFD_H = bfd.h $(BFD_H): stmp-bfd-h ; @true stmp-bfd-h: bfd-in3.h rm -f bfd-tmp.h cp bfd-in3.h bfd-tmp.h $(SHELL) $(srcdir)/../move-if-change bfd-tmp.h $(BFD_H) rm -f bfd-tmp.h touch stmp-bfd-h 只是一个简单的复制操作而已。 1.2.2 $(libbfd_la_OBJECTS)这个变量定义为: am__objects_1 = archive.lo archures.lo bfd.lo bfdio.lo bfdwin.lo \ cache.lo coffgen.lo corefile.lo format.lo init.lo libbfd.lo \ opncls.lo reloc.lo section.lo syms.lo targets.lo hash.lo \ linker.lo srec.lo binary.lo tekhex.lo ihex.lo stabs.lo \ stab-syms.lo merge.lo dwarf2.lo simple.lo am_libbfd_la_OBJECTS = $(am__objects_1) libbfd_la_OBJECTS = $(am_libbfd_la_OBJECTS) 1.2.2.1 archive.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: archive.lo: archive.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \ $(INCDIR)/hashtab.h $(INCDIR)/aout/ar.h $(INCDIR)/aout/ranlib.h \ $(INCDIR)/safe-ctype.h 这里LTCOMPILE的定义为: LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) 它调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.2 archures.lo这条规则定义为: archures.lo: archures.c Makefile $(LIBTOOL) --mode=compile $(COMPILE) -c $(TDEFAULTS) $(srcdir)/archures.c 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.3 bfd.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: bfd.lo: bfd.c $(INCDIR)/filenames.h bfdver.h $(INCDIR)/libiberty.h \ $(INCDIR)/demangle.h $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h \ $(INCDIR)/bfdlink.h $(INCDIR)/hashtab.h $(INCDIR)/coff/internal.h \ $(INCDIR)/coff/sym.h libcoff.h libecoff.h $(INCDIR)/coff/ecoff.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.4 bfdio.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: bfdio.lo: bfdio.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.5 bfdwin.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: bfdwin.lo: bfdwin.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.6 cache.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: cache.lo: cache.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/libiberty.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.7 coffgen.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: coffgen.lo: coffgen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.8 corefile.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: corefile.lo: corefile.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.9 format.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: format.lo: format.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.10 init.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: init.lo: init.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.11 libbfd.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: libbfd.lo: libbfd.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.12 opncls.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: opncls.lo: opncls.c $(INCDIR)/filenames.h $(INCDIR)/objalloc.h \ $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.13 reloc.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: reloc.lo: reloc.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ $(INCDIR)/hashtab.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.14 section.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: section.lo: section.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/bfdlink.h 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.15 syms.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< 同时有以下依赖关系: syms.lo: syms.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/safe-ctype.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \ $(INCDIR)/aout/stab.def 直接调用libtool这个脚本,编译.c文件并生成同名的.o和.lo文件。 1.2.2.16 targets.lo这个目标的生成依赖于通用规则: .c.lo: $(LTCOMPILE) -c -o $@ $< | |||||