网站公告列表

  没有公告

加入收藏
设为首页
联系本站
您现在的位置: AnalogCN安诺电子 >> 文章 >> 技术交流 >> 文章正文
  binutils-2.18/binutils/Makefile分析           ★★★ 【字体:
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

all: config.h

       $(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目标的前面一部分。

docpo子目录略过不做分析。当在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)