网站公告列表

  没有公告

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

all: config.h

       $(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 $@ $<