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:
parent
9a0418eb7b
commit
4a6afc88bb
107
ld/ChangeLog
107
ld/ChangeLog
|
@ -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.
|
||||
|
|
328
ld/Makefile.in
328
ld/Makefile.in
|
@ -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 \
|
||||
ldmain.o: ldmain.c config.status
|
||||
if [ -z "$(EMUL)" ] ; then \
|
||||
echo "you must set a default emulation" 1>&2 ; \
|
||||
exit 1 ; \
|
||||
else \
|
||||
echo -DDEFAULT_EMULATION='"$(EMUL)"' ; \
|
||||
fi`
|
||||
$(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
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
151
ld/ldemul.c
151
ld/ldemul.c
|
@ -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
|
||||
ldemul_choose_mode(target)
|
||||
char *target;
|
||||
after_parse_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
|
||||
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);
|
||||
}
|
||||
|
|
52
ld/ldgram.y
52
ld/ldgram.y
|
@ -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,24 +383,23 @@ 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)
|
||||
{
|
||||
if (p == NULL)
|
||||
break;
|
||||
*p = ':';
|
||||
dirlist_ptr = p + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
| '{' script_file '}' { /* This parses compiled-in scripts. */ }
|
||||
| NAME
|
||||
{
|
||||
|
@ -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
|
||||
|
|
322
ld/ldwrite.c
322
ld/ldwrite.c
|
@ -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 ();
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue