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.
This commit is contained in:
Ian Lance Taylor 1993-12-30 19:51:41 +00:00
parent 9a0418eb7b
commit 4a6afc88bb
7 changed files with 635 additions and 412 deletions

View 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.

View 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}
CFILES= ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
ldmain.c ldmisc.c ldver.c ldwrite.c lexsup.c \
mri.c
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
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
MANSOURCES=ld.tex
GENERATED_CFILES= ldgram.c ldlex.c
GENERATED_HFILES= ldgram.h ldemul-list.h
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
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}
GENERATED_SOURCES=ldgram.c ldlex.c em_*.c ldemul-list.h
GENERATED_HEADERS=ldgram.h ldemul-list.h
LINTSOURCES= $(CFILES) $(GENERATED_CFILES) em_*.c
LDSOURCES=$(LDCSOURCES) ldgram.y ldlex.l ldgram.h
BFDSOURCES=../../bfd/common/*.c
SOURCES= $(LDSOURCES) $(BFDSOURCES)
LINTSOURCES= $(LDCSOURCES) $(BFDSOURCES) $(GENERATED_SOURCES)
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 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
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
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
$(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
# 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.
# 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 'Specify "make make HOST=???"'; \
exit 1; \
fi ; \
grep -s "^#The next line was generated by 'make make'" Makefile; \
if test $$? = 0 ; then \
echo "Makefile 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
#
.PHONY: force
Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag)
$(SHELL) ./config.status
### mode:fundamental ***
### Local Variables: ***
### page-delimiter: "^# " ***
### 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

View 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";

View 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";

View 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;
after_allocation_default()
{
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);
}
}
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);
}

View 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

View 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;
{
/* Work out the output section ascociated with this input section */
asection *output_section = section->output_section;
bfd_size_type reloc_size = bfd_get_reloc_upper_bound (abfd, section);
arelent **reloc_vector = (arelent **) ldmalloc (reloc_size);
if (bfd_canonicalize_reloc (abfd,
section,
reloc_vector,
symbols))
switch (statement->header.type)
{
output_section->reloc_count += section->reloc_count;
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;
}
}
static void
setup_rel ()
{
/*
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));
}
/* Call BFD to write out the linked file. */
void
ldwrite ()
{
PTR data_area = (PTR) ldmalloc (largest_section);
lang_for_each_statement (build_link_order);
ldsym_write ();
if (config.relocateable_output == true)
setup_rel ();
write_relax (output_bfd, data_area, config.relocateable_output);
free (data_area);
/* Output the symbol table (both globals and locals). */
/* Print a map, if requested and possible. */
if (! bfd_final_link (output_bfd, &link_info))
einfo ("%F%P: %B: %E\n", output_bfd);
if (config.map_file)
{
ldsym_print_symbol_table ();
lang_map ();
}
{
print_symbol_table ();
lang_map ();
}
}
/* Print the symbol table. */
static void
print_symbol_table ()
{
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);
}
/* 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;
{
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 ();
case bfd_link_hash_undefined:
fprintf (config.map_file, "undefined ");
fprintf (config.map_file, "%s ", p->root.string);
print_nl ();
break;
case bfd_link_hash_weak:
fprintf (config.map_file, "weak ");
fprintf (config.map_file, "%s ", p->root.string);
print_nl ();
break;
case bfd_link_hash_defined:
{
asection *defsec = p->u.def.section;
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;
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;
default:
abort ();
}
return true;
}