![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP | 芯片 | 客户评价 | 论坛 | | ||
|
||
|
|||||
| binutils-2.18/binutils/Makefile分析 | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-9-2 ![]() |
|||||
1 binutils/Makefile这个文件由主控Makefile调用configure脚本生成并执行make操作。要求生成的目标为all。 1.1 all在Makefile中的第一个目标就是all: $(MAKE) $(AM_MAKEFLAGS) all-recursive 再往下还有 all: info info目标是生成一些文档,在此不做分析,因此它将执行all-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子目录略过不做分析。当在binutils目录下执行all-recursive操作时,上述脚本转而执行all-am目标,因此下面转而分析all-am目标。这条规则定义为: all-am: Makefile $(PROGRAMS) config.h PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) bin_PROGRAMS = $(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8) \ $(am__EXEEXT_9) $(am__EXEEXT_10) $(am__EXEEXT_11) \ \ $(am__EXEEXT_12) $(am__EXEEXT_13) \ $(am__empty) noinst_PROGRAMS = $(am__EXEEXT_17) am__EXEEXT_1 = nlmconv$(EXEEXT) am__EXEEXT_2 = dlltool$(EXEEXT) am__EXEEXT_3 = windres$(EXEEXT) am__EXEEXT_4 = windmc$(EXEEXT) am__EXEEXT_5 = dllwrap$(EXEEXT) am__EXEEXT_6 = size$(EXEEXT) am__EXEEXT_7 = objdump$(EXEEXT) am__EXEEXT_8 = ar$(EXEEXT) am__EXEEXT_9 = strings$(EXEEXT) am__EXEEXT_10 = ranlib$(EXEEXT) am__EXEEXT_11 = objcopy$(EXEEXT) am__EXEEXT_12 = addr2line$(EXEEXT) am__EXEEXT_13 = readelf$(EXEEXT) am__EXEEXT_14 = nm-new$(EXEEXT) am__EXEEXT_15 = strip-new$(EXEEXT) am__EXEEXT_16 = cxxfilt$(EXEEXT) am__EXEEXT_17 = $(am__EXEEXT_14) $(am__EXEEXT_15) $(am__EXEEXT_16) 1.2 size$(EXEEXT)这条规则定义为: size$(EXEEXT): $(size_OBJECTS) $(size_DEPENDENCIES) @rm -f size$(EXEEXT) $(LINK) $(size_LDFLAGS) $(size_OBJECTS) $(size_LDADD) $(LIBS) 在目标生成后将它们链接为size.exe。 1.2.1 $(size_OBJECTS)这个变量定义为: size_OBJECTS = $(am_size_OBJECTS) am_size_OBJECTS = size.$(OBJEXT) $(am__objects_1) am__objects_1 = bucomm.$(OBJEXT) version.$(OBJEXT) filemode.$(OBJEXT) 因而有以下依赖关系: 1.2.1.1 size.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: size.o: size.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ bucomm.h 没什么,直接编译即可。 1.2.1.2 bucomm.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: bucomm.o: bucomm.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ $(INCDIR)/filenames.h $(BFDDIR)/libbfd.h $(INCDIR)/hashtab.h \ bucomm.h 没什么,直接编译即可。 1.2.1.3 version.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: version.o: version.c sysdep.h $(INCDIR)/ansidecl.h \ ../bfd/bfdver.h config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h \ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h bucomm.h 没什么,直接编译即可。 1.2.1.4 filemode.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: filemode.o: filemode.c sysdep.h $(INCDIR)/ansidecl.h \ ../bfd/bfdver.h config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h \ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h bucomm.h 没什么,直接编译即可。 1.2.2 $(size_DEPENDENCIES)这个变量定义为: size_DEPENDENCIES = $(LIBINTL_DEP) $(LIBIBERTY) $(BFDLIB) LIBINTL_DEP = LIBIBERTY = ../libiberty/libiberty.a BFDLIB = ../bfd/libbfd.la 所需要的目标均已生成,略过。 1.3 objdump$(EXEEXT)这条规则定义为: objdump$(EXEEXT): $(objdump_OBJECTS) $(objdump_DEPENDENCIES) @rm -f objdump$(EXEEXT) $(LINK) $(objdump_LDFLAGS) $(objdump_OBJECTS) $(objdump_LDADD) $(LIBS) 在目标生成后将它们链接为objdump.exe。 1.3.1 $(objdump_OBJECTS)这个变量定义为: objdump_OBJECTS = $(am_objdump_OBJECTS) am_objdump_OBJECTS = objdump.$(OBJEXT) dwarf.$(OBJEXT) prdbg.$(OBJEXT) \ $(am__objects_2) $(am__objects_1) am__objects_2 = rddbg.$(OBJEXT) debug.$(OBJEXT) stabs.$(OBJEXT) \ ieee.$(OBJEXT) rdcoff.$(OBJEXT) am__objects_1 = bucomm.$(OBJEXT) version.$(OBJEXT) filemode.$(OBJEXT) 其中am__objects_1定义的目标已经生成,故有以下依赖关系: 1.3.1.1 objdump.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: objdump.o: objdump.c sysdep.h $(INCDIR)/ansidecl.h \ ../bfd/bfdver.h config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h \ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/progress.h \ bucomm.h dwarf.h $(INCDIR)/safe-ctype.h $(INCDIR)/dis-asm.h \ ../bfd/bfd.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ $(INCDIR)/demangle.h $(INCDIR)/libiberty.h debug.h \ budbg.h $(INCDIR)/aout/aout64.h 没什么,直接编译即可。 1.3.1.2 dwarf.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: dwarf.o: dwarf.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \ $(INCDIR)/ansidecl.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h bucomm.h $(INCDIR)/elf/dwarf2.h \ dwarf.h 没什么,直接编译即可。 1.3.1.3 prdbg.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: prdbg.o: prdbg.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ $(INCDIR)/demangle.h $(INCDIR)/libiberty.h debug.h \ budbg.h 没什么,直接编译即可。 1.3.1.4 rddbg.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: rddbg.o: rddbg.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ bucomm.h debug.h budbg.h 没什么,直接编译即可。 1.3.1.5 debug.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: debug.o: debug.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ debug.h 没什么,直接编译即可。 1.3.1.6 stabs.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: stabs.o: stabs.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ $(INCDIR)/safe-ctype.h $(INCDIR)/demangle.h $(INCDIR)/libiberty.h \ debug.h budbg.h $(INCDIR)/filenames.h $(INCDIR)/aout/aout64.h \ $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def 没什么,直接编译即可。 1.3.1.7 ieee.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: ieee.o: ieee.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/ieee.h $(INCDIR)/libiberty.h \ $(INCDIR)/ansidecl.h debug.h budbg.h $(INCDIR)/filenames.h 没什么,直接编译即可。 1.3.1.8 rdcoff.$(OBJEXT)这个目标由通用规则完成: .c.o: $(COMPILE) -c $< 且有以下依赖关系: rdcoff.o: rdcoff.c sysdep.h $(INCDIR)/ansidecl.h ../bfd/bfdver.h \ config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h $(INCDIR)/coff/internal.h $(INCDIR)/libiberty.h \ $(INCDIR)/ansidecl.h bucomm.h debug.h budbg.h $(BFDDIR)/libcoff.h \ $(INCDIR)/bfdlink.h 没什么,直接编译即可。 1.3.2 $(objdump_DEPENDENCIES)这个变量定义为: objdump_DEPENDENCIES = $(LIBINTL_DEP) $(LIBIBERTY) $(BFDLIB) $(OPCODES) LIBINTL_DEP = LIBIBERTY = ../libiberty/libiberty.a BFDLIB = ../bfd/libbfd.la OPCODES = ../opcodes/libopcodes.la 1.4 ar$(EXEEXT)这条规则定义为: ar$(EXEEXT): $(ar_OBJECTS) $(ar_DEPENDENCIES) @rm -f ar$(EXEEXT) $(LINK) $(ar_LDFLAGS) $(ar_OBJECTS) $(ar_LDADD) $(LIBS) 在目标生成后将它们链接为objdump.exe。 1.4.1 $(ar_OBJECTS)这个变量定义为: am_ar_OBJECTS = arparse.$(OBJEXT) arlex.$(OBJEXT) ar.$(OBJEXT) \ not-ranlib.$(OBJEXT) arsup.$(OBJEXT) rename.$(OBJEXT) \ binemul.$(OBJEXT) emul_$(EMULATION).$(OBJEXT) $(am__objects_1) ar_OBJECTS = $(am_ar_OBJECTS) am__objects_1 = bucomm.$(OBJEXT) version.$(OBJEXT) filemode.$(OBJEXT) 其中am__objects_1定义的目标已经生成,故有以下依赖关系: 1.4.1.1 arparse.$(OBJEXT)这条规则定义为: arparse.o: $(COMPILE) -c $< $(NO_WERROR) 且有以下依赖关系: arparse.o: arparse.c sysdep.h $(INCDIR)/ansidecl.h \ ../bfd/bfdver.h config.h $(INCDIR)/fopen-same.h ../bfd/bfd.h \ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h arsup.h 没什么,直接编译即可。 1.4.1.2 arlex.$(OBJEXT) | |||||