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.
 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)
 # 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..
 
 
 # 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
 
 # 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
 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`
 
 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
 # 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)
 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
 
 # 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)
 
 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.
 ####
 
 ### 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:
 
 # 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) $<
 
 .cc.o:
        $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(CFLAGS) $<
 
+ALL_CFLAGS=$(INCLUDES) $(HDEFINES) $(TDEFINES) $(CDEFINES) $(CFLAGS)
 .c.o:
 .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
 
 # 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_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}
 
        $(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
 
 info: ld.info
+.PHONY: info
 
 ldgram.h ldgram.c: ldgram.y
        $(BISON) $(BISONFLAGS) -d $(srcdir)/ldgram.y
 
 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.
        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 \
        (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;\
         | 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
        $(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.
 
 
 # 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_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.
 
 $(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
 # 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:
        CXX="$(RUNTEST_CXX)" CXXFLAGS="$(RUNTEST_CXXFLAGS)"
 
 installcheck:
+.PHONY: check installcheck
 
 # Rules for testing by relinking ld itself.
 
 
 # Rules for testing by relinking ld itself.
 
@@ -535,6 +443,8 @@ ld3: ld2
 bootstrap: ld3
        cmp ld2 ld3
 
 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
 # 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
 check-cdtest: cdtest $(srcdir)/cdtest.exp
        ./cdtest >cdtest.out
        diff $(srcdir)/cdtest.exp cdtest.out
+
+.PHONY: check-cdtest
+
 # END OF CHECK TARGETS
 
 # DOCUMENTATION TARGETS
 # 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
 # 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
 
 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
 
 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 
 #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
 
        -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)
 # 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)
 
 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" \
        $(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]
 
 
        etags -t $(srcdir)/*.[chly] *.[chly]
 
 
-.PHONY: install
 install: 
        $(INSTALL_XFORM) ld.new $(bindir)/ld
        $(INSTALL_XFORM1) $(srcdir)/ld.1 $(man1dir)/ld.1
 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*
 
 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:
 
 
 # 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
 
 
 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
 
 # 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.
 # 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.
    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 "bfd.h"
 #include "sysdep.h"
-
+#include "bfdlink.h"
 
 #include "ld.h"
 #include "config.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"
 #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()
 {
 
 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;
 }
 
   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;
 
 
 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;
 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();
 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
     {
       /* check for needed stubs */
       LANG_FOR_EACH_INPUT_SECTION
@@ -128,7 +114,8 @@ hppaosf_finish()
                                                            output_bfd,
                                                            section,
                                                            statement->asymbols,
                                                            output_bfd,
                                                            section,
                                                            statement->asymbols,
-                                                           &new_sym_cnt);
+                                                           &new_sym_cnt,
+                                                           &link_info);
 
            if ( (new_sym_cnt > 0) && syms )
              {
 
            if ( (new_sym_cnt > 0) && syms )
              {
@@ -245,13 +232,11 @@ $s/$/n}"/
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 0;
 
   *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`;
     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`;
     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
 {                           
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 1;
 
   *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";
     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";
     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}
 /* 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.
    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 "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
+
 #include "ld.h"
 #include "config.h"
 #include "ldemul.h"
 #include "ldfile.h"
 #include "ldmisc.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()
 {
 
 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};
 }
 
   ldfile_output_architecture = bfd_arch_${ARCH};
 }
@@ -67,13 +63,11 @@ $s/$/n}"/
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 0;
 
   *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`;
     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`;
     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
 {                           
 
 cat >>em_${EMULATION_NAME}.c <<EOF
 {                           
-  extern ld_config_type config;
-
   *isfile = 1;
 
   *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";
     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";
     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
 
 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,
 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.  */
 
 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"
 
 #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"
 #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)
 
 ld_emulation_xfer_type *ld_emulation;
 
 void
 ldemul_hll(name)
-char *name;
+     char *name;
 {
   ld_emulation->hll(name);
 }
 
 
 void ldemul_syslib(name)
 {
   ld_emulation->hll(name);
 }
 
 
 void ldemul_syslib(name)
-char *name;
+     char *name;
 {
   ld_emulation->syslib(name);
 }
 {
   ld_emulation->syslib(name);
 }
@@ -80,9 +65,8 @@ ldemul_after_allocation()
 void 
 ldemul_before_allocation()
 {
 void 
 ldemul_before_allocation()
 {
-  if (ld_emulation->before_allocation) {
+  if (ld_emulation->before_allocation)
     ld_emulation->before_allocation();
     ld_emulation->before_allocation();
-  }
 }
 
 
 }
 
 
@@ -92,56 +76,101 @@ ldemul_set_output_arch()
   ld_emulation->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();
 }
 
 char *
 ldemul_choose_target()
 {
   return ld_emulation->choose_target();
 }
 
+/* The default choose_target function.  */
+
 char *
 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
 }
 
 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.
 /* 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.
    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 "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
 #include "ld.h"    
 #include "ldexp.h"
 #include "ldver.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 "ldemul.h"
 #include "ldfile.h"
 #include "ldmisc.h"
-#include "ldsym.h"
 #include "ldmain.h"
 #include "mri.h"
 #include "ldlex.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;
 #define YYDEBUG 1
 
 static int typebits;
-strip_symbols_type strip_symbols=STRIP_NONE;
-discard_locals_type discard_locals=DISCARD_NONE;
 
 static char *dirlist_ptr;
 
 
 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 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 
 %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 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;
 
 
 filename:  NAME;
@@ -206,23 +204,28 @@ command_line_option:
                        config.magic_demand_paged = false;
                        }
         |       OPTION_s {
                        config.magic_demand_paged = false;
                        }
         |       OPTION_s {
-                       strip_symbols = STRIP_ALL;
+                       link_info.strip = strip_all;
                        }
        |       OPTION_S {
                        }
        |       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_u NAME {
                        ldlang_add_undef($2);
                }
-           
        |       OPTION_r {
        |       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.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;
                        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 {
                        { lang_add_entry($2); 
                        }
        |       OPTION_X {
-                       discard_locals = DISCARD_L;
+                       link_info.discard = discard_l;
                }
        |       OPTION_x {
                }
        |       OPTION_x {
-                       discard_locals = DISCARD_ALL;
+                       link_info.discard = discard_all;
                }
 
        |       OPTION_noinhibit_exec
                }
 
        |       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_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
        |       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
                    {
                    einfo ("%P%F: unknown -Y option -- %s\n", $2);
                  else
                    {
-                     char *p = "";
+                     char *p;
                      dirlist_ptr = $2;
                    set_default_dirlist:
                      dirlist_ptr = $2;
                    set_default_dirlist:
-                     while (p != 0)
+                     while (1)
                        {
                          p = strchr (dirlist_ptr, ':');
                        {
                          p = strchr (dirlist_ptr, ':');
-                         if (p)
+                         if (p != NULL)
                            *p = 0;
                          if (*dirlist_ptr)
                            ldfile_add_library_path (dirlist_ptr);
                            *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
        |       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
        |       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 ')'
                        {
        | input_section_spec
         | length '(' exp ')'
                        {
-                       lang_add_data($1,$3);
+                       lang_add_data((int) $1,$3);
                        }
   
        | FILL '(' exp ')'
                        }
   
        | FILL '(' exp ')'
@@ -782,7 +784,7 @@ exp :
        |       '(' exp ')'
                        { $$ = $2; }
        |       NEXT '(' exp ')' %prec UNARY
        |       '(' exp ')'
                        { $$ = $2; }
        |       NEXT '(' exp ')' %prec UNARY
-                       { $$ = exp_unop($1,$3); }
+                       { $$ = exp_unop((int) $1,$3); }
        |       '!' exp %prec UNARY
                        { $$ = exp_unop('!', $2); }
        |       '+' exp %prec UNARY
        |       '!' 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.
 
 
 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.  */
 
 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 "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
 
 #include "ld.h"
 #include "ldexp.h"
 #include "ldlang.h"
 #include "ldwrite.h"
 #include "ldmisc.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 "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
 
 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
 
 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;
 }
 }