A major rewrite to move the bulk of the linker into BFD so that
authorIan Lance Taylor <ian@airs.com>
Thu, 30 Dec 1993 19:51:41 +0000 (19:51 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 30 Dec 1993 19:51:41 +0000 (19:51 +0000)
more efficient backend code can be written for specific object
files.
* lderror.c, lderror.h, ldindr.c, ldindr.h, ldsym.c, ldsym.h,
ldwarn.c, ldwarn.h, relax.c, relax.h: Removed.
* ldctor.c, ldctor.h: Complete rewrite.
* ldwrite.c, ldwrite.h: Complete rewrite.
* ld.h (strip_symbols_type, strip_symbols): Removed.  Use
link_info.strip instead.  Changed all uses.
(discard_locals_type, discard_locals): Removed.  Use
link_info.discard instead.  Changed all uses.
(ld_config_type): Removed relocateable_output field; use
link_info.relocateable instead; changed all uses.  Added stats
field.
(set_asymbol_chain, get_asymbol_chain, get_loader_symbol,
set_loader_symbol): Removed.
* ldexp.h (node_class): Added etree_rel.
(etree_type): Added rel field.
* ldexp.c (exp_print_token): Bracketed table initialization.
(exp_relop): New function.
(fold_name): Use linker hash table rather than ldsym functions.
(exp_fold_tree): Likewise.  Also, handle etree_rel case.
(exp_print_tree): Handle etree_rel.
* ldgram.y (strip_symbols, discard_locals): Removed.
(OPTION_stats, OPTION_no_keep_memory): New tokens.  Handle them.
(REL): New token.  Does not appear in grammar, but needed for
expression code.
(file): Don't call lang_final; it's called by main anyhow.
* ldlex.l: Accept -stats and -no-keep-memory options.
* ldlang.h (fill_type): Make unsigned int, not unsigned short.
* ldlang.c: Consistently use fill_type for fill argument.
(lang_init_script_file, script_file): Removed.
(create_object_symbols): Removed.  Use
link_info.create_object_symbols_section instead.  Changed all
uses.
(lang_add_keepsyms_file): Removed.
(lookup_name): Call bfd_link_add_symbols instead of
ldmain_open_file_read_symbol.
(wild): Don't iterate over script_file.
(open_output): Create link hash table.
(lang_place_undefineds): Rewrote.
(lang_size_sections): Handle relaxing (doesn't work yet).
(lang_relocate_globals): Removed.
(lang_finish): Use link hash table rather than ldsym functions.
(lang_common): Rewrote.
(lang_one_common): New function.
(ldlang_add_file): Add file to link_info.input_bfds list.  Set
usrdata.
(create_symbol): Removed.
(lang_process): Don't call lang_init_script_file.  Call
ldctor_build_sets rather than find_constructors.  Don't call
lang_relocate_globals.
(lang_abs_symbol_at_beginning_of): Rewrote.
(lang_abs_symbol_at_end_of): Rewrote.
* ldmain.c (had_y): Removed.
(lprefix, lprefix_len): Removed; use link_info fields instead.
Changed all uses.
(multiple_def_count, commons_pending, undefined_global_sym_count,
total_symbols_seen, total_files_seen): Removed.
(link_callbacks, link_info): New variables.
(main): Initialize link_info.  Don't call init_bfd_error_vector or
ldsym_init.  Don't set now unused variables.  Handle -stats.
(get_emulation): Removed obsolete and nonfunctional GNU960 code.
(add_ysym): Rewrote.
(read_entry_symbols, refize, enter_global_ref, enter_file_symbols,
search_library, gnu960_check_format, decode_library_subfile,
linear_library, symdef_library, clear_syms, subfile_wanted_p):
Removed.
(add_keepsyms_file, add_archive_element, multiple_definition,
multiple_common, add_to_set, warning_callback, undefined_symbol,
reloc_overflow, reloc_dangerous, unattached_reloc, notice_ysym):
New functions.
* ldmisc.c (vfinfo): Accept a string for %T, not a symbol.  Don't
require symbols for %C; look them up instead.
* emultempl/hppaosf.em: Pass link_info to
hppa_look_for_stubs_in_section.
* Makefile.in: Rebuilt dependencies.
(CFILES): Removed lderror.c, ldindr.c, ldsym.c, ldwarn.c, and
relax.c.
(HFILES): Removed lderror.h, ldindr.h, ldsym.h, ldwarn.h, and
relax.h.
(EMULATION_OFILES): Depend on bfdlink.h, ldmain.h, ldexp.h,
ldlang.h and ldctor.h.

* Makefile.in (ldlex.c): Don't depend on ldgram.h.  Remove
declarations of free and malloc from flex output.  Change malloc
to ldmalloc in flex output.

ld/ChangeLog
ld/Makefile.in
ld/emultempl/hppaosf.em
ld/emultempl/m88kbcs.em
ld/ldemul.c
ld/ldgram.y
ld/ldwrite.c

index 7f0632f..ece9172 100644 (file)
@@ -1,3 +1,110 @@
+Thu Dec 30 13:01:43 1993  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
+
+       A major rewrite to move the bulk of the linker into BFD so that
+       more efficient backend code can be written for specific object
+       files.
+       * lderror.c, lderror.h, ldindr.c, ldindr.h, ldsym.c, ldsym.h,
+       ldwarn.c, ldwarn.h, relax.c, relax.h: Removed.
+       * ldctor.c, ldctor.h: Complete rewrite.
+       * ldwrite.c, ldwrite.h: Complete rewrite.
+       * ld.h (strip_symbols_type, strip_symbols): Removed.  Use
+       link_info.strip instead.  Changed all uses.
+       (discard_locals_type, discard_locals): Removed.  Use
+       link_info.discard instead.  Changed all uses.
+       (ld_config_type): Removed relocateable_output field; use
+       link_info.relocateable instead; changed all uses.  Added stats
+       field.
+       (set_asymbol_chain, get_asymbol_chain, get_loader_symbol,
+       set_loader_symbol): Removed.
+       * ldexp.h (node_class): Added etree_rel.
+       (etree_type): Added rel field.
+       * ldexp.c (exp_print_token): Bracketed table initialization.
+       (exp_relop): New function.
+       (fold_name): Use linker hash table rather than ldsym functions.
+       (exp_fold_tree): Likewise.  Also, handle etree_rel case.
+       (exp_print_tree): Handle etree_rel.
+       * ldgram.y (strip_symbols, discard_locals): Removed.
+       (OPTION_stats, OPTION_no_keep_memory): New tokens.  Handle them.
+       (REL): New token.  Does not appear in grammar, but needed for
+       expression code.
+       (file): Don't call lang_final; it's called by main anyhow.
+       * ldlex.l: Accept -stats and -no-keep-memory options.
+       * ldlang.h (fill_type): Make unsigned int, not unsigned short.
+       * ldlang.c: Consistently use fill_type for fill argument.
+       (lang_init_script_file, script_file): Removed.
+       (create_object_symbols): Removed.  Use
+       link_info.create_object_symbols_section instead.  Changed all
+       uses.
+       (lang_add_keepsyms_file): Removed.
+       (lookup_name): Call bfd_link_add_symbols instead of
+       ldmain_open_file_read_symbol.
+       (wild): Don't iterate over script_file.
+       (open_output): Create link hash table.
+       (lang_place_undefineds): Rewrote.
+       (lang_size_sections): Handle relaxing (doesn't work yet).
+       (lang_relocate_globals): Removed.
+       (lang_finish): Use link hash table rather than ldsym functions.
+       (lang_common): Rewrote.
+       (lang_one_common): New function.
+       (ldlang_add_file): Add file to link_info.input_bfds list.  Set
+       usrdata.
+       (create_symbol): Removed.
+       (lang_process): Don't call lang_init_script_file.  Call
+       ldctor_build_sets rather than find_constructors.  Don't call
+       lang_relocate_globals.
+       (lang_abs_symbol_at_beginning_of): Rewrote.
+       (lang_abs_symbol_at_end_of): Rewrote.
+       * ldmain.c (had_y): Removed.
+       (lprefix, lprefix_len): Removed; use link_info fields instead.
+       Changed all uses.
+       (multiple_def_count, commons_pending, undefined_global_sym_count,
+       total_symbols_seen, total_files_seen): Removed.
+       (link_callbacks, link_info): New variables.
+       (main): Initialize link_info.  Don't call init_bfd_error_vector or
+       ldsym_init.  Don't set now unused variables.  Handle -stats.
+       (get_emulation): Removed obsolete and nonfunctional GNU960 code.
+       (add_ysym): Rewrote.
+       (read_entry_symbols, refize, enter_global_ref, enter_file_symbols,
+       search_library, gnu960_check_format, decode_library_subfile,
+       linear_library, symdef_library, clear_syms, subfile_wanted_p):
+       Removed.
+       (add_keepsyms_file, add_archive_element, multiple_definition,
+       multiple_common, add_to_set, warning_callback, undefined_symbol,
+       reloc_overflow, reloc_dangerous, unattached_reloc, notice_ysym):
+       New functions.
+       * ldmisc.c (vfinfo): Accept a string for %T, not a symbol.  Don't
+       require symbols for %C; look them up instead.
+       * emultempl/hppaosf.em: Pass link_info to
+       hppa_look_for_stubs_in_section.
+       * Makefile.in: Rebuilt dependencies.
+       (CFILES): Removed lderror.c, ldindr.c, ldsym.c, ldwarn.c, and
+       relax.c.
+       (HFILES): Removed lderror.h, ldindr.h, ldsym.h, ldwarn.h, and
+       relax.h.
+       (EMULATION_OFILES): Depend on bfdlink.h, ldmain.h, ldexp.h,
+       ldlang.h and ldctor.h.
+
+       * Makefile.in (ldlex.c): Don't depend on ldgram.h.  Remove
+       declarations of free and malloc from flex output.  Change malloc
+       to ldmalloc in flex output.
+
+Thu Dec 16 21:19:57 1993  Jeffrey A. Law  (law@snake.cs.utah.edu)
+
+       * ldmain.c (lprefix): Change default from a char to a string
+       with only one character.
+       (lprefix_len): Set default to one.
+
+       * ldmain.h (lprefix_len): Declare.
+
+       * ldsym.c (write_file_locals): Use strncmp rather than a character
+       comparison for lprefix.
+
+       * emultmpl/m88kbcs.em (before_parse): Set lprefix and lprefix_len
+       correctly.
+
+       * emultmpl/hppaosf.em: Include ldexp.h.
+       (before_parse): Set lprefix and lprefix_len correctly.
+
 Tue Dec 14 17:19:03 1993  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
        * ldlex.h: Don't declare yywrap if it is a macro.
index a578f3b..332d47f 100644 (file)
@@ -1,5 +1,5 @@
 # Makefile for the GNU linker ld (version 2)
-# Copyright (C) 1989-1993 Free Software Foundation, Inc.
+# Copyright (C) 1989,1990,1991,1992,1993 Free Software Foundation, Inc.
 
 # This file is part of GNU ld..
 
@@ -47,8 +47,6 @@ docdir = $(datadir)/doc
 # directives need to be different for native and cross linkers.
 scriptdir = $(tooldir)/lib
 
-gcclibdir = $(libdir)/gcc/$(target_alias)
-
 SHELL = /bin/sh
 
 INSTALL = `cd $(srcdir); pwd`/../install.sh -c
@@ -67,9 +65,6 @@ CC_FOR_BUILD=$(CC)
 BISON = `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../bison/bison ; else echo bison -y ; fi`
 LEX = `if [ -f ../flex/flex ] ; then echo ../flex/flex ;  else echo flex ; fi`
 
-#version=/`./../gcc/gcc -dumpversion`
-version=
-
 # Seach path to override the default search path for -lfoo libraries.
 # If LIB_PATH is empty, the ones in the script (if any) are left alone.
 # (The default is usually /lib:usr/lib:/usr/local/lib, unless building
@@ -86,6 +81,7 @@ BASEDIR = $(srcdir)/..
 BFDDIR = $(BASEDIR)/bfd
 INCDIR = $(BASEDIR)/include
 INCLUDES = -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR)
+DEP = mkdep
 
 # What version of the manual to build
 DOCVER = gen
@@ -136,7 +132,13 @@ RUNTEST_CXX = `if [ -f ../gcc/xgcc ] ; then \
 RUNTEST_CXX = $(CXX)
 RUNTEST_CXXFLAGS = $(CXXFLAGS)
 
-all:
+# go directly to ld.new in case this ld isn't capable of
+# linking native object on this host.  It can be renamed on
+# install.
+LD_PROG        = ld.new
+
+all: $(LD_PROG)
+.PHONY: all
 
 ### Host, target, and site specific Makefile fragments come in here.
 ####
@@ -150,16 +152,13 @@ LINTFLAGS =  $(INCLUDES) $(EXTRA_DEF)
 # Suppress smart makes who think they know how to automake Yacc files
 .y.c:
 
+# This rule is used for the check-cdtest target.
 .cc.o:
        $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(CFLAGS) $<
 
+ALL_CFLAGS=$(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) $(CFLAGS)
 .c.o:
-       $(CC) -c $(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) $(CFLAGS) $<
-
-# go directly to ld.new in case this ld isn't capable of
-# linking native object on this host.  It can be renamed on
-# install.
-LD_PROG        = ld.new
+       $(CC) -c $(ALL_CFLAGS) $<
 
 # for self hosting
 BFDLIB = ../bfd/libbfd.a
@@ -172,42 +171,33 @@ ALL_EMULATIONS=em_lnk960.o em_sun3.o em_i386aout.o em_go32.o \
        em_vanilla.o em_i386coff.o em_z8ksim.o em_mipslit.o em_i386bsd.o \
        em_mipsbig.o em_mipsbsd.o em_mipsidt.o em_vax.o em_h8500.o \
        em_hppaosf.o em_mipsidtl.o em_sh.o em_elf_i386.o em_alpha.o \
-       em_i386lynx.o em_m68klynx.o em_sparclynx.o \
+       em_i386lynx.o em_m68klynx.o em_sparclynx.o em_coff_sparc.o \
        $(OTHER_EMULATIONS)
 
 # This is now set by configure.in.
 #EMULATION_OFILES=${ALL_EMULATIONS}
 
-OFILES= ldgram.o ldlex.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldindr.o \
-       ldwarn.o ldwrite.o ldexp.o  ldemul.o ldver.o ldmisc.o ldsym.o \
-       ldfile.o relax.o  lderror.o ${EMULATION_OFILES}
-
-HEADERS=config.h ldmain.h ldmain.h ldwarn.h ldmisc.h ldindr.h \
-       ldsym.h ldctor.h ldlang.h ldexp.h \
-       ldlex.h ldwrite.h ldver.h ldemul.h ldfile.h ldgram.h ld.h
-
-MANSOURCES=ld.tex
-
-LDCSOURCES=ldlang.c lexsup.c ldctor.c mri.c ldindr.c ldmain.c ldwrite.c ldwarn.c ldlnk960.c \
-       em_gld.c em_sun3.c em_go32.c em_m88k.c em_ebmon29k.c em_hppaosf.c \
-       ldgld960.c ldemul.c ldver.c ldmisc.c ldexp.c ldsym.c ldfile.c \
-       relax.c lderror.c
+CFILES= ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
+       ldmain.c ldmisc.c ldver.c ldwrite.c lexsup.c \
+       mri.c
 
-GENERATED_SOURCES=ldgram.c ldlex.c em_*.c ldemul-list.h
-GENERATED_HEADERS=ldgram.h ldemul-list.h
+HFILES=        config.h ld.h ldctor.h ldemul.h ldexp.h ldfile.h \
+       ldlang.h ldlex.h ldmain.h ldmisc.h ldver.h \
+       ldwrite.h mri.h
 
-LDSOURCES=$(LDCSOURCES) ldgram.y ldlex.l ldgram.h
+GENERATED_CFILES= ldgram.c ldlex.c
+GENERATED_HFILES= ldgram.h ldemul-list.h
 
-BFDSOURCES=../../bfd/common/*.c
+OFILES= ldgram.o ldlex.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o \
+       ldwrite.o ldexp.o  ldemul.o ldver.o ldmisc.o \
+       ldfile.o ${EMULATION_OFILES}
 
-SOURCES= $(LDSOURCES) $(BFDSOURCES)
-LINTSOURCES=   $(LDCSOURCES) $(BFDSOURCES) $(GENERATED_SOURCES)
+LINTSOURCES= $(CFILES) $(GENERATED_CFILES) em_*.c
 
-STAGESTUFF = *.o ldscripts/* $(GENERATED_SOURCES) $(GENERATED_HEADERS)
-
-all: $(LD_PROG)
+STAGESTUFF = *.o ldscripts/* em_*.c $(GENERATED_CFILES) $(GENERATED_HFILES)
 
 info: ld.info
+.PHONY: info
 
 ldgram.h ldgram.c: ldgram.y
        $(BISON) $(BISONFLAGS) -d $(srcdir)/ldgram.y
@@ -215,23 +205,15 @@ ldgram.h ldgram.c: ldgram.y
        mv -f y.tab.h ldgram.h
 
 # EMUL is the name of a file in the emulparams subdir, without the .sh.
-DEF_EMUL = ` if [ -z "$(EMUL)" ] ; then \
-              echo "you must set a default emulation" 1>&2 ; \
-              exit 1 ; \
-            else \
-              echo -DDEFAULT_EMULATION='"$(EMUL)"' ; \
-             fi`
-
-ldmain.o: ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h config.h ld.h \
-  ldmain.h ldmisc.h ldwrite.h ./ldgram.h \
-  ldsym.h ldlang.h ldemul.h ldlex.h \
-  ldfile.h ldindr.h ldwarn.h ldctor.h \
-  lderror.h 
-       $(CC) -c $(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) $(DEF_EMUL) -DSCRIPTDIR='"$(scriptdir)"' $(CFLAGS) $<
-
-ldemul-list.h: Makefile
+ldmain.o: ldmain.c config.status
+       if [ -z "$(EMUL)" ] ; then \
+         echo "you must set a default emulation" 1>&2 ; \
+         exit 1 ; \
+       else \
+         $(CC) -c $(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) -DDEFAULT_EMULATION='"$(EMUL)"' -DSCRIPTDIR='"$(scriptdir)"' $(CFLAGS) $< ; \
+       fi
+
+ldemul-list.h: config.status
        (echo "/* This file is automatically generated.  DO NOT EDIT! */";\
        for f in `echo " " ${EMULATION_OFILES} "" \
         | sed -e 's/em_/ld/g' -e 's/ ld/ /g' -e 's/[.]o//g'`; do \
@@ -243,11 +225,17 @@ ldemul-list.h: Makefile
         | sed -e 's/em_/ld/g' -e 's/ ld/ /g' -e 's/[.]o//g'`; do \
            echo "  &ld_$${f}_emulation, \\"; \
        done;\
-       echo "  0") >ldemul-list.h
+       echo "  0") >ldemul-tmp.h
+       mv ldemul-tmp.h ldemul-list.h
 
-ldlex.c: ldlex.l ldgram.h
+ldlex.c: ldlex.l
        $(LEX) -I -Cem $(srcdir)/ldlex.l
-       mv lex.yy.c ldlex.c
+       -sed -e '/^int.*free();/d' \
+            -e '/^char.*malloc();/d' \
+            -e 's/malloc/ldmalloc/g' \
+         < lex.yy.c > ldlex.c.new
+       -rm lex.yy.c
+       mv ldlex.c.new ./ldlex.c
 
 # These all start with em_ so 'make clean' can find them.
 
@@ -365,98 +353,17 @@ em_elf32mipb.c: $(srcdir)/emulparams/elf32mipb.sh \
 em_alpha.c: $(srcdir)/emulparams/alpha.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/alpha.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} alpha
+em_coff_sparc.c: $(srcdir)/emulparams/coff_sparc.sh \
+  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/sparccoff.sc ${GEN_DEPENDS}
+       ${GENSCRIPTS} coff_sparc
 
 $(LD_PROG): $(OFILES) $(BFDLIB) $(LIBIBERTY)
        $(CC) $(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) $(CFLAGS) $(LDFLAGS) -o $(LD_PROG) $(OFILES) $(BFDLIB) $(LIBIBERTY) $(LOADLIBES)
 
 # The generated emulation files mostly have the same dependencies.
-$(EMULATION_OFILES): ../bfd/bfd.h ../bfd/sysdep.h ld.h ldemul.h \
-  ldfile.h ldmisc.h config.h
-
-# This list of dependencies was generated by doing a make with gcc -MM
-# saving the output in a file and removing the gcc commands
-# changing "../../devo/ld/../bfd" to "$(BFDDIR)"
-# removing "../../devo/ld/"
-# changing "../include" to "$(INCDIR)"
-
-ldgram.o: ldgram.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h \
-  ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h $(INCDIR)/fopen-same.h \
-  ld.h ldexp.h ldver.h ldlang.h \
-  ldemul.h ldfile.h ldmisc.h mri.h 
-ldlex.o: ldlex.c ../bfd/bfd.h $(INCDIR)/obstack.h ./ldgram.h 
-lexsup.o: lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ldlex.h ld.h \
-  ldexp.h ./ldgram.h ldmisc.h 
-ldlang.o: ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldmain.h \
-  ldsym.h ./ldgram.h ldwarn.h ldlang.h \
-  ldexp.h ldemul.h ldlex.h ldmisc.h \
-  ldindr.h ldctor.h 
-mri.o: mri.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldlang.h \
-  mri.h ./ldgram.h ldexp.h 
-ldctor.o: ldctor.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldlang.h \
-  ldsym.h ldmisc.h ldexp.h ./ldgram.h 
-ldmain.o: ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h config.h ld.h \
-  ldmain.h ldmisc.h ldwrite.h ./ldgram.h \
-  ldsym.h ldlang.h ldemul.h ldlex.h \
-  ldfile.h ldindr.h ldwarn.h ldctor.h \
-  lderror.h 
-ldindr.o: ldindr.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldsym.h \
-  ldmisc.h 
-ldwarn.o: ldwarn.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ldsym.h ldwarn.h \
-  ldmisc.h 
-ldwrite.o: ldwrite.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ldlang.h ld.h \
-  ldwrite.h ldmisc.h ldsym.h ./ldgram.h \
-  relax.h 
-ldexp.o: ldexp.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldmain.h \
-  ldmisc.h ldexp.h ./ldgram.h ldsym.h \
-  ldlang.h 
-ldemul.o: ldemul.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h config.h ld.h \
-  ldemul.h ldmisc.h ./ldemul-list.h 
-ldver.o: ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ldver.h ldemul.h 
-ldmisc.o: ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldmisc.h \
-  ldlang.h ldlex.h 
-ldsym.o: ldsym.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ld.h ldsym.h \
-  ldmisc.h ldlang.h 
-ldfile.o: ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h ldmisc.h ldlang.h \
-  ldfile.h 
-relax.o: relax.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h $(BFDDIR)/seclet.h $(INCDIR)/coff/internal.h \
-  ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h $(INCDIR)/fopen-same.h \
-  ldlang.h ld.h ldwrite.h ldmisc.h \
-  ldsym.h ./ldgram.h relax.h 
-lderror.o: lderror.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
-  $(INCDIR)/obstack.h ../bfd/sysdep.h $(BFDDIR)/hosts/std-host.h \
-  $(INCDIR)/fopen-same.h $(BFDDIR)/seclet.h ld.h \
-  ldmisc.h 
-
-# CYGNUS LOCAL targets.
+$(EMULATION_OFILES): ../bfd/bfd.h ../bfd/sysdep.h $(INCDIR)/bfdlink.h \
+  ld.h ldmain.h ldemul.h ldfile.h ldmisc.h ldexp.h ldlang.h config.h ldctor.h
+
 # These targets are for the dejagnu testsuites. The file site.exp 
 # contains global variables that all the testsuites will use.
 # There is a current debate as to how and where to generate test
@@ -515,6 +422,7 @@ check: ld.new site.exp
        CXX="$(RUNTEST_CXX)" CXXFLAGS="$(RUNTEST_CXXFLAGS)"
 
 installcheck:
+.PHONY: check installcheck
 
 # Rules for testing by relinking ld itself.
 
@@ -535,6 +443,8 @@ ld3: ld2
 bootstrap: ld3
        cmp ld2 ld3
 
+.PHONY: bootstrap
+
 # A test program for C++ constructors and destructors.
 
 cdtest: cdtest-main.o cdtest-func.o cdtest-foo.o ld.new
@@ -544,6 +454,9 @@ cdtest: cdtest-main.o cdtest-func.o cdtest-foo.o ld.new
 check-cdtest: cdtest $(srcdir)/cdtest.exp
        ./cdtest >cdtest.out
        diff $(srcdir)/cdtest.exp cdtest.out
+
+.PHONY: check-cdtest
+
 # END OF CHECK TARGETS
 
 # DOCUMENTATION TARGETS
@@ -558,7 +471,7 @@ configdoc.texi:     ${DOCVER}-doc.texi
 # TeX output
 dvi: ld.dvi
 ld.dvi: $(srcdir)/ld.texinfo $(srcdir)/configdoc.texi $(BFDDIR)/doc/bfdsumm.texi
-       $(TEXI2DVI) -I$(BFDDIR)/doc $(srcdir)/ld.texinfo
+       TEXINPUTS=$(BFDDIR)/doc:$$TEXINPUTS $(TEXI2DVI) $(srcdir)/ld.texinfo
 
 ldint.dvi: $(srcdir)/ldint.texinfo
        $(TEXI2DVI) $(srcdir)/ldint.texinfo
@@ -570,6 +483,8 @@ ld.info: $(srcdir)/ld.texinfo configdoc.texi $(BFDDIR)/doc/bfdsumm.texi
 ldint.info: $(srcdir)/ldint.texinfo
        $(MAKEINFO) -o ldint.info $(srcdir)/ldint.texinfo
 
+.PHONY: dvi
+
 #separate targets for "ms", "me", and "mm" forms of roff doc
 # Try to use a recent texi2roff.  v2 was put on prep in jan91.
 # If you want an index, see texi2roff doc for postprocessing 
@@ -679,6 +594,8 @@ de-stage3: force
        -rm ld
        -rmdir stage3
 
+.PHONY: stage1 stage2 stage3 comparison de-stage1 de-stage2 de-stage3
+
 # Stuff that should be included in a distribution:
 LDDISTSTUFF=ldgram.c ldgram.h ldlex.c
 diststuff: $(LDDISTSTUFF)
@@ -695,7 +612,9 @@ distclean:
 realclean: clean distclean
        -rm -f $(LDDISTSTUFF)
 
-lintlog:$(SOURCES) Makefile
+.PHONY: diststuff mostlyclean clean distclean realclean
+
+lintlog:$(LINTSOURCES) Makefile
        $(LINT) -abhxzn  $(LINTFLAGS)  $(LINTSOURCES) \
 | grep -v "pointer casts may be troublesome" \
 | grep -v "possible pointer alignment problem" \
@@ -711,7 +630,6 @@ TAGS:
        etags -t $(srcdir)/*.[chly] *.[chly]
 
 
-.PHONY: install
 install: 
        $(INSTALL_XFORM) ld.new $(bindir)/ld
        $(INSTALL_XFORM1) $(srcdir)/ld.1 $(man1dir)/ld.1
@@ -731,69 +649,97 @@ install-info:
 clean-info:
        -rm -rf *.info*
 
-#-----------------------------------------------------------------------------
-#              'STANDARD' GNU/960 TARGETS BELOW THIS POINT
-#
-# 'VERSION' file must be present and contain a string of the form "x.y"
-#-----------------------------------------------------------------------------
+.PHONY: install install-info clean-info
 
-ver960.c: FORCE
-       rm -f ver960.c
-       echo "char ${TARG}_ver[]= \"${TARG} `cat VERSION`, `date`\";" > ver960.c
+# Targets to rebuild dependencies in this Makefile.
+# Have to get rid of .dep1 here so that "$?" later includes all of $(CFILES).
+.dep: dep.sed $(CFILES) $(HFILES) $(GENERATED_CFILES) $(GENERATED_HFILES)
+       rm -f .dep1
+       $(MAKE) DEP=$(DEP) .dep1
+       sed -f dep.sed <.dep1 >.dep
 
+# This rule really wants a mkdep that runs "gcc -MM".
+.dep1: $(CFILES) $(GENERATED_CFILES)
+       rm -f .dep2
+       echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > .dep2
+       $(DEP) -f .dep2 $(ALL_CFLAGS) $?
+       $(srcdir)/../move-if-change .dep2 .dep1
 
-# This target should be invoked before building a new release.
-# 'VERSION' file must be present and contain a string of the form "x.y"
-#
-roll:
-       @V=`cat VERSION`                ; \
-       MAJ=`sed 's/\..*//' VERSION`    ; \
-       MIN=`sed 's/.*\.//' VERSION`    ; \
-       V=$$MAJ.`expr $$MIN + 1`        ; \
-       rm -f VERSION                   ; \
-       echo $$V >VERSION               ; \
-       echo Version $$V
+dep.sed: dep-in.sed config.status
+       sed <$(srcdir)/dep-in.sed >dep.sed      \
+               -e 's!@INCDIR@!$(INCDIR)!'      \
+               -e 's!@srcdir@!$(srcdir)!'
 
+dep: .dep
+       sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile
+       cat .dep >> tmp-Makefile
+       $(srcdir)/../move-if-change tmp-Makefile Makefile
 
-dep: $(LDSOURCES)
-       mkdep $(CFLAGS) $?
+dep-in: .dep
+       sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in
+       cat .dep >> tmp-Makefile.in
+       $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in
+
+.PHONY: dep dep-in
 
 # Dummy target to force execution of dependent targets.
 #
 force:
 
-# Target to uncomment host-specific lines in this makefile.  Such lines must
-# have the following string beginning in column 1: #__<hostname>__#
-# Original Makefile is backed up as 'Makefile.old'.
-#
-# Invoke with:  make make HOST=xxx
-#
-make:
-       -@if test $(HOST)x = x ; then \
-               echo '\aSpecify "make make HOST=???"'; \
-               exit 1; \
-       fi ; \
-       grep -s "^#The next line was generated by 'make make'" Makefile; \
-       if test $$? = 0 ; then  \
-               echo "\aMakefile has already been processed with 'make make'";\
-               exit 1; \
-       fi ; \
-       mv -f Makefile Makefile.old; \
-       echo "#The next line was generated by 'make make'"       >Makefile ; \
-       echo "HOST=$(HOST)"                                     >>Makefile ; \
-       echo                                                    >>Makefile ; \
-       sed "s/^#__$(HOST)__#//" < Makefile.old                 >>Makefile
-
-#\f
+.PHONY: force
 
 Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag)
        $(SHELL) ./config.status
 
-### mode:fundamental ***
-### Local Variables: ***
-### page-delimiter: "^#\f" ***
-### End: ***
-### end of file
-
+# What appears below is generated by a hacked mkdep using gcc -MM.
+
+# DO NOT DELETE THIS LINE -- mkdep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+ldctor.o : ldctor.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h ld.h ldexp.h ldlang.h ldmisc.h \
+  ldgram.h ldctor.h
+ldemul.o : ldemul.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  config.h ld.h ldemul.h ldmisc.h ldfile.h ldmain.h ldemul-list.h
+ldexp.o : ldexp.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h ld.h ldmain.h ldmisc.h ldexp.h \
+  ldgram.h ldlang.h
+ldfile.o : ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  ld.h ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldlex.h
+ldlang.o : ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h ld.h ldmain.h ldgram.h ldexp.h \
+  ldlang.h ldemul.h ldlex.h ldmisc.h ldctor.h ldfile.h
+ldmain.o : ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h config.h ld.h ldmain.h ldmisc.h \
+  ldwrite.h ldgram.h ldexp.h ldlang.h ldemul.h ldlex.h \
+  ldfile.h ldctor.h
+ldmisc.o : ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  ld.h ldmisc.h ldexp.h ldlang.h ldlex.h ldmain.h ldfile.h
+ldver.o : ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  ld.h ldver.h ldemul.h ldmain.h
+ldwrite.o : ldwrite.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h ld.h ldexp.h ldlang.h ldwrite.h \
+  ldmisc.h ldgram.h ldmain.h
+lexsup.o : lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  ldlex.h ld.h ldexp.h ldgram.h ldmisc.h
+mri.o : mri.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h \
+  ../bfd/sysdep.h $(INCDIR)/fopen-same.h ld.h ldexp.h \
+  ldlang.h ldmisc.h mri.h ldgram.h
+ldgram.o : ldgram.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
+  $(INCDIR)/bfdlink.h ld.h ldexp.h ldver.h ldlang.h ldemul.h \
+  ldfile.h ldmisc.h ldmain.h mri.h ldlex.h
+ldlex.o : ldlex.c ../bfd/bfd.h $(INCDIR)/obstack.h \
+  ld.h ldgram.h ldmisc.h ldexp.h ldlang.h ldfile.h ldlex.h
 
 # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
index 0bd2318..e363722 100644 (file)
@@ -2,7 +2,7 @@
 # It does some substitutions.
 cat >em_${EMULATION_NAME}.c <<EOF
 /* An emulation for HP PA-RISC OSF/1 linkers.
-   Copyright (C) 1991 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1993 Free Software Foundation, Inc.
    Written by Steve Chamberlain steve@cygnus.com
 
 This file is part of GLD, the Gnu Linker.
@@ -23,7 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
-
+#include "bfdlink.h"
 
 #include "ld.h"
 #include "config.h"
@@ -32,22 +32,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "ldexp.h"
 #include "ldlang.h"
 #include "ldmisc.h"
-
-extern  boolean lang_float_flag;
-
-
-extern enum bfd_architecture ldfile_output_architecture;
-extern unsigned long ldfile_output_machine;
-extern char *ldfile_output_machine_name;
-
-extern bfd *output_bfd;
+#include "ldmain.h"
+#include "ldctor.h"
 
 static void hppaosf_before_parse()
 {
-  extern char *lprefix;
-  extern unsigned int lprefix_len;
-  lprefix = "L$";
-  lprefix_len = 2;
+  link_info.lprefix = "L$";
+  link_info.lprefix_len = 2;
 
   ldfile_output_architecture = bfd_arch_hppa;
 }
@@ -56,10 +47,6 @@ static lang_input_statement_type *stub_file = 0;
 
 static lang_input_section_type *stub_input_section = NULL;
 
-extern lang_statement_list_type *stat_ptr;
-/* List of statements needed to handle constructors */
-extern lang_statement_list_type constructor_list;
-
 static void
 hppaosf_search_for_padding_statements(s,prev)
        lang_statement_union_type *s;
@@ -112,9 +99,8 @@ static void
 hppaosf_finish()
 {
   extern asymbol *hppa_look_for_stubs_in_section();
-  extern ld_config_type config;
 
-  if (config.relocateable_output == false)
+  if (link_info.relocateable == false)
     {
       /* check for needed stubs */
       LANG_FOR_EACH_INPUT_SECTION
@@ -128,7 +114,8 @@ hppaosf_finish()
                                                            output_bfd,
                                                            section,
                                                            statement->asymbols,
-                                                           &new_sym_cnt);
+                                                           &new_sym_cnt,
+                                                           &link_info);
 
            if ( (new_sym_cnt > 0) && syms )
              {
@@ -245,13 +232,11 @@ $s/$/n}"/
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 0;
 
-  if (config.relocateable_output == true && config.build_constructors == true)
+  if (link_info.relocateable == true && config.build_constructors == true)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
-  else if (config.relocateable_output == true)
+  else if (link_info.relocateable == true)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
   else if (!config.text_read_only)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
@@ -267,13 +252,11 @@ else
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 1;
 
-  if (config.relocateable_output == true && config.build_constructors == true)
+  if (link_info.relocateable == true && config.build_constructors == true)
     return "ldscripts/${EMULATION_NAME}.xu";
-  else if (config.relocateable_output == true)
+  else if (link_info.relocateable == true)
     return "ldscripts/${EMULATION_NAME}.xr";
   else if (!config.text_read_only)
     return "ldscripts/${EMULATION_NAME}.xbn";
index 77b726f..a142450 100644 (file)
@@ -4,7 +4,7 @@ cat >em_${EMULATION_NAME}.c <<EOF
 /* This file is is generated by a shell script.  DO NOT EDIT! */
 
 /* emulate the original gld for the given ${EMULATION_NAME}
-   Copyright (C) 1991 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1993 Free Software Foundation, Inc.
    Written by Steve Chamberlain steve@cygnus.com
 
 This file is part of GLD, the Gnu Linker.
@@ -27,24 +27,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
+
 #include "ld.h"
 #include "config.h"
 #include "ldemul.h"
 #include "ldfile.h"
 #include "ldmisc.h"
-
-extern boolean lang_float_flag;
-
-extern enum bfd_architecture ldfile_output_architecture;
-extern unsigned long ldfile_output_machine;
-extern char *ldfile_output_machine_name;
+#include "ldmain.h"
 
 static void
 gld${EMULATION_NAME}_before_parse()
 {
-  extern char *lprefix;
-  lprefix = "@";
-  lprefix_len = 1;
+  link_info.lprefix = "@";
+  link_info.lprefix_len = 1;
 
   ldfile_output_architecture = bfd_arch_${ARCH};
 }
@@ -67,13 +63,11 @@ $s/$/n}"/
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 0;
 
-  if (config.relocateable_output == true && config.build_constructors == true)
+  if (link_info.relocateable == true && config.build_constructors == true)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
-  else if (config.relocateable_output == true)
+  else if (link_info.relocateable == true)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
   else if (!config.text_read_only)
     return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
@@ -89,13 +83,11 @@ else
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 1;
 
-  if (config.relocateable_output == true && config.build_constructors == true)
+  if (link_info.relocateable == true && config.build_constructors == true)
     return "ldscripts/${EMULATION_NAME}.xu";
-  else if (config.relocateable_output == true)
+  else if (link_info.relocateable == true)
     return "ldscripts/${EMULATION_NAME}.xr";
   else if (!config.text_read_only)
     return "ldscripts/${EMULATION_NAME}.xbn";
index eafe26c..0e950d8 100644 (file)
@@ -1,10 +1,11 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* ldemul.c -- clearing house for ld emulation states
+   Copyright (C) 1991, 1993 Free Software Foundation, Inc.
 
 This file is part of GLD, the Gnu Linker.
 
 GLD is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GLD is distributed in the hope that it will be useful,
@@ -16,14 +17,6 @@ You should have received a copy of the GNU General Public License
 along with GLD; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-/*
- * $Id$ 
- */
-
-/*
- * clearing house for ld emulation states 
- */
-
 #include "bfd.h"
 #include "sysdep.h"
 
@@ -31,30 +24,22 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "ld.h"
 #include "ldemul.h"
 #include "ldmisc.h"
-
-extern ld_emulation_xfer_type ld_lnk960_emulation;
-extern ld_emulation_xfer_type ld_gldm88kbcs_emulation;
-extern ld_emulation_xfer_type ld_gld_emulation;
-extern ld_emulation_xfer_type ld_vanilla_emulation;
-extern ld_emulation_xfer_type ld_gld68k_emulation;
-extern ld_emulation_xfer_type ld_gld960_emulation;
-extern ld_emulation_xfer_type ld_gld29k_emulation;
-extern ld_emulation_xfer_type ld_gldnews_emulation;
-extern ld_emulation_xfer_type ld_h8300hds_emulation;
-
+#include "ldfile.h"
+#include "ldmain.h"
+#include "ldemul-list.h"
 
 ld_emulation_xfer_type *ld_emulation;
 
 void
 ldemul_hll(name)
-char *name;
+     char *name;
 {
   ld_emulation->hll(name);
 }
 
 
 void ldemul_syslib(name)
-char *name;
+     char *name;
 {
   ld_emulation->syslib(name);
 }
@@ -80,9 +65,8 @@ ldemul_after_allocation()
 void 
 ldemul_before_allocation()
 {
-  if (ld_emulation->before_allocation) {
+  if (ld_emulation->before_allocation)
     ld_emulation->before_allocation();
-  }
 }
 
 
@@ -92,56 +76,101 @@ ldemul_set_output_arch()
   ld_emulation->set_output_arch();
 }
 
+void
+ldemul_finish()
+{
+  if (ld_emulation->finish)
+    ld_emulation->finish();
+}
+
+void
+ldemul_create_output_section_statements()
+{
+  if (ld_emulation->create_output_section_statements)
+    ld_emulation->create_output_section_statements();
+}
+
+char *
+ldemul_get_script(isfile)
+     int *isfile;
+{
+  return ld_emulation->get_script(isfile);
+}
+
 char *
 ldemul_choose_target()
 {
   return ld_emulation->choose_target();
 }
 
+/* The default choose_target function.  */
+
 char *
-ldemul_get_script()
+ldemul_default_target()
 {
-  return ld_emulation->get_script();
+  char *from_outside = getenv(TARGET_ENVIRON);
+  if (from_outside != (char *)NULL)
+    return from_outside;
+  return ld_emulation->target_name;
+}
+
+void 
+after_parse_default()
+{
+
 }
 
 void
-ldemul_choose_mode(target)
-char *target;
-{
-  if (strcmp(target,LNK960_EMULATION_NAME)==0) {
-    ld_emulation = &ld_lnk960_emulation;
-  }
-  else if (strcmp(target,GLD960_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gld960_emulation;
-  }
-  else if (strcmp(target,GLDM88KBCS_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gldm88kbcs_emulation;
-  }
-#ifndef GNU960
-  else if (strcmp(target,GLD_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gld_emulation;
-  }
-  else if (strcmp(target,VANILLA_EMULATION_NAME)==0) {
-    ld_emulation = &ld_vanilla_emulation;
-  }
-  else if (strcmp(target,H8300HDS_EMULATION_NAME)==0) {
-    ld_emulation = &ld_h8300hds_emulation;
-  }
-
-  else if (strcmp(target,GLD68K_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gld68k_emulation;
-  }
-  else if (strcmp(target,GLD29K_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gld29k_emulation;       
-  }
-  else if (strcmp(target,GLDNEWS_EMULATION_NAME)==0) {
-    ld_emulation = &ld_gldnews_emulation;      
-  }
-#endif
-  else {
-    info("%P%F unrecognised emulation mode: %s\n",target);
-  }
+after_allocation_default()
+{
+
+}
+
+void
+before_allocation_default()
+{
+
+}
+
+void
+set_output_arch_default()
+{
+  /* Set the output architecture and machine if possible */
+  bfd_set_arch_mach(output_bfd,
+                   ldfile_output_architecture, ldfile_output_machine);
 }
 
+void
+syslib_default(ignore)
+     char  *ignore;
+{
+  info_msg ("%S SYSLIB ignored\n");
+}
 
+void
+hll_default(ignore)
+     char  *ignore;
+{
+  info_msg ("%S HLL ignored\n");
+}
 
+ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
+
+void
+ldemul_choose_mode(target)
+     char *target;
+{
+    ld_emulation_xfer_type **eptr = ld_emulations;
+    /* Ignore "gld" prefix. */
+    if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
+       target += 3;
+    for (; *eptr; eptr++)
+      {
+       if (strcmp(target, (*eptr)->emulation_name) == 0)
+         {
+           ld_emulation = *eptr;
+           return;
+         }
+      }
+    einfo("%P%F: unrecognised emulation mode: %s\n",target);
+}
index d5726d1..705d739 100644 (file)
@@ -1,5 +1,5 @@
 /* A YACC grammer to parse a superset of the AT&T linker scripting languaue.
-   Copyright (C) 1991 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1993 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
 This file is part of GNU ld.
@@ -27,6 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
 #include "ld.h"    
 #include "ldexp.h"
 #include "ldver.h"
@@ -34,7 +35,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "ldemul.h"
 #include "ldfile.h"
 #include "ldmisc.h"
-#include "ldsym.h"
 #include "ldmain.h"
 #include "mri.h"
 #include "ldlex.h"
@@ -42,8 +42,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define YYDEBUG 1
 
 static int typebits;
-strip_symbols_type strip_symbols=STRIP_NONE;
-discard_locals_type discard_locals=DISCARD_NONE;
 
 static char *dirlist_ptr;
 
@@ -133,7 +131,7 @@ static int error_index;
 %token LENGTH    CREATE_OBJECT_SYMBOLS INPUT OUTPUT  CONSTRUCTORS
 %token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT
 %token OPTION_Qy OPTION_Y OPTION_dn OPTION_call_shared OPTION_non_shared
-%token OPTION_Oval
+%token OPTION_Oval OPTION_stats OPTION_no_keep_memory
 %token <name> OPTION_YP
 
 %type <token> assign_op 
@@ -142,11 +140,11 @@ static int error_index;
 
 
 %token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD
-%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE
+%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
 
 %%
 
-file:  command_line  { lang_final(); };
+file:  command_line
 
 
 filename:  NAME;
@@ -206,23 +204,28 @@ command_line_option:
                        config.magic_demand_paged = false;
                        }
         |       OPTION_s {
-                       strip_symbols = STRIP_ALL;
+                       link_info.strip = strip_all;
                        }
        |       OPTION_S {
-                       strip_symbols = STRIP_DEBUGGER;
+                       link_info.strip = strip_debugger;
                        }
+       |       OPTION_stats {
+                       config.stats = true;
+               }
+       |       OPTION_no_keep_memory {
+                       link_info.keep_memory = false;
+               }
         |       OPTION_u NAME {
                        ldlang_add_undef($2);
                }
-           
        |       OPTION_r {
-                       config.relocateable_output = true;
+                       link_info.relocateable = true;
                        config.build_constructors = false;
                        config.magic_demand_paged = false;
                        config.text_read_only = false;
                        }
         |       OPTION_Ur {
-                       config.relocateable_output = true;
+                       link_info.relocateable = true;
                        config.build_constructors = true;
                        config.magic_demand_paged = false;
                        config.text_read_only = false;
@@ -235,10 +238,10 @@ command_line_option:
                        { lang_add_entry($2); 
                        }
        |       OPTION_X {
-                       discard_locals = DISCARD_L;
+                       link_info.discard = discard_l;
                }
        |       OPTION_x {
-                       discard_locals = DISCARD_ALL;
+                       link_info.discard = discard_all;
                }
 
        |       OPTION_noinhibit_exec
@@ -343,7 +346,7 @@ command_line_option:
                        lang_add_assignment(exp_assop($4,$3,$5));
                        }
        |       OPTION_RETAIN_SYMBOLS_FILE filename
-               { lang_add_keepsyms_file ($2); }
+               { add_keepsyms_file ($2); }
        |       OPTION_EB
                {
                  /* FIXME: This is currently ignored.  It means
@@ -380,21 +383,20 @@ command_line_option:
                    einfo ("%P%F: unknown -Y option -- %s\n", $2);
                  else
                    {
-                     char *p = "";
+                     char *p;
                      dirlist_ptr = $2;
                    set_default_dirlist:
-                     while (p != 0)
+                     while (1)
                        {
                          p = strchr (dirlist_ptr, ':');
-                         if (p)
+                         if (p != NULL)
                            *p = 0;
                          if (*dirlist_ptr)
                            ldfile_add_library_path (dirlist_ptr);
-                         if (p)
-                           {
-                             *p = ':';
-                             dirlist_ptr = p + 1;
-                           }
+                         if (p == NULL)
+                           break;
+                         *p = ':';
+                         dirlist_ptr = p + 1;
                        }
                    }
                }
@@ -463,11 +465,11 @@ mri_script_command:
        |       ALIAS NAME ',' NAME
                        { mri_alias($2,$4,0);}
        |       ALIAS NAME ',' INT
-                       { mri_alias($2,0,$4);}
+                       { mri_alias($2,0,(int) $4);}
        |       BASE     exp
                        { mri_base($2); }
         |       TRUNCATE INT
-               {  mri_truncate($2); }
+               {  mri_truncate((unsigned int) $2); }
         |
        ;
 
@@ -609,7 +611,7 @@ statement:
        | input_section_spec
         | length '(' exp ')'
                        {
-                       lang_add_data($1,$3);
+                       lang_add_data((int) $1,$3);
                        }
   
        | FILL '(' exp ')'
@@ -782,7 +784,7 @@ exp :
        |       '(' exp ')'
                        { $$ = $2; }
        |       NEXT '(' exp ')' %prec UNARY
-                       { $$ = exp_unop($1,$3); }
+                       { $$ = exp_unop((int) $1,$3); }
        |       '!' exp %prec UNARY
                        { $$ = exp_unop('!', $2); }
        |       '+' exp %prec UNARY
index c073263..376e650 100644 (file)
@@ -1,4 +1,6 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* ldwrite.c -- write out the linked file
+   Copyright (C) 1993 Free Software Foundation, Inc.
+   Written by Steve Chamberlain sac@cygnus.com
 
 This file is part of GLD, the Gnu Linker.
 
@@ -16,109 +18,271 @@ You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-/*
-   This module writes out the final image by reading sections from the
-   input files, relocating them and writing them out
-
-   There are two main paths through this module, one for normal
-   operation and one for partial linking.
-
-   During  normal operation, raw section data is read along with the
-   associated relocation information, the relocation info applied and
-   the section data written out on a section by section basis.
-
-   When partially linking, all the relocation records are read to work
-   out how big the output relocation vector will be. Then raw data is
-   read, relocated and written section by section.
-
-   Written by Steve Chamberlain sac@cygnus.com
-
-*/
-
-
 #include "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
 
 #include "ld.h"
 #include "ldexp.h"
 #include "ldlang.h"
 #include "ldwrite.h"
 #include "ldmisc.h"
-#include "ldsym.h"
 #include "ldgram.h"
 #include "ldmain.h"
-#include "relax.h"
+
+static void build_link_order PARAMS ((lang_statement_union_type *));
+static void print_symbol_table PARAMS ((void));
+static void print_file_stuff PARAMS ((lang_input_statement_type *));
+static boolean print_symbol PARAMS ((struct bfd_link_hash_entry *, PTR));
+
+/* Build link_order structures for the BFD linker.  */
 
 static void
-read_relocs (abfd, section, symbols)
-     bfd * abfd;
-     asection * section;
-     asymbol ** symbols;
+build_link_order (statement)
+     lang_statement_union_type *statement;
+{
+  switch (statement->header.type)
+    {
+    case lang_data_statement_enum:
+      /* FIXME: This should probably build a link_order, but instead
+        it just does the output directly.  */
+      {
+       bfd_vma value = statement->data_statement.value;
+       bfd_byte play_area[LONG_SIZE];
+       unsigned int size = 0;
+       asection *output_section = statement->data_statement.output_section;
+
+       ASSERT (output_section->owner == output_bfd);
+       switch (statement->data_statement.type)
+         {
+         case LONG:
+           bfd_put_32 (output_bfd, value, play_area);
+           size = LONG_SIZE;
+           break;
+         case SHORT:
+           bfd_put_16 (output_bfd, value, play_area);
+           size = SHORT_SIZE;
+           break;
+         case BYTE:
+           bfd_put_8 (output_bfd, value, play_area);
+           size = BYTE_SIZE;
+           break;
+         default:
+           abort ();
+         }
+
+       if (! bfd_set_section_contents (output_bfd, output_section,
+                                       play_area,
+                                       statement->data_statement.output_vma,
+                                       size))
+         einfo ("%P%X: writing data failed: %E\n");
+      }
+      break;
+
+    case lang_input_section_enum:
+      /* Create a new link_order in the output section with this
+        attached */
+      if (statement->input_section.ifile->just_syms_flag == false)
+       {
+         asection *i = statement->input_section.section;
+         asection *output_section = i->output_section;
+
+         ASSERT (output_section->owner == output_bfd);
+
+         if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
+           {
+             struct bfd_link_order *link_order;
+
+             link_order = bfd_new_link_order (output_bfd, output_section);
+
+             if (i->flags & SEC_NEVER_LOAD)
+               {
+                 /* We've got a never load section inside one which
+                    is going to be output, we'll change it into a
+                    fill link_order */
+                 link_order->type = bfd_fill_link_order;
+                 link_order->u.fill.value = 0;
+               }
+             else
+               {
+                 link_order->type = bfd_indirect_link_order;
+                 link_order->u.indirect.section = i;
+                 ASSERT (i->output_section == output_section);
+               }
+             link_order->size = bfd_section_size (i->owner, i);
+             link_order->offset = i->output_offset;
+           }
+       }
+      break;
+
+    case lang_padding_statement_enum:
+      /* Make a new link_order with the right filler */
+      {
+       asection *output_section;
+       struct bfd_link_order *link_order;
+
+       output_section = statement->padding_statement.output_section;
+       ASSERT (statement->padding_statement.output_section->owner
+               == output_bfd);
+       if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
+         {
+           link_order = bfd_new_link_order (output_bfd, output_section);
+           link_order->type = bfd_fill_link_order;
+           link_order->size = statement->padding_statement.size;
+           link_order->offset = statement->padding_statement.output_offset;
+           link_order->u.fill.value = statement->padding_statement.fill;
+         }
+      }
+      break;
+
+    default:
+      /* All the other ones fall through */
+      break;
+    }
+}
+
+/* Call BFD to write out the linked file.  */
+
+void
+ldwrite ()
 {
-  /* Work out the output section ascociated with this input section */
-  asection *output_section = section->output_section;
+  lang_for_each_statement (build_link_order);
 
-  bfd_size_type reloc_size = bfd_get_reloc_upper_bound (abfd, section);
-  arelent **reloc_vector = (arelent **) ldmalloc (reloc_size);
+  if (! bfd_final_link (output_bfd, &link_info))
+    einfo ("%F%P: %B: %E\n", output_bfd);
 
-  if (bfd_canonicalize_reloc (abfd,
-                             section,
-                             reloc_vector,
-                             symbols))
+  if (config.map_file)
     {
-      output_section->reloc_count += section->reloc_count;
+      print_symbol_table ();
+      lang_map ();
     }
 }
 
+/* Print the symbol table.  */
 
 static void
-setup_rel ()
+print_symbol_table ()
 {
-  /*
-    Run through each section of each file and work work out the total
-    number of relocation records which will finally be in each output
-    section
-    */
-
-  LANG_FOR_EACH_INPUT_SECTION
-  (statement, abfd, section,
-   (read_relocs (abfd, section, statement->asymbols)));
-
-
-
-  /*
-    Now run though all the output sections and allocate the space for
-    all the relocations
-    */
-  LANG_FOR_EACH_OUTPUT_SECTION
-    (section,
-     (section->orelocation =
-      (arelent **) ldmalloc ((bfd_size_type) (sizeof (arelent **) *
-                                             section->reloc_count)),
-      section->reloc_count = 0));
+  fprintf (config.map_file, "**FILES**\n\n");
+  lang_for_each_file (print_file_stuff);
+
+  fprintf (config.map_file, "**GLOBAL SYMBOLS**\n\n");
+  fprintf (config.map_file, "offset    section    offset   symbol\n");
+  bfd_link_hash_traverse (link_info.hash, print_symbol, (PTR) NULL);
 }
 
-void
-ldwrite ()
+/* Print information about a file.  */
+
+static void
+print_file_stuff (f)
+     lang_input_statement_type * f;
+{
+  fprintf (config.map_file, "  %s\n", f->filename);
+  if (f->just_syms_flag)
+    {
+      fprintf (config.map_file, " symbols only\n");
+    }
+  else
+    {
+      asection *s;
+      if (true)
+       {
+         for (s = f->the_bfd->sections;
+              s != (asection *) NULL;
+              s = s->next)
+           {
+             print_address (s->output_offset);
+             if (s->reloc_done)
+               {
+                 fprintf (config.map_file, " %08x 2**%2ud %s\n",
+                          (unsigned) bfd_get_section_size_after_reloc (s),
+                          s->alignment_power, s->name);
+               }
+
+             else
+               {
+                 fprintf (config.map_file, " %08x 2**%2ud %s\n",
+                          (unsigned) bfd_get_section_size_before_reloc (s),
+                          s->alignment_power, s->name);
+               }
+           }
+       }
+      else
+       {
+         for (s = f->the_bfd->sections;
+              s != (asection *) NULL;
+              s = s->next)
+           {
+             fprintf (config.map_file, "%s ", s->name);
+             print_address (s->output_offset);
+             fprintf (config.map_file, "(%x)",
+                      (unsigned) bfd_get_section_size_after_reloc (s));
+           }
+         fprintf (config.map_file, "hex \n");
+       }
+    }
+  print_nl ();
+}
+
+/* Print a symbol.  */
+
+static boolean
+print_symbol (p, ignore)
+     struct bfd_link_hash_entry *p;
+     PTR ignore;
 {
-  PTR data_area = (PTR) ldmalloc (largest_section);
+  while (p->type == bfd_link_hash_indirect
+        || p->type == bfd_link_hash_warning)
+    p = p->u.i.link;
+
+  switch (p->type) 
+    {
+    case bfd_link_hash_new:
+      abort ();
 
-  ldsym_write ();
+    case bfd_link_hash_undefined:
+      fprintf (config.map_file, "undefined                     ");
+      fprintf (config.map_file, "%s ", p->root.string);
+      print_nl ();    
+      break;
 
-  if (config.relocateable_output == true)
-    setup_rel ();
+    case bfd_link_hash_weak:
+      fprintf (config.map_file, "weak                          ");
+      fprintf (config.map_file, "%s ", p->root.string);
+      print_nl ();    
+      break;
 
-  write_relax (output_bfd, data_area, config.relocateable_output);
+    case bfd_link_hash_defined:            
+      {
+       asection *defsec = p->u.def.section;
 
-  free (data_area);
+       print_address (p->u.def.value);
+       if (defsec)
+         {
+           fprintf (config.map_file, "  %-10s",
+                    bfd_section_name (output_bfd, defsec));
+           print_space ();
+           print_address (p->u.def.value + defsec->vma);
+         }
+       else
+         {
+           fprintf (config.map_file, "         .......");
+         }
+       fprintf (config.map_file, " %s ", p->root.string);
+      }
+      print_nl ();    
+      break;
 
-  /* Output the symbol table (both globals and locals).  */
+    case bfd_link_hash_common:
+      fprintf (config.map_file, "common               ");
+      print_address (p->u.c.size);
+      fprintf (config.map_file, " %s ", p->root.string);
+      print_nl ();
+      break;
 
-  /* Print a map, if requested and possible.  */
+    default:
+      abort ();
+    }
 
-  if (config.map_file)
-  {
-    ldsym_print_symbol_table ();
-    lang_map ();
-  }
+  return true;
 }