* bfd-in.h: Don't include obstack.h.

(struct bfd_hash_table): Change memory field to PTR.
	* bfd.c (struct _bfd): Change memory field to PTR.
	* bfd-in2.h: Rebuild.
	* libbfd-in.h (bfd_release): Declare as function, don't define as
	macro.
	* libbfd.h: Rebuild.
	* opncls.c: Include "objalloc.h" rather than "obstack.h".  Use
	objalloc routines rather than obstack routines.
	(obstack_chunk_alloc, obstack_chunk_free): Don't define.
	(getpagesize): Don't define.
	(_bfd_new_bfd): Don't set _bfd_chunksize.
	(bfd_openr): Free new bfd and objalloc on failure.
	(bfd_fdopenr, bfd_openstreamr, bfd_openw): Likewise.
	(bfd_alloc_size): Remove.
	(bfd_release): New function.
	* hash.c: Include "objalloc.h" rather than "obstack.h".  Use
	objalloc routines rather than obstack routines.
	(obstack_chunk_alloc, obstack_chunk_free): Don't define.
	* ecofflink.c: Include "objalloc.h" rather than "obstack.h".  Use
	objalloc routines rather than obstack routines.
	(obstack_chunk_alloc, obstack_chunk_free): Don't define.
	(struct accumulate): Change memory to struct objalloc *.
	* liboasys.h (oasys_data_type): Remove oasys_obstack field.
	* dep-in.sed: Don't remove obstack.h from dependency list.
	* Makefile.in: Rebuild dependencies.
	(BFD_H_DEPS): Remove obstack.h.
	(install): Don't install obstack.h.
	* Many files: Don't include "obstack.h".
	* VERSION: Bump.
This commit is contained in:
Ian Lance Taylor
1997-03-18 00:47:04 +00:00
parent cadddcea29
commit 508539ab8b
12 changed files with 397 additions and 702 deletions

View File

@ -1,5 +1,36 @@
Mon Mar 17 11:32:53 1997 Ian Lance Taylor <ian@cygnus.com> Mon Mar 17 11:32:53 1997 Ian Lance Taylor <ian@cygnus.com>
* bfd-in.h: Don't include obstack.h.
(struct bfd_hash_table): Change memory field to PTR.
* bfd.c (struct _bfd): Change memory field to PTR.
* bfd-in2.h: Rebuild.
* libbfd-in.h (bfd_release): Declare as function, don't define as
macro.
* libbfd.h: Rebuild.
* opncls.c: Include "objalloc.h" rather than "obstack.h". Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
(getpagesize): Don't define.
(_bfd_new_bfd): Don't set _bfd_chunksize.
(bfd_openr): Free new bfd and objalloc on failure.
(bfd_fdopenr, bfd_openstreamr, bfd_openw): Likewise.
(bfd_alloc_size): Remove.
(bfd_release): New function.
* hash.c: Include "objalloc.h" rather than "obstack.h". Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
* ecofflink.c: Include "objalloc.h" rather than "obstack.h". Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
(struct accumulate): Change memory to struct objalloc *.
* liboasys.h (oasys_data_type): Remove oasys_obstack field.
* dep-in.sed: Don't remove obstack.h from dependency list.
* Makefile.in: Rebuild dependencies.
(BFD_H_DEPS): Remove obstack.h.
(install): Don't install obstack.h.
* Many files: Don't include "obstack.h".
* VERSION: Bump.
* opncls.c (bfd_alloc_grow, bfd_alloc_finish): Remove. * opncls.c (bfd_alloc_grow, bfd_alloc_finish): Remove.
* libbfd-in.h (bfd_alloc_grow, bfd_alloc_finish): Don't declare. * libbfd-in.h (bfd_alloc_grow, bfd_alloc_finish): Don't declare.
* libbfd.h: Rebuild. * libbfd.h: Rebuild.

View File

@ -1,5 +1,5 @@
# Makefile template for Configure for the BFD library. # Makefile template for Configure for the BFD library.
# Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 # Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
# Written by Cygnus Support. # Written by Cygnus Support.
# #
@ -116,9 +116,7 @@ ALL_MACHINES = \
cpu-arc.o \ cpu-arc.o \
$(end-sanitize-arc) \ $(end-sanitize-arc) \
cpu-arm.o \ cpu-arm.o \
$(start-sanitize-d10v) \
cpu-d10v.o \ cpu-d10v.o \
$(end-sanitize-d10v) \
$(start-sanitize-d30v) \ $(start-sanitize-d30v) \
cpu-d30v.o \ cpu-d30v.o \
$(end-sanitize-d30v) \ $(end-sanitize-d30v) \
@ -220,9 +218,7 @@ BFD32_BACKENDS = \
$(start-sanitize-arc) \ $(start-sanitize-arc) \
elf32-arc.o \ elf32-arc.o \
$(end-sanitize-arc) \ $(end-sanitize-arc) \
$(start-sanitize-d10v) \
elf32-d10v.o \ elf32-d10v.o \
$(end-sanitize-d10v) \
$(start-sanitize-d30v) \ $(start-sanitize-d30v) \
elf32-d30v.o \ elf32-d30v.o \
$(end-sanitize-d30v) \ $(end-sanitize-d30v) \
@ -567,10 +563,10 @@ $(SHLINK): $(SHLIB)
ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed -e '$(program_transform_name)'`; \ ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed -e '$(program_transform_name)'`; \
if [ "$$ts" != "$(SHLIB)" ]; then \ if [ "$$ts" != "$(SHLIB)" ]; then \
rm -f $$ts; \ rm -f $$ts; \
ln -sf $(SHLIB) $$ts; \ ln -s $(SHLIB) $$ts; \
else true; fi else true; fi
rm -f $(SHLINK) rm -f $(SHLINK)
ln -sf $(SHLIB) $(SHLINK) ln -s $(SHLIB) $(SHLINK)
# This target creates libTARGET-bfd.so.VERSION as a symlink to # This target creates libTARGET-bfd.so.VERSION as a symlink to
# libbfd.so.VERSION. It is used on SunOS, which does not have SONAME. # libbfd.so.VERSION. It is used on SunOS, which does not have SONAME.
@ -578,7 +574,7 @@ stamp-tshlink: $(SHLIB)
tf=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ tf=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \
if [ "$$tf" != "$(SHLIB)" ]; then \ if [ "$$tf" != "$(SHLIB)" ]; then \
rm -f $$tf; \ rm -f $$tf; \
ln -sf $(SHLIB) $$tf; \ ln -s $(SHLIB) $$tf; \
else true; fi else true; fi
touch stamp-tshlink touch stamp-tshlink
@ -655,7 +651,7 @@ clobber maintainer-clean realclean:
$(MAKE) subdir_do DO=maintainer-clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) $(MAKE) subdir_do DO=maintainer-clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS)
$(MAKE) do_maintainer_clean $(MAKE) do_maintainer_clean
BFD_H_DEPS= $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h BFD_H_DEPS= $(INCDIR)/ansidecl.h
LOCAL_H_DEPS= libbfd.h sysdep.h config.h LOCAL_H_DEPS= libbfd.h sysdep.h config.h
$(BFD_LIBS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) $(BFD_LIBS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS)
$(BFD_MACHINES): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) $(BFD_MACHINES): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS)
@ -723,7 +719,7 @@ install: $(ALLLIBS)
rm -f $(libdir)/$$tf; \ rm -f $(libdir)/$$tf; \
if [ "$$f" = "$(SHLINK)" ]; then \ if [ "$$f" = "$(SHLINK)" ]; then \
ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \
ln -sf $$ts $(libdir)/$$tf; \ ln -s $$ts $(libdir)/$$tf; \
elif [ "$$f" = "$(SHLIB)" ]; then \ elif [ "$$f" = "$(SHLIB)" ]; then \
@INSTALL_SHLIB@ \ @INSTALL_SHLIB@ \
else \ else \
@ -738,13 +734,11 @@ install: $(ALLLIBS)
$(INSTALL_DATA) $(BFD_H) $(includedir)/bfd.h $(INSTALL_DATA) $(BFD_H) $(includedir)/bfd.h
$(INSTALL_DATA) $(INCDIR)/ansidecl.h $(includedir)/ansidecl.h $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(includedir)/ansidecl.h
$(INSTALL_DATA) $(INCDIR)/bfdlink.h $(includedir)/bfdlink.h $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(includedir)/bfdlink.h
$(INSTALL_DATA) $(INCDIR)/obstack.h $(includedir)/obstack.h
-if test -z "$(oldincludedir)"; then true; else \ -if test -z "$(oldincludedir)"; then true; else \
test -d $(oldincludedir) || mkdir $(oldincludedir); \ test -d $(oldincludedir) || mkdir $(oldincludedir); \
$(INSTALL_DATA) $(BFD_H) $(oldincludedir)/bfd.h; \ $(INSTALL_DATA) $(BFD_H) $(oldincludedir)/bfd.h; \
$(INSTALL_DATA) $(INCDIR)/ansidecl.h $(oldincludedir)/ansidecl.h; \ $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(oldincludedir)/ansidecl.h; \
$(INSTALL_DATA) $(INCDIR)/bfdlink.h $(oldincludedir)/bfdlink.h; \ $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(oldincludedir)/bfdlink.h; \
$(INSTALL_DATA) $(INCDIR)/obstack.h $(oldincludedir)/obstack.h; \
fi fi
$(MAKE) subdir_do DO=install "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) $(MAKE) subdir_do DO=install "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS)
@ -857,11 +851,9 @@ elf32-arc.o: elf32-arc.c elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/arc.h elf32-target.h $(INCDIR)/elf/arc.h elf32-target.h
end-sanitize-arc: end-sanitize-arc:
start-sanitize-d10v:
elf32-d10v.o: elf32-d10v.c elf-bfd.h $(INCDIR)/elf/common.h \ elf32-d10v.o: elf32-d10v.c elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
elf32-target.h elf32-target.h
end-sanitize-d10v:
start-sanitize-d30v: start-sanitize-d30v:
elf32-d30v.o: elf32-d30v.c elf-bfd.h $(INCDIR)/elf/common.h \ elf32-d30v.o: elf32-d30v.c elf-bfd.h $(INCDIR)/elf/common.h \
@ -913,13 +905,13 @@ corefile.o: corefile.c
format.o: format.c format.o: format.c
init.o: init.c init.o: init.c
libbfd.o: libbfd.c libbfd.o: libbfd.c
opncls.o: opncls.c opncls.o: opncls.c $(INCDIR)/objalloc.h
reloc.o: reloc.c $(INCDIR)/bfdlink.h reloc.o: reloc.c $(INCDIR)/bfdlink.h
section.o: section.c section.o: section.c
syms.o: syms.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \ syms.o: syms.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \
$(INCDIR)/aout/stab.def $(INCDIR)/aout/stab.def
targets.o: targets.c $(INCDIR)/fnmatch.h targmatch.h targets.o: targets.c $(INCDIR)/fnmatch.h targmatch.h
hash.o: hash.c hash.o: hash.c $(INCDIR)/objalloc.h
linker.o: linker.c $(INCDIR)/bfdlink.h genlink.h linker.o: linker.c $(INCDIR)/bfdlink.h genlink.h
elf.o: elf.c $(INCDIR)/bfdlink.h elf-bfd.h $(INCDIR)/elf/common.h \ elf.o: elf.c $(INCDIR)/bfdlink.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h
@ -1039,9 +1031,9 @@ ecoff.o: ecoff.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/ar.h \
libaout.h $(INCDIR)/aout/aout64.h $(INCDIR)/coff/internal.h \ libaout.h $(INCDIR)/aout/aout64.h $(INCDIR)/coff/internal.h \
$(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \ $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \
libcoff.h libecoff.h libcoff.h libecoff.h
ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \ ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/objalloc.h \
$(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \ $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h \
$(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h
elf32-gen.o: elf32-gen.c elf-bfd.h $(INCDIR)/elf/common.h \ elf32-gen.o: elf32-gen.c elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
elf32-target.h elf32-target.h
@ -1084,7 +1076,7 @@ elf32-sparc.o: elf32-sparc.c $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/sparc.h elf32-target.h $(INCDIR)/elf/sparc.h elf32-target.h
elf32.o: elf32.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \ elf32.o: elf32.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
elfcore.h elflink.h $(INCDIR)/fnmatch.h elfcore.h elflink.h
elflink.o: elflink.c $(INCDIR)/bfdlink.h elf-bfd.h \ elflink.o: elflink.c $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h
hp300bsd.o: hp300bsd.c libaout.h $(INCDIR)/bfdlink.h \ hp300bsd.o: hp300bsd.c libaout.h $(INCDIR)/bfdlink.h \
@ -1231,7 +1223,7 @@ elf64-sparc.o: elf64-sparc.c elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/sparc.h elf64-target.h $(INCDIR)/elf/sparc.h elf64-target.h
elf64.o: elf64.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \ elf64.o: elf64.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
elfcore.h elflink.h $(INCDIR)/fnmatch.h elfcore.h elflink.h
evax-alpha.o: evax-alpha.c $(INCDIR)/bfdlink.h evax.h evax-alpha.o: evax-alpha.c $(INCDIR)/bfdlink.h evax.h
evax-egsd.o: evax-egsd.c $(INCDIR)/bfdlink.h evax.h evax-egsd.o: evax-egsd.c $(INCDIR)/bfdlink.h evax.h
evax-etir.o: evax-etir.c $(INCDIR)/bfdlink.h evax.h evax-etir.o: evax-etir.c $(INCDIR)/bfdlink.h evax.h

View File

@ -1 +1 @@
cygnus-2.7.2 cygnus-2.7.3

View File

@ -1,5 +1,5 @@
/* BFD semi-generic back-end for a.out binaries. /* BFD semi-generic back-end for a.out binaries.
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Written by Cygnus Support. Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -1236,7 +1236,7 @@ aout_get_external_symbols (abfd)
syms = (struct external_nlist *) obj_aout_sym_window (abfd).data; syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
#else #else
/* We allocate using malloc to make the values easy to free /* We allocate using malloc to make the values easy to free
later on. If we put them on the obstack it might not be later on. If we put them on the objalloc it might not be
possible to free them. */ possible to free them. */
syms = ((struct external_nlist *) syms = ((struct external_nlist *)
bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE)); bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
@ -4263,10 +4263,7 @@ aout_link_write_symbols (finfo, input_bfd)
break; break;
case discard_l: case discard_l:
if ((type & N_STAB) == 0 if ((type & N_STAB) == 0
&& *name == *finfo->info->lprefix && bfd_is_local_label_name (input_bfd, name))
&& (finfo->info->lprefix_len == 1
|| strncmp (name, finfo->info->lprefix,
finfo->info->lprefix_len) == 0))
skip = true; skip = true;
break; break;
case discard_all: case discard_all:

View File

@ -49,7 +49,6 @@ extern "C" {
#endif #endif
#include "ansidecl.h" #include "ansidecl.h"
#include "obstack.h"
/* These two lines get substitutions done by commands in Makefile.in. */ /* These two lines get substitutions done by commands in Makefile.in. */
#define BFD_VERSION "@VERSION@" #define BFD_VERSION "@VERSION@"
@ -380,8 +379,9 @@ struct bfd_hash_table
struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
struct bfd_hash_table *, struct bfd_hash_table *,
const char *)); const char *));
/* An obstack for this hash table. */ /* An objalloc for this hash table. This is a struct objalloc *,
struct obstack memory; but we use PTR to avoid requiring the inclusion of objalloc.h. */
PTR memory;
}; };
/* Initialize a hash table. */ /* Initialize a hash table. */
@ -710,9 +710,6 @@ bfd_close PARAMS ((bfd *abfd));
boolean boolean
bfd_close_all_done PARAMS ((bfd *)); bfd_close_all_done PARAMS ((bfd *));
bfd_size_type
bfd_alloc_size PARAMS ((bfd *abfd));
bfd * bfd *
bfd_create PARAMS ((CONST char *filename, bfd *templ)); bfd_create PARAMS ((CONST char *filename, bfd *templ));
@ -2263,8 +2260,10 @@ struct _bfd
/* Used by the application to hold private data*/ /* Used by the application to hold private data*/
PTR usrdata; PTR usrdata;
/* Where all the allocated stuff under this BFD goes */ /* Where all the allocated stuff under this BFD goes. This is a
struct obstack memory; struct objalloc *, but we use PTR to avoid requiring the inclusion of
objalloc.h. */
PTR memory;
}; };
typedef enum bfd_error typedef enum bfd_error
@ -2731,6 +2730,9 @@ CAT(NAME,_canonicalize_dynamic_reloc)
PTR backend_data; PTR backend_data;
} bfd_target; } bfd_target;
boolean
bfd_set_default_target PARAMS ((const char *name));
const bfd_target * const bfd_target *
bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd)); bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd));

View File

@ -1,5 +1,5 @@
/* BFD back-end for AMD 29000 COFF binaries. /* BFD back-end for AMD 29000 COFF binaries.
Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. Copyright 1990, 91, 92, 93, 94, 95, 1997 Free Software Foundation, Inc.
Contributed by David Wood at New York University 7/8/91. Contributed by David Wood at New York University 7/8/91.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h" #include "bfd.h"
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h"
#include "coff/a29k.h" #include "coff/a29k.h"
#include "coff/internal.h" #include "coff/internal.h"
#include "libcoff.h" #include "libcoff.h"

View File

@ -1,5 +1,5 @@
/* BFD back-end for PowerPC Microsoft Portable Executable files. /* BFD back-end for PowerPC Microsoft Portable Executable files.
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Original version pieced together by Kim Knuttila (krk@cygnus.com) Original version pieced together by Kim Knuttila (krk@cygnus.com)
@ -36,7 +36,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h"
#include "coff/powerpc.h" #include "coff/powerpc.h"
#include "coff/internal.h" #include "coff/internal.h"
@ -68,6 +67,33 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define MARK_AS_WRITTEN(x) ((x) |= 1) #define MARK_AS_WRITTEN(x) ((x) |= 1)
#define MAKE_ADDR_AGAIN(x) ((x) &= ~1) #define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
/* Turn on this check if you suspect something amiss in the hash tables */
#ifdef DEBUG_HASH
/* Need a 7 char string for an eye catcher */
#define EYE "krkjunk"
#define HASH_CHECK_DCL char eye_catcher[8];
#define HASH_CHECK_INIT(ret) strcpy(ret->eye_catcher, EYE)
#define HASH_CHECK(addr) \
if (strcmp(addr->eye_catcher, EYE) != 0) \
{ \
fprintf(stderr,\
"File %s, line %d, Hash check failure, bad eye %8s\n", \
__FILE__, __LINE__, addr->eye_catcher); \
abort(); \
}
#else
#define HASH_CHECK_DCL
#define HASH_CHECK_INIT(ret)
#define HASH_CHECK(addr)
#endif
/* In order not to add an int to every hash table item for every coff /* In order not to add an int to every hash table item for every coff
linker, we define our own hash table, derived from the coff one */ linker, we define our own hash table, derived from the coff one */
@ -82,20 +108,10 @@ struct ppc_coff_link_hash_entry
bfd_vma toc_offset; /* Our addition, as required */ bfd_vma toc_offset; /* Our addition, as required */
int symbol_is_glue; int symbol_is_glue;
unsigned long int glue_insn; unsigned long int glue_insn;
char eye_catcher[8];
HASH_CHECK_DCL
}; };
/* Need a 7 char string for an eye catcher */
#define EYE "krkjunk"
#define CHECK_EYE(addr) \
if (strcmp(addr, EYE) != 0) \
{ \
fprintf(stderr,\
"File %s, line %d, Hash check failure, bad eye %8s\n", \
__FILE__, __LINE__, addr); \
abort(); \
}
/* PE linker hash table. */ /* PE linker hash table. */
@ -140,7 +156,8 @@ ppc_coff_link_hash_newfunc (entry, table, string)
SET_UNALLOCATED(ret->toc_offset); SET_UNALLOCATED(ret->toc_offset);
ret->symbol_is_glue = 0; ret->symbol_is_glue = 0;
ret->glue_insn = 0; ret->glue_insn = 0;
strcpy(ret->eye_catcher, EYE);
HASH_CHECK_INIT(ret);
} }
return (struct bfd_hash_entry *) ret; return (struct bfd_hash_entry *) ret;
@ -186,8 +203,8 @@ ppc_coff_link_hash_table_create (abfd)
/* The nt loader points the toc register to &toc + 32768, in order to */ /* The nt loader points the toc register to &toc + 32768, in order to */
/* use the complete range of a 16-bit displacement (I guess). We have */ /* use the complete range of a 16-bit displacement. We have to adjust */
/* to adjust for this when we fix up loads displaced off the toc reg. */ /* for this when we fix up loads displaced off the toc reg. */
#define TOC_LOAD_ADJUSTMENT (-32768) #define TOC_LOAD_ADJUSTMENT (-32768)
#define TOC_SECTION_NAME ".private.toc" #define TOC_SECTION_NAME ".private.toc"
@ -852,7 +869,7 @@ record_toc(toc_section, our_toc_offset, cat, name)
#ifdef COFF_IMAGE_WITH_PE #ifdef COFF_IMAGE_WITH_PE
/* record a toc offset against a symbol */ /* record a toc offset against a symbol */
static int static boolean
ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
bfd *abfd; bfd *abfd;
struct bfd_link_info *info; struct bfd_link_info *info;
@ -861,7 +878,6 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
enum toc_type toc_kind; enum toc_type toc_kind;
{ {
struct ppc_coff_link_hash_entry *h; struct ppc_coff_link_hash_entry *h;
int ret_val;
const char *name; const char *name;
int *local_syms; int *local_syms;
@ -871,7 +887,7 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]); h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
if (h != 0) if (h != 0)
{ {
CHECK_EYE(h->eye_catcher); HASH_CHECK(h);
} }
if (h == 0) if (h == 0)
@ -896,31 +912,15 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
if (IS_UNALLOCATED(local_syms[sym])) if (IS_UNALLOCATED(local_syms[sym]))
{ {
local_syms[sym] = global_toc_size; local_syms[sym] = global_toc_size;
ret_val = global_toc_size;
global_toc_size += 4; global_toc_size += 4;
/* The size must fit in a 16bit displacment */ /* The size must fit in a 16bit displacment */
if (global_toc_size >= 65535) if (global_toc_size > 65535)
{ {
fprintf(stderr, (*_bfd_error_handler) ("TOC overflow");
"Exceeded toc size of 65535\n"); bfd_set_error (bfd_error_file_too_big);
abort(); return false;
} }
#ifdef TOC_DEBUG
fprintf(stderr,
"Setting toc_offset for local sym %d to %d\n",
sym, ret_val);
#endif
}
else
{
ret_val = local_syms[sym];
#ifdef TOC_DEBUG
fprintf(stderr,
"toc_offset already set for local sym %d to %d\n",
sym, ret_val);
#endif
} }
} }
else else
@ -932,155 +932,21 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
if (IS_UNALLOCATED(h->toc_offset)) if (IS_UNALLOCATED(h->toc_offset))
{ {
h->toc_offset = global_toc_size; h->toc_offset = global_toc_size;
ret_val = global_toc_size;
global_toc_size += 4; global_toc_size += 4;
/* The size must fit in a 16bit displacment */ /* The size must fit in a 16bit displacment */
if (global_toc_size >= 65535) if (global_toc_size >= 65535)
{ {
fprintf(stderr, (*_bfd_error_handler) ("TOC overflow");
"Exceeded toc size of 65535\n"); bfd_set_error (bfd_error_file_too_big);
abort(); return false;
}
#ifdef TOC_DEBUG
fprintf(stderr,
"Setting toc_offset for sym %d (%s) [h=%p] to %d\n",
sym, name, h, ret_val);
#endif
}
else
{
ret_val = h->toc_offset;
#ifdef TOC_DEBUG
fprintf(stderr,
"toc_offset already set for sym %d (%s) [h=%p] to %d\n",
sym, name, h, ret_val);
#endif
}
}
return ret_val;
}
#endif /* COFF_IMAGE_WITH_PE */
#if 0
/* FIXME: record a toc offset against a data-in-toc symbol */
/* Now, there is currenly some confusion on what this means. In some
compilers one sees the moral equivalent of:
.tocd
define some data
.text
refer to the data with a [tocv] qualifier
In general, one sees something to indicate that a tocd has been
seen, and that would trigger the allocation of data in toc. The IBM
docs seem to suggest that anything with the TOCDEFN qualifier should
never trigger storage allocation. However, in the kernel32.lib that
we've been using for our test bed, there are a couple of variables
referenced that fail that test.
So it can't work that way.
*/
static int
ppc_record_data_in_toc_entry(abfd, info, sec, sym, toc_kind)
bfd *abfd;
struct bfd_link_info *info;
asection *sec;
int sym;
enum toc_type toc_kind;
{
struct ppc_coff_link_hash_entry *h = 0;
int ret_val;
const char *name;
int *local_syms;
h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
if (h == 0)
{
local_syms = obj_coff_local_toc_table(abfd);
if (local_syms == 0)
{
int i;
/* allocate a table */
local_syms =
(int *) bfd_zalloc (abfd,
obj_raw_syment_count(abfd) * sizeof(int));
if (local_syms == 0)
return false;
obj_coff_local_toc_table(abfd) = local_syms;
for (i = 0; i < obj_raw_syment_count(abfd); ++i)
{
SET_UNALLOCATED(local_syms[i]);
} }
} }
if (IS_UNALLOCATED(local_syms[sym]))
{
local_syms[sym] = global_toc_size;
ret_val = global_toc_size;
global_toc_size += 4;
#ifdef TOC_DEBUG
fprintf(stderr,
"Setting data_in_toc_offset for local sym %d to %d\n",
sym, ret_val);
#endif
}
else
{
ret_val = local_syms[sym];
#ifdef TOC_DEBUG
fprintf(stderr,
"data_in_toc_offset already set for local sym %d to %d\n",
sym, ret_val);
#endif
}
}
else
{
CHECK_EYE(h->eye_catcher);
name = h->root.root.root.string;
/* check to see if there's a toc slot allocated. If not, do it
here. It will be used in relocate_section */
if (IS_UNALLOCATED(h->toc_offset))
{
#if 0
h->toc_offset = global_toc_size;
#endif
ret_val = global_toc_size;
/* We're allocating a chunk of the toc, as opposed to a slot */
/* FIXME: alignment? */
global_toc_size += 4;
#ifdef TOC_DEBUG
fprintf(stderr,
"Setting data_in_toc_offset for sym %d (%s) [h=%p] to %d\n",
sym, name, h, ret_val);
#endif
}
else
{
ret_val = h->toc_offset;
#ifdef TOC_DEBUG
fprintf(stderr,
"data_in_toc_offset already set for sym %d (%s) [h=%p] to %d\n",
sym, name, h, ret_val);
#endif
}
} }
return ret_val; return true;
} }
#endif /* 0 */
#ifdef COFF_IMAGE_WITH_PE
/* record a toc offset against a symbol */ /* record a toc offset against a symbol */
static void static void
ppc_mark_symbol_as_glue(abfd, sym, rel) ppc_mark_symbol_as_glue(abfd, sym, rel)
@ -1091,11 +957,8 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
struct ppc_coff_link_hash_entry *h; struct ppc_coff_link_hash_entry *h;
h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]); h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
#ifdef DEBUG_RELOC
fprintf(stderr, HASH_CHECK(h);
"ppc_mark_symbol_as_glue:\n");
#endif
CHECK_EYE(h->eye_catcher);
h->symbol_is_glue = 1; h->symbol_is_glue = 1;
h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr); h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
@ -1105,32 +968,6 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
#endif /* COFF_IMAGE_WITH_PE */ #endif /* COFF_IMAGE_WITH_PE */
#if 0
/* Provided the symbol, returns the value reffed */
static long get_symbol_value PARAMS ((asymbol *));
static long
get_symbol_value (symbol)
asymbol *symbol;
{
long relocation = 0;
if (bfd_is_com_section (symbol->section))
{
relocation = 0;
}
else
{
relocation = symbol->value +
symbol->section->output_section->vma +
symbol->section->output_offset;
}
return(relocation);
}
#endif /* 0 */
/* Return true if this relocation should /* Return true if this relocation should
appear in the output .reloc section. */ appear in the output .reloc section. */
@ -1180,8 +1017,6 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
unsigned short r_type; unsigned short r_type;
unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/ unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
fprintf(stderr, "pe_ppc_reloc (%s)\n", TARGET_LITTLE_NAME);
r_type = reloc_entry->howto->type; r_type = reloc_entry->howto->type;
if (output_bfd) if (output_bfd)
@ -1240,15 +1075,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_vma relocation; bfd_vma relocation;
reloc_howto_type *howto = 0; reloc_howto_type *howto = 0;
#ifdef DEBUG_RELOC
fprintf(stderr,
"pe_ppc_relocate_section (%s) for %s in bfd %s\n",
TARGET_LITTLE_NAME,
input_section->name,
input_bfd->filename);
#endif
/* If we are performing a relocateable link, we don't need to do a /* If we are performing a relocateable link, we don't need to do a
thing. The caller will take care of adjusting the reloc thing. The caller will take care of adjusting the reloc
addresses and symbol indices. */ addresses and symbol indices. */
@ -1274,23 +1100,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
unsigned short r_type = EXTRACT_TYPE (rel->r_type); unsigned short r_type = EXTRACT_TYPE (rel->r_type);
unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
#ifdef DEBUG_RELOC
/* now examine flags */
if (r_flags != 0)
{
fprintf (stderr, "Reloc with flags found!");
if ( r_flags & IMAGE_REL_PPC_NEG )
fprintf (stderr, " NEG");
if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
fprintf (stderr, " BRTAKEN");
if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
fprintf (stderr, " BRNTAKEN");
if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
fprintf (stderr, " TOCDEFN");
fprintf(stderr, "\n");
}
#endif
symndx = rel->r_symndx; symndx = rel->r_symndx;
loc = contents + rel->r_vaddr - input_section->vma; loc = contents + rel->r_vaddr - input_section->vma;
@ -1308,7 +1117,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
(obj_coff_sym_hashes (input_bfd)[symndx]); (obj_coff_sym_hashes (input_bfd)[symndx]);
if (h != 0) if (h != 0)
{ {
CHECK_EYE(h->eye_catcher); HASH_CHECK(h);
} }
sym = syms + symndx; sym = syms + symndx;
@ -1316,8 +1125,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0) if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
{ {
fprintf(stderr, /* An IMGLUE reloc must have a name. Something is very wrong. */
"relocate_section: IMGLUE reloc has no name!\n");
abort(); abort();
} }
@ -1340,7 +1148,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
} }
else else
{ {
CHECK_EYE(h->eye_catcher); HASH_CHECK(h);
if (h->root.root.type == bfd_link_hash_defined if (h->root.root.type == bfd_link_hash_defined
|| h->root.root.type == bfd_link_hash_defweak) || h->root.root.type == bfd_link_hash_defweak)
@ -1365,11 +1173,10 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
switch (r_type) switch (r_type)
{ {
default: default:
fprintf( stderr, (*_bfd_error_handler)
"ERROR: during reloc processing -- unsupported reloc %s\n", ("%s: unsupported relocation type 0x%02x",
howto->name); bfd_get_filename (input_bfd), r_type);
bfd_set_error (bfd_error_bad_value); bfd_set_error (bfd_error_bad_value);
abort();
return false; return false;
case IMAGE_REL_PPC_TOCREL16: case IMAGE_REL_PPC_TOCREL16:
{ {
@ -1382,17 +1189,10 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
{ {
toc_section = bfd_get_section_by_name (bfd_of_toc_owner, toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
TOC_SECTION_NAME); TOC_SECTION_NAME);
#ifdef TOC_DEBUG
fprintf(stderr,
"BFD of toc owner %p (%s), section addr of %s %p\n",
bfd_of_toc_owner, bfd_of_toc_owner->filename,
TOC_SECTION_NAME, toc_section);
#endif
if ( toc_section == NULL ) if ( toc_section == NULL )
{ {
fprintf(stderr, "No Toc section!\n"); /* There is no toc section. Something is very wrong. */
abort(); abort();
} }
} }
@ -1423,27 +1223,14 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
again. again.
*/ */
MAKE_ADDR_AGAIN(our_toc_offset); MAKE_ADDR_AGAIN(our_toc_offset);
#ifdef TOC_DEBUG
fprintf(stderr,
"Not writing out toc_offset of %d for %s\n",
our_toc_offset, name);
#endif
} }
else else
{ {
/* write out the toc entry */ /* write out the toc entry */
record_toc(toc_section, our_toc_offset, priv, strdup(name)); record_toc(toc_section,
#ifdef TOC_DEBUG our_toc_offset,
fprintf(stderr, priv,
"Writing out toc_offset " strdup(name));
"toc_section (%p,%p)+%d val %d for %s\n",
toc_section,
toc_section->contents,
our_toc_offset,
val,
name);
#endif
bfd_put_32(output_bfd, bfd_put_32(output_bfd,
val, val,
@ -1475,29 +1262,19 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
dll linkage, takes advantage of that and considers dll linkage, takes advantage of that and considers
the IAT to be part of the toc, thus saving a load. the IAT to be part of the toc, thus saving a load.
*/ */
#ifdef DEBUG_RELOC
fprintf(stderr,
"TOCDEFN is on, (%s) (%p) our_toc_offset = %x, val (%x) vma (%x) off (%x)\n",
name, h, our_toc_offset,
val, toc_section->output_section->vma,
toc_section->output_offset);
#endif
our_toc_offset = val - our_toc_offset = val -
(toc_section->output_section->vma + (toc_section->output_section->vma +
toc_section->output_offset); toc_section->output_offset);
#ifdef DEBUG_RELOC
fprintf(stderr,
" our_toc_offset set to %x\n", our_toc_offset);
#endif
/* The size must still fit in a 16bit displacment */ /* The size must still fit in a 16bit displacment */
if (our_toc_offset >= 65535) if (our_toc_offset >= 65535)
{ {
fprintf(stderr, (*_bfd_error_handler)
"Error: TOCDEFN Relocation of %d for %s exceeded displacement of 65535\n", our_toc_offset, name); ("%s: Relocation for %s of %x exceeds Toc size limit",
abort(); bfd_get_filename (input_bfd), name, our_toc_offset);
bfd_set_error (bfd_error_bad_value);
return false;
} }
record_toc(toc_section, our_toc_offset, pub, strdup(name)); record_toc(toc_section, our_toc_offset, pub, strdup(name));
@ -1509,28 +1286,11 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
again. again.
*/ */
MAKE_ADDR_AGAIN(our_toc_offset); MAKE_ADDR_AGAIN(our_toc_offset);
#ifdef TOC_DEBUG
fprintf(stderr,
"Not writing out toc_offset of %d for %s\n",
our_toc_offset, name);
#endif
} }
else else
{ {
record_toc(toc_section, our_toc_offset, pub, strdup(name)); record_toc(toc_section, our_toc_offset, pub, strdup(name));
#ifdef TOC_DEBUG
/* write out the toc entry */
fprintf(stderr,
"Writing out toc_offset "
"toc_section (%p,%p)+%d val %d for %s\n",
toc_section,
toc_section->contents,
our_toc_offset,
val,
name);
#endif
/* write out the toc entry */ /* write out the toc entry */
bfd_put_32(output_bfd, bfd_put_32(output_bfd,
val, val,
@ -1558,10 +1318,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (coff_data(output_bfd)->pe) if (coff_data(output_bfd)->pe)
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
#ifdef DEBUG_RELOC
fprintf(stderr,
" Toc Section .reloc candidate addr = %x\n", addr);
#endif
fwrite (&addr, 1,4, (FILE *) info->base_file); fwrite (&addr, 1,4, (FILE *) info->base_file);
} }
@ -1570,9 +1326,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN && if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN &&
our_toc_offset > toc_section->_raw_size) our_toc_offset > toc_section->_raw_size)
{ {
fprintf(stderr, (*_bfd_error_handler)
"reloc offset is bigger than the toc size!\n"); ("%s: Relocation exceeds allocated TOC (%x)",
abort(); bfd_get_filename (input_bfd),
toc_section->_raw_size);
bfd_set_error (bfd_error_bad_value);
return false;
} }
/* Now we know the relocation for this toc reference */ /* Now we know the relocation for this toc reference */
@ -1645,15 +1404,13 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (h->symbol_is_glue == 1) if (h->symbol_is_glue == 1)
break; break;
my_name = h->root.root.root.string; my_name = h->root.root.root.string;
fprintf(stderr,
"Warning: previously missed IMGLUE reloc %s <file %s, section %s>\n",
howto->name,
bfd_get_filename(input_bfd),
input_section->name);
break;
(*_bfd_error_handler)
("%s: Out of order IMGLUE reloc for %s",
bfd_get_filename (input_bfd), my_name);
bfd_set_error (bfd_error_bad_value);
return false;
} }
break;
case IMAGE_REL_PPC_ADDR32NB: case IMAGE_REL_PPC_ADDR32NB:
{ {
@ -1684,12 +1441,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
"__idata4_magic__", "__idata4_magic__",
false, false, true); false, false, true);
import_table_size = myh->root.u.def.value; import_table_size = myh->root.u.def.value;
#ifdef DEBUG_RELOC
fprintf(stderr,
"first computation triggered fta %x, ts %d(%x), its %d(%x)\n",
first_thunk_address, thunk_size, thunk_size, import_table_size,
import_table_size);
#endif
} }
if (h == 0) if (h == 0)
@ -1718,7 +1469,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
false, false, true); false, false, true);
if (myh == 0) if (myh == 0)
{ {
fprintf(stderr, "Missing idata magic cookies, this cannot work anyway...\n"); /* Missing magic cookies. Something is very wrong. */
abort(); abort();
} }
@ -1745,13 +1496,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
"__idata4_magic__", "__idata4_magic__",
false, false, true); false, false, true);
import_table_size = myh->root.u.def.value; import_table_size = myh->root.u.def.value;
#ifdef DEBUG_RELOC
fprintf(stderr,
"second computation triggered fta %x, ts %d(%x), its %d(%x)\n",
first_thunk_address, thunk_size, thunk_size, import_table_size,
import_table_size);
#endif
} }
} }
} }
@ -1801,19 +1545,8 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (coff_data(output_bfd)->pe) if (coff_data(output_bfd)->pe)
{ {
#ifdef DEBUG_RELOC
bfd_vma before_addr = addr;
#endif
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
#ifdef DEBUG_RELOC
fprintf(stderr,
" adjusted down from %x to %x", before_addr, addr);
#endif
} }
#ifdef DEBUG_RELOC
fprintf(stderr, "\n");
#endif
fwrite (&addr, 1,4, (FILE *) info->base_file); fwrite (&addr, 1,4, (FILE *) info->base_file);
} }
} }
@ -1844,28 +1577,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
buf[SYMNMLEN] = '\0'; buf[SYMNMLEN] = '\0';
name = buf; name = buf;
} }
#if 0
else
{
name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
if (name == NULL)
return false;
}
#endif
if (! ((*info->callbacks->reloc_overflow) if (! ((*info->callbacks->reloc_overflow)
(info, name, howto->name, (info, name, howto->name,
(bfd_vma) 0, input_bfd, (bfd_vma) 0, input_bfd,
input_section, rel->r_vaddr - input_section->vma))) input_section, rel->r_vaddr - input_section->vma)))
{ {
#ifdef DEBUG_RELOC
fprintf(stderr,
"pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n",
TARGET_LITTLE_NAME,
input_section->name,
input_bfd->filename);
#endif
return false; return false;
} }
} }
@ -1873,15 +1590,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
} }
#ifdef DEBUG_RELOC
fprintf(stderr,
"pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n",
TARGET_LITTLE_NAME,
input_section->name,
input_bfd->filename);
#endif
return true; return true;
} }
@ -1965,15 +1673,14 @@ ppc_allocate_toc_section (info)
if (bfd_of_toc_owner == 0) if (bfd_of_toc_owner == 0)
{ {
fprintf(stderr, /* No toc owner? Something is very wrong. */
"There is no bfd that owns the toc section!\n");
abort(); abort();
} }
s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME); s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
if (s == NULL) if (s == NULL)
{ {
fprintf(stderr, "No Toc section!\n"); /* No toc section? Something is very wrong. */
abort(); abort();
} }
@ -1994,12 +1701,6 @@ ppc_process_before_allocation (abfd, info)
asection *sec; asection *sec;
struct internal_reloc *i, *rel; struct internal_reloc *i, *rel;
#ifdef DEBUG_RELOC
fprintf(stderr,
"ppc_process_before_allocation: BFD %s\n",
bfd_get_filename(abfd));
#endif
/* here we have a bfd that is to be included on the link. We have a hook /* here we have a bfd that is to be included on the link. We have a hook
to do reloc rummaging, before section sizes are nailed down. */ to do reloc rummaging, before section sizes are nailed down. */
@ -2015,15 +1716,6 @@ ppc_process_before_allocation (abfd, info)
for (; sec != 0; sec = sec->next) for (; sec != 0; sec = sec->next)
{ {
int toc_offset;
#ifdef DEBUG_RELOC
fprintf(stderr,
" section %s reloc count %d\n",
sec->name,
sec->reloc_count);
#endif
if (sec->reloc_count == 0) if (sec->reloc_count == 0)
continue; continue;
@ -2038,46 +1730,20 @@ ppc_process_before_allocation (abfd, info)
{ {
unsigned short r_type = EXTRACT_TYPE (rel->r_type); unsigned short r_type = EXTRACT_TYPE (rel->r_type);
unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
boolean ok = true;
#ifdef DEBUG_RELOC
/* now examine flags */
if (r_flags != 0)
{
fprintf (stderr, "Reloc with flags found!");
if ( r_flags & IMAGE_REL_PPC_NEG )
fprintf (stderr, " NEG");
if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
fprintf (stderr, " BRTAKEN");
if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
fprintf (stderr, " BRNTAKEN");
if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
fprintf (stderr, " TOCDEFN");
fprintf(stderr, "\n");
}
#endif
DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
switch(r_type) switch(r_type)
{ {
case IMAGE_REL_PPC_TOCREL16: case IMAGE_REL_PPC_TOCREL16:
#if 0 /* if TOCDEFN is on, ignore as someone else has allocated the
/* FIXME: toc entry */
This remains unimplemented for now, as it currently adds
un-necessary elements to the toc. All we need to do today
is not do anything if TOCDEFN is on.
*/
if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
toc_offset = ppc_record_data_in_toc_entry(abfd, info, sec,
rel->r_symndx,
default_toc);
else
toc_offset = ppc_record_toc_entry(abfd, info, sec,
rel->r_symndx, default_toc);
#endif
if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN ) if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
toc_offset = ppc_record_toc_entry(abfd, info, sec, ok = ppc_record_toc_entry(abfd, info, sec,
rel->r_symndx, default_toc); rel->r_symndx, default_toc);
if (!ok)
return false;
break; break;
case IMAGE_REL_PPC_IMGLUE: case IMAGE_REL_PPC_IMGLUE:
ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel); ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel);
@ -2344,38 +2010,11 @@ ppc_coff_rtype2howto (relent, internal)
/* the masking process only slices off the bottom byte for r_type. */ /* the masking process only slices off the bottom byte for r_type. */
if ( r_type > MAX_RELOC_INDEX ) if ( r_type > MAX_RELOC_INDEX )
{ abort();
fprintf(stderr,
"ppc_coff_rtype2howto: reloc index %d out of range [%d, %ld]\n",
internal->r_type, 0, (long) MAX_RELOC_INDEX);
abort();
}
/* check for absolute crap */ /* check for absolute crap */
if ( junk != 0 ) if ( junk != 0 )
{ abort();
fprintf(stderr,
"ppc_coff_rtype2howto: reloc index %d contains junk %d\n",
internal->r_type, junk);
abort();
}
#ifdef DEBUG_RELOC
/* now examine flags */
if (r_flags != 0)
{
fprintf (stderr, "Reloc with flags found!");
if ( r_flags & IMAGE_REL_PPC_NEG )
fprintf (stderr, " NEG");
if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
fprintf (stderr, " BRTAKEN");
if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
fprintf (stderr, " BRNTAKEN");
if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
fprintf (stderr, " TOCDEFN");
fprintf(stderr, "\n");
}
#endif
switch(r_type) switch(r_type)
{ {
@ -2442,39 +2081,12 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
/* the masking process only slices off the bottom byte for r_type. */ /* the masking process only slices off the bottom byte for r_type. */
if ( r_type > MAX_RELOC_INDEX ) if ( r_type > MAX_RELOC_INDEX )
{ abort();
fprintf(stderr,
"coff_ppc_rtype_to_howto: index %d out of range [%d, %ld]\n",
r_type, 0, (long) MAX_RELOC_INDEX);
abort();
}
/* check for absolute crap */ /* check for absolute crap */
if ( junk != 0 ) if ( junk != 0 )
{ abort();
fprintf(stderr,
"coff_ppc_rtype_to_howto: reloc index %d contains junk %d\n",
rel->r_type, junk);
abort();
}
#ifdef DEBUG_RELOC
/* now examine flags */
if (r_flags != 0)
{
fprintf (stderr, "Reloc with flags found!");
if ( r_flags & IMAGE_REL_PPC_NEG )
fprintf (stderr, " NEG");
if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
fprintf (stderr, " BRTAKEN");
if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
fprintf (stderr, " BRNTAKEN");
if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
fprintf (stderr, " TOCDEFN");
fprintf(stderr, "\n");
}
#endif
switch(r_type) switch(r_type)
{ {
case IMAGE_REL_PPC_ADDR32NB: case IMAGE_REL_PPC_ADDR32NB:
@ -2528,12 +2140,6 @@ ppc_coff_reloc_type_lookup (abfd, code)
bfd *abfd; bfd *abfd;
bfd_reloc_code_real_type code; bfd_reloc_code_real_type code;
{ {
#ifdef DEBUG_RELOC
fprintf(stderr, "ppc_coff_reloc_type_lookup for %s\n",
bfd_get_reloc_code_name(code));
#endif
switch (code) switch (code)
{ {
HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE); HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE);
@ -2623,20 +2229,13 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ; flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
#ifdef TOC_DEBUG
fprintf(stderr,
"ppc_coff_swap_sym_in_hook: about to create the %s section\n",
TOC_SECTION_NAME);
#endif
s = bfd_make_section (abfd, TOC_SECTION_NAME); s = bfd_make_section (abfd, TOC_SECTION_NAME);
if (s == NULL if (s == NULL
|| !bfd_set_section_flags (abfd, s, flags) || !bfd_set_section_flags (abfd, s, flags)
|| !bfd_set_section_alignment (abfd, s, 2)) || !bfd_set_section_alignment (abfd, s, 2))
{ {
fprintf(stderr, /* FIXME: set appropriate bfd error */
"toc section allocation failed!\n");
abort(); abort();
} }
@ -2738,7 +2337,10 @@ ppc_bfd_coff_final_link (abfd, info)
/* Compute the file positions for all the sections. */ /* Compute the file positions for all the sections. */
if (! abfd->output_has_begun) if (! abfd->output_has_begun)
bfd_coff_compute_section_file_positions (abfd); {
if (! bfd_coff_compute_section_file_positions (abfd))
return false;
}
/* Count the line numbers and relocation entries required for the /* Count the line numbers and relocation entries required for the
output file. Set the file positions for the relocs. */ output file. Set the file positions for the relocs. */

View File

@ -1,5 +1,5 @@
/* BFD back-end for IBM RS/6000 "XCOFF" files. /* BFD back-end for IBM RS/6000 "XCOFF" files.
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
FIXME: Can someone provide a transliteration of this name into ASCII? FIXME: Can someone provide a transliteration of this name into ASCII?
Using the following chars caused a compiler warning on HIUX (so I replaced Using the following chars caused a compiler warning on HIUX (so I replaced
them with octal escapes), and isn't useful without an understanding of what them with octal escapes), and isn't useful without an understanding of what
@ -31,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h" #include "bfd.h"
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h"
#include "coff/internal.h" #include "coff/internal.h"
#include "coff/rs6000.h" #include "coff/rs6000.h"
#include "libcoff.h" #include "libcoff.h"
@ -40,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
static boolean xcoff_mkobject PARAMS ((bfd *)); static boolean xcoff_mkobject PARAMS ((bfd *));
static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *)); static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *));
static boolean xcoff_is_local_label_name PARAMS ((bfd *, const char *));
static void xcoff_rtype2howto static void xcoff_rtype2howto
PARAMS ((arelent *, struct internal_reloc *)); PARAMS ((arelent *, struct internal_reloc *));
static reloc_howto_type *xcoff_reloc_type_lookup static reloc_howto_type *xcoff_reloc_type_lookup
@ -94,6 +94,7 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
bfd *obfd; bfd *obfd;
{ {
struct xcoff_tdata *ix, *ox; struct xcoff_tdata *ix, *ox;
asection *sec;
if (ibfd->xvec != obfd->xvec) if (ibfd->xvec != obfd->xvec)
return true; return true;
@ -101,14 +102,26 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
ox = xcoff_data (obfd); ox = xcoff_data (obfd);
ox->full_aouthdr = ix->full_aouthdr; ox->full_aouthdr = ix->full_aouthdr;
ox->toc = ix->toc; ox->toc = ix->toc;
if (ix->toc_section == NULL) if (ix->sntoc == 0)
ox->toc_section = NULL; ox->sntoc = 0;
else else
ox->toc_section = ix->toc_section->output_section; {
if (ix->entry_section == NULL) sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
ox->entry_section = NULL; if (sec == NULL)
ox->sntoc = 0;
else
ox->sntoc = sec->output_section->target_index;
}
if (ix->snentry == 0)
ox->snentry = 0;
else else
ox->entry_section = ix->entry_section->output_section; {
sec = coff_section_from_bfd_index (ibfd, ix->snentry);
if (sec == NULL)
ox->snentry = 0;
else
ox->snentry = sec->output_section->target_index;
}
ox->text_align_power = ix->text_align_power; ox->text_align_power = ix->text_align_power;
ox->data_align_power = ix->data_align_power; ox->data_align_power = ix->data_align_power;
ox->modtype = ix->modtype; ox->modtype = ix->modtype;
@ -117,6 +130,19 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
ox->maxstack = ix->maxstack; ox->maxstack = ix->maxstack;
return true; return true;
} }
/* I don't think XCOFF really has a notion of local labels based on
name. This will mean that ld -X doesn't actually strip anything.
The AIX native linker does not have a -X option, and it ignores the
-x option. */
static boolean
xcoff_is_local_label_name (abfd, name)
bfd *abfd;
const char *name;
{
return false;
}
/* The XCOFF reloc table. Actually, XCOFF relocations specify the /* The XCOFF reloc table. Actually, XCOFF relocations specify the
bitsize and whether they are signed or not, along with a bitsize and whether they are signed or not, along with a
@ -528,6 +554,7 @@ xcoff_reloc_type_lookup (abfd, code)
#define coff_mkobject xcoff_mkobject #define coff_mkobject xcoff_mkobject
#define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data #define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data
#define coff_bfd_is_local_label_name xcoff_is_local_label_name
#define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup #define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup
#define coff_relocate_section _bfd_ppc_xcoff_relocate_section #define coff_relocate_section _bfd_ppc_xcoff_relocate_section
@ -1384,7 +1411,7 @@ const bfd_target
BFD_JUMP_TABLE_RELOCS (coff), BFD_JUMP_TABLE_RELOCS (coff),
BFD_JUMP_TABLE_WRITE (coff), BFD_JUMP_TABLE_WRITE (coff),
BFD_JUMP_TABLE_LINK (_bfd_xcoff), BFD_JUMP_TABLE_LINK (_bfd_xcoff),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
COFF_SWAP_TABLE, COFF_SWAP_TABLE,
}; };

View File

@ -3114,8 +3114,7 @@ coff_close_and_cleanup (abfd)
return false; return false;
} }
/* We depend on bfd_close to free all the memory on the obstack. */ /* We depend on bfd_close to free all the memory on the objalloc. */
/* FIXME if bfd_release is not using obstacks! */
return true; return true;
} }

View File

@ -1,5 +1,5 @@
/* Routines to link ECOFF debugging information. /* Routines to link ECOFF debugging information.
Copyright 1993 Free Software Foundation, Inc. Copyright 1993, 94, 95, 96, 1997 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>. Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sysdep.h" #include "sysdep.h"
#include "bfdlink.h" #include "bfdlink.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h" #include "objalloc.h"
#include "aout/stab_gnu.h" #include "aout/stab_gnu.h"
#include "coff/internal.h" #include "coff/internal.h"
#include "coff/sym.h" #include "coff/sym.h"
@ -46,10 +46,9 @@ static boolean mk_fdrtab PARAMS ((bfd *,
const struct ecoff_debug_swap * const, const struct ecoff_debug_swap * const,
struct ecoff_find_line *)); struct ecoff_find_line *));
static long fdrtab_lookup PARAMS ((struct ecoff_find_line *, bfd_vma)); static long fdrtab_lookup PARAMS ((struct ecoff_find_line *, bfd_vma));
static boolean lookup_line
/* Obstack allocation and deallocation routines. */ PARAMS ((bfd *, struct ecoff_debug_info * const,
#define obstack_chunk_alloc malloc const struct ecoff_debug_swap * const, struct ecoff_find_line *));
#define obstack_chunk_free free
/* Routines to swap auxiliary information in and out. I am assuming /* Routines to swap auxiliary information in and out. I am assuming
that the auxiliary information format is always going to be target that the auxiliary information format is always going to be target
@ -392,8 +391,8 @@ struct accumulate
struct shuffle *rfd_end; struct shuffle *rfd_end;
/* The size of the largest file shuffle. */ /* The size of the largest file shuffle. */
unsigned long largest_file_shuffle; unsigned long largest_file_shuffle;
/* An obstack for debugging information. */ /* An objalloc for debugging information. */
struct obstack memory; struct objalloc *memory;
}; };
/* Add a file entry to a shuffle list. */ /* Add a file entry to a shuffle list. */
@ -426,8 +425,8 @@ add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
return true; return true;
} }
n = (struct shuffle *) obstack_alloc (&ainfo->memory, n = (struct shuffle *) objalloc_alloc (ainfo->memory,
sizeof (struct shuffle)); sizeof (struct shuffle));
if (!n) if (!n)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -465,8 +464,8 @@ add_memory_shuffle (ainfo, head, tail, data, size)
{ {
struct shuffle *n; struct shuffle *n;
n = (struct shuffle *) obstack_alloc (&ainfo->memory, n = (struct shuffle *) objalloc_alloc (ainfo->memory,
sizeof (struct shuffle)); sizeof (struct shuffle));
if (!n) if (!n)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -534,7 +533,8 @@ bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info)
output_debug->symbolic_header.issMax = 1; output_debug->symbolic_header.issMax = 1;
} }
if (!obstack_begin (&ainfo->memory, 4050)) ainfo->memory = objalloc_create ();
if (ainfo->memory == NULL)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
return NULL; return NULL;
@ -561,7 +561,7 @@ bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
if (! info->relocateable) if (! info->relocateable)
bfd_hash_table_free (&ainfo->str_hash.table); bfd_hash_table_free (&ainfo->str_hash.table);
obstack_free (&ainfo->memory, (PTR) NULL); objalloc_free (ainfo->memory);
free (ainfo); free (ainfo);
} }
@ -666,7 +666,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
* sizeof (RFDT))); * sizeof (RFDT)));
sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size; sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
rfd_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); rfd_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!input_debug->ifdmap || !rfd_out) if (!input_debug->ifdmap || !rfd_out)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -766,7 +766,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
/* Look through the FDR's and copy over all associated debugging /* Look through the FDR's and copy over all associated debugging
information. */ information. */
sz = copied * external_fdr_size; sz = copied * external_fdr_size;
fdr_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); fdr_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!fdr_out) if (!fdr_out)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -821,7 +821,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
out again. */ out again. */
fgotfilename = false; fgotfilename = false;
sz = fdr.csym * external_sym_size; sz = fdr.csym * external_sym_size;
sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); sym_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!sym_out) if (!sym_out)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -978,8 +978,8 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
output_symhdr->issMax += fdr.cbSs; output_symhdr->issMax += fdr.cbSs;
} }
if ((output_bfd->xvec->header_byteorder_big_p if ((output_bfd->xvec->header_byteorder
== input_bfd->xvec->header_byteorder_big_p) == input_bfd->xvec->header_byteorder)
&& input_debug->adjust == (struct ecoff_value_adjust *) NULL) && input_debug->adjust == (struct ecoff_value_adjust *) NULL)
{ {
/* The two BFD's have the same endianness, and we don't have /* The two BFD's have the same endianness, and we don't have
@ -1022,7 +1022,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
+ fdr.ipdFirst * insz); + fdr.ipdFirst * insz);
end = in + fdr.cpd * insz; end = in + fdr.cpd * insz;
sz = fdr.cpd * outsz; sz = fdr.cpd * outsz;
out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!out) if (!out)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -1063,7 +1063,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
+ fdr.ioptBase * insz); + fdr.ioptBase * insz);
end = in + fdr.copt * insz; end = in + fdr.copt * insz;
sz = fdr.copt * outsz; sz = fdr.copt * outsz;
out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!out) if (!out)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -1244,8 +1244,8 @@ bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
internal_sym.sc = scUndefined; internal_sym.sc = scUndefined;
internal_sym.index = indexNil; internal_sym.index = indexNil;
external_sym = (PTR) obstack_alloc (&ainfo->memory, external_sym = (PTR) objalloc_alloc (ainfo->memory,
output_swap->external_sym_size); output_swap->external_sym_size);
if (!external_sym) if (!external_sym)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -1264,8 +1264,8 @@ bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
the lang field to be langC. The fBigendian field will the lang field to be langC. The fBigendian field will
indicate little endian format, but it doesn't matter because indicate little endian format, but it doesn't matter because
it only applies to aux fields and there are none. */ it only applies to aux fields and there are none. */
external_fdr = (PTR) obstack_alloc (&ainfo->memory, external_fdr = (PTR) objalloc_alloc (ainfo->memory,
output_swap->external_fdr_size); output_swap->external_fdr_size);
if (!external_fdr) if (!external_fdr)
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
@ -1949,27 +1949,23 @@ fdrtab_lookup (line_info, offset)
return mid; return mid;
} }
/* Do the work of find_nearest_line. */ /* Look up a line given an address, storing the information in
LINE_INFO->cache. */
boolean static boolean
_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap, lookup_line (abfd, debug_info, debug_swap, line_info)
line_info, filename_ptr, functionname_ptr, retline_ptr)
bfd *abfd; bfd *abfd;
asection *section;
bfd_vma offset;
struct ecoff_debug_info * const debug_info; struct ecoff_debug_info * const debug_info;
const struct ecoff_debug_swap * const debug_swap; const struct ecoff_debug_swap * const debug_swap;
struct ecoff_find_line *line_info; struct ecoff_find_line *line_info;
const char **filename_ptr;
const char **functionname_ptr;
unsigned int *retline_ptr;
{ {
struct ecoff_fdrtab_entry *tab; struct ecoff_fdrtab_entry *tab;
bfd_vma offset;
boolean stabs; boolean stabs;
FDR *fdr_ptr; FDR *fdr_ptr;
int i; int i;
offset += section->vma; offset = line_info->cache.start;
/* Build FDR table (sorted by object file's base-address) if we /* Build FDR table (sorted by object file's base-address) if we
don't have it already. */ don't have it already. */
@ -2155,7 +2151,10 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
} }
lineno += delta; lineno += delta;
if (offset < count * 4) if (offset < count * 4)
break; {
line_info->cache.stop += count * 4 - offset;
break;
}
offset -= count * 4; offset -= count * 4;
} }
@ -2163,9 +2162,9 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
symbols, at least according to gdb/mipsread.c. */ symbols, at least according to gdb/mipsread.c. */
if (fdr_ptr->rss == -1) if (fdr_ptr->rss == -1)
{ {
*filename_ptr = NULL; line_info->cache.filename = NULL;
if (pdr.isym == -1) if (pdr.isym == -1)
*functionname_ptr = NULL; line_info->cache.functionname = NULL;
else else
{ {
EXTR proc_ext; EXTR proc_ext;
@ -2175,24 +2174,30 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
((char *) debug_info->external_ext ((char *) debug_info->external_ext
+ pdr.isym * debug_swap->external_ext_size), + pdr.isym * debug_swap->external_ext_size),
&proc_ext); &proc_ext);
*functionname_ptr = debug_info->ssext + proc_ext.asym.iss; line_info->cache.functionname = (debug_info->ssext
+ proc_ext.asym.iss);
} }
} }
else else
{ {
SYMR proc_sym; SYMR proc_sym;
*filename_ptr = debug_info->ss + fdr_ptr->issBase + fdr_ptr->rss; line_info->cache.filename = (debug_info->ss
+ fdr_ptr->issBase
+ fdr_ptr->rss);
(*debug_swap->swap_sym_in) (*debug_swap->swap_sym_in)
(abfd, (abfd,
((char *) debug_info->external_sym ((char *) debug_info->external_sym
+ (fdr_ptr->isymBase + pdr.isym) * debug_swap->external_sym_size), + ((fdr_ptr->isymBase + pdr.isym)
* debug_swap->external_sym_size)),
&proc_sym); &proc_sym);
*functionname_ptr = debug_info->ss + fdr_ptr->issBase + proc_sym.iss; line_info->cache.functionname = (debug_info->ss
+ fdr_ptr->issBase
+ proc_sym.iss);
} }
if (lineno == ilineNil) if (lineno == ilineNil)
lineno = 0; lineno = 0;
*retline_ptr = lineno; line_info->cache.line_num = lineno;
} }
else else
{ {
@ -2220,9 +2225,9 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
looking through the symbols until we find both a line number looking through the symbols until we find both a line number
and a function name which are beyond the address we want. */ and a function name which are beyond the address we want. */
*filename_ptr = NULL; line_info->cache.filename = NULL;
*functionname_ptr = NULL; line_info->cache.functionname = NULL;
*retline_ptr = 0; line_info->cache.line_num = 0;
directory_name = NULL; directory_name = NULL;
main_file_name = NULL; main_file_name = NULL;
@ -2300,12 +2305,12 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
{ {
low_line_vma = sym.value; low_line_vma = sym.value;
line_file_name = current_file_name; line_file_name = current_file_name;
*retline_ptr = sym.index; line_info->cache.line_num = sym.index;
} }
} }
} }
if (*retline_ptr != 0) if (line_info->cache.line_num != 0)
main_file_name = line_file_name; main_file_name = line_file_name;
/* We need to remove the stuff after the colon in the function /* We need to remove the stuff after the colon in the function
@ -2339,24 +2344,63 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
colon = strchr (buffer, ':'); colon = strchr (buffer, ':');
if (colon != NULL) if (colon != NULL)
*colon = '\0'; *colon = '\0';
*functionname_ptr = buffer; line_info->cache.functionname = buffer;
} }
if (main_file_name != NULL) if (main_file_name != NULL)
{ {
if (directory_name == NULL || main_file_name[0] == '/') if (directory_name == NULL || main_file_name[0] == '/')
*filename_ptr = main_file_name; line_info->cache.filename = main_file_name;
else else
{ {
sprintf (buffer + funclen, "%s%s", directory_name, sprintf (buffer + funclen, "%s%s", directory_name,
main_file_name); main_file_name);
*filename_ptr = buffer + funclen; line_info->cache.filename = buffer + funclen;
} }
} }
} }
return true; return true;
} }
/* Do the work of find_nearest_line. */
boolean
_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
line_info, filename_ptr, functionname_ptr, retline_ptr)
bfd *abfd;
asection *section;
bfd_vma offset;
struct ecoff_debug_info * const debug_info;
const struct ecoff_debug_swap * const debug_swap;
struct ecoff_find_line *line_info;
const char **filename_ptr;
const char **functionname_ptr;
unsigned int *retline_ptr;
{
offset += section->vma;
if (line_info->cache.sect == NULL
|| line_info->cache.sect != section
|| offset < line_info->cache.start
|| offset >= line_info->cache.stop)
{
line_info->cache.sect = section;
line_info->cache.start = offset;
line_info->cache.stop = offset;
if (! lookup_line (abfd, debug_info, debug_swap, line_info))
{
line_info->cache.sect = NULL;
return false;
}
}
*filename_ptr = line_info->cache.filename;
*functionname_ptr = line_info->cache.functionname;
*retline_ptr = line_info->cache.line_num;
return true;
}
/* These routines copy symbolic information into a memory buffer. /* These routines copy symbolic information into a memory buffer.

View File

@ -22,8 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h" #include "bfd.h"
#include "sysdep.h" #include "sysdep.h"
#include "objalloc.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h"
#ifndef S_IXUSR #ifndef S_IXUSR
#define S_IXUSR 0100 /* Execute by owner. */ #define S_IXUSR 0100 /* Execute by owner. */
@ -38,14 +38,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* fdopen is a loser -- we should use stdio exclusively. Unfortunately /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
if we do that we can't use fcntl. */ if we do that we can't use fcntl. */
/* FIXME: This is no longer used. */
#define obstack_chunk_alloc malloc
#define obstack_chunk_free free
#ifndef HAVE_GETPAGESIZE
#define getpagesize() 2048
#endif
long _bfd_chunksize = -1; long _bfd_chunksize = -1;
/* Return a new BFD. All BFD's are allocated through this routine. */ /* Return a new BFD. All BFD's are allocated through this routine. */
@ -55,25 +48,15 @@ _bfd_new_bfd ()
{ {
bfd *nbfd; bfd *nbfd;
nbfd = (bfd *)bfd_zmalloc (sizeof (bfd)); nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
if (!nbfd) if (nbfd == NULL)
return 0; return NULL;
if (_bfd_chunksize <= 0) nbfd->memory = (PTR) objalloc_create ();
{ if (nbfd->memory == NULL)
_bfd_chunksize = getpagesize ();
if (_bfd_chunksize <= 0)
_bfd_chunksize = 2048;
/* Leave some slush space, since many malloc implementations
prepend a header, and may wind up wasting another page
because of it. */
_bfd_chunksize -= 32;
}
if (!obstack_begin(&nbfd->memory, _bfd_chunksize))
{ {
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
return 0; return NULL;
} }
nbfd->arch_info = &bfd_default_arch_struct; nbfd->arch_info = &bfd_default_arch_struct;
@ -81,14 +64,14 @@ _bfd_new_bfd ()
nbfd->direction = no_direction; nbfd->direction = no_direction;
nbfd->iostream = NULL; nbfd->iostream = NULL;
nbfd->where = 0; nbfd->where = 0;
nbfd->sections = (asection *)NULL; nbfd->sections = (asection *) NULL;
nbfd->format = bfd_unknown; nbfd->format = bfd_unknown;
nbfd->my_archive = (bfd *)NULL; nbfd->my_archive = (bfd *) NULL;
nbfd->origin = 0; nbfd->origin = 0;
nbfd->opened_once = false; nbfd->opened_once = false;
nbfd->output_has_begun = false; nbfd->output_has_begun = false;
nbfd->section_count = 0; nbfd->section_count = 0;
nbfd->usrdata = (PTR)NULL; nbfd->usrdata = (PTR) NULL;
nbfd->cacheable = false; nbfd->cacheable = false;
nbfd->flags = BFD_NO_FLAGS; nbfd->flags = BFD_NO_FLAGS;
nbfd->mtime_set = false; nbfd->mtime_set = false;
@ -104,7 +87,7 @@ _bfd_new_bfd_contained_in (obfd)
{ {
bfd *nbfd; bfd *nbfd;
nbfd = _bfd_new_bfd(); nbfd = _bfd_new_bfd ();
nbfd->xvec = obfd->xvec; nbfd->xvec = obfd->xvec;
nbfd->my_archive = obfd; nbfd->my_archive = obfd;
nbfd->direction = read_direction; nbfd->direction = read_direction;
@ -144,28 +127,34 @@ bfd_openr (filename, target)
bfd *nbfd; bfd *nbfd;
const bfd_target *target_vec; const bfd_target *target_vec;
nbfd = _bfd_new_bfd(); nbfd = _bfd_new_bfd ();
if (nbfd == NULL) if (nbfd == NULL)
return NULL; return NULL;
target_vec = bfd_find_target (target, nbfd); target_vec = bfd_find_target (target, nbfd);
if (target_vec == NULL) { if (target_vec == NULL)
bfd_set_error (bfd_error_invalid_target); {
return NULL; objalloc_free ((struct objalloc *) nbfd->memory);
} free (nbfd);
bfd_set_error (bfd_error_invalid_target);
return NULL;
}
nbfd->filename = filename; nbfd->filename = filename;
nbfd->direction = read_direction; nbfd->direction = read_direction;
if (bfd_open_file (nbfd) == NULL) { if (bfd_open_file (nbfd) == NULL)
bfd_set_error (bfd_error_system_call); /* File didn't exist, or some such */ {
bfd_release(nbfd,0); /* File didn't exist, or some such */
return NULL; bfd_set_error (bfd_error_system_call);
} objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
return nbfd; return nbfd;
} }
/* Don't try to `optimize' this function: /* Don't try to `optimize' this function:
o - We lock using stack space so that interrupting the locking o - We lock using stack space so that interrupting the locking
@ -218,16 +207,19 @@ bfd_fdopenr (filename, target, fd)
#endif #endif
if (fdflags == -1) return NULL; if (fdflags == -1) return NULL;
nbfd = _bfd_new_bfd(); nbfd = _bfd_new_bfd ();
if (nbfd == NULL) if (nbfd == NULL)
return NULL; return NULL;
target_vec = bfd_find_target (target, nbfd); target_vec = bfd_find_target (target, nbfd);
if (target_vec == NULL) { if (target_vec == NULL)
bfd_set_error (bfd_error_invalid_target); {
return NULL; bfd_set_error (bfd_error_invalid_target);
} objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
#if defined(VMS) || defined(__GO32__) #if defined(VMS) || defined(__GO32__)
nbfd->iostream = (PTR)fopen(filename, FOPEN_RB); nbfd->iostream = (PTR)fopen(filename, FOPEN_RB);
#else #else
@ -239,10 +231,13 @@ bfd_fdopenr (filename, target, fd)
default: abort (); default: abort ();
} }
#endif #endif
if (nbfd->iostream == NULL) {
(void) obstack_free (&nbfd->memory, (PTR)0); if (nbfd->iostream == NULL)
return NULL; {
} objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
/* OK, put everything where it belongs */ /* OK, put everything where it belongs */
@ -252,15 +247,20 @@ bfd_fdopenr (filename, target, fd)
be written through, although doing so requires that we end be written through, although doing so requires that we end
the previous clause with a preposition. */ the previous clause with a preposition. */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug */ /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
switch (fdflags & (O_ACCMODE)) { switch (fdflags & O_ACCMODE)
case O_RDONLY: nbfd->direction = read_direction; break; {
case O_WRONLY: nbfd->direction = write_direction; break; case O_RDONLY: nbfd->direction = read_direction; break;
case O_RDWR: nbfd->direction = both_direction; break; case O_WRONLY: nbfd->direction = write_direction; break;
default: abort (); case O_RDWR: nbfd->direction = both_direction; break;
} default: abort ();
}
if (! bfd_cache_init (nbfd)) if (! bfd_cache_init (nbfd))
return NULL; {
objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
nbfd->opened_once = true; nbfd->opened_once = true;
return nbfd; return nbfd;
@ -296,6 +296,8 @@ bfd_openstreamr (filename, target, stream)
if (target_vec == NULL) if (target_vec == NULL)
{ {
bfd_set_error (bfd_error_invalid_target); bfd_set_error (bfd_error_invalid_target);
objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL; return NULL;
} }
@ -304,7 +306,11 @@ bfd_openstreamr (filename, target, stream)
nbfd->direction = read_direction; nbfd->direction = read_direction;
if (! bfd_cache_init (nbfd)) if (! bfd_cache_init (nbfd))
return NULL; {
objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
return nbfd; return nbfd;
} }
@ -342,21 +348,29 @@ bfd_openw (filename, target)
/* nbfd has to point to head of malloc'ed block so that bfd_close may /* nbfd has to point to head of malloc'ed block so that bfd_close may
reclaim it correctly. */ reclaim it correctly. */
nbfd = _bfd_new_bfd(); nbfd = _bfd_new_bfd ();
if (nbfd == NULL) if (nbfd == NULL)
return NULL; return NULL;
target_vec = bfd_find_target (target, nbfd); target_vec = bfd_find_target (target, nbfd);
if (target_vec == NULL) return NULL; if (target_vec == NULL)
{
objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
}
nbfd->filename = filename; nbfd->filename = filename;
nbfd->direction = write_direction; nbfd->direction = write_direction;
if (bfd_open_file (nbfd) == NULL) { if (bfd_open_file (nbfd) == NULL)
bfd_set_error (bfd_error_system_call); /* File not writeable, etc */ {
(void) obstack_free (&nbfd->memory, (PTR)0); bfd_set_error (bfd_error_system_call); /* File not writeable, etc */
return NULL; objalloc_free ((struct objalloc *) nbfd->memory);
free (nbfd);
return NULL;
} }
return nbfd; return nbfd;
} }
@ -375,7 +389,7 @@ DESCRIPTION
and closed. If the created file is executable, then and closed. If the created file is executable, then
<<chmod>> is called to mark it as such. <<chmod>> is called to mark it as such.
All memory attached to the BFD's obstacks is released. All memory attached to the BFD is released.
The file descriptor associated with the BFD is closed (even The file descriptor associated with the BFD is closed (even
if it was passed in to BFD by <<bfd_fdopenr>>). if it was passed in to BFD by <<bfd_fdopenr>>).
@ -420,8 +434,8 @@ bfd_close (abfd)
} }
} }
(void) obstack_free (&abfd->memory, (PTR)0); objalloc_free ((struct objalloc *) abfd->memory);
(void) free (abfd); free (abfd);
return ret; return ret;
} }
@ -442,7 +456,7 @@ DESCRIPTION
If the created file is executable, then <<chmod>> is called If the created file is executable, then <<chmod>> is called
to mark it as such. to mark it as such.
All memory attached to the BFD's obstacks is released. All memory attached to the BFD is released.
RETURNS RETURNS
<<true>> is returned if all is ok, otherwise <<false>>. <<true>> is returned if all is ok, otherwise <<false>>.
@ -474,39 +488,13 @@ bfd_close_all_done (abfd)
& (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask)))); & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
} }
} }
(void) obstack_free (&abfd->memory, (PTR)0);
(void) free(abfd); objalloc_free ((struct objalloc *) abfd->memory);
free (abfd);
return ret; return ret;
} }
/*
FUNCTION
bfd_alloc_size
SYNOPSIS
bfd_size_type bfd_alloc_size(bfd *abfd);
DESCRIPTION
Return the number of bytes in the obstacks connected to @var{abfd}.
*/
bfd_size_type
bfd_alloc_size (abfd)
bfd *abfd;
{
struct _obstack_chunk *chunk = abfd->memory.chunk;
size_t size = 0;
while (chunk) {
size += chunk->limit - &(chunk->contents[0]);
chunk = chunk->prev;
}
return size;
}
/* /*
FUNCTION FUNCTION
bfd_create bfd_create
@ -527,15 +515,16 @@ bfd_create (filename, templ)
CONST char *filename; CONST char *filename;
bfd *templ; bfd *templ;
{ {
bfd *nbfd = _bfd_new_bfd(); bfd *nbfd;
if (nbfd == (bfd *)NULL)
return (bfd *)NULL; nbfd = _bfd_new_bfd ();
if (nbfd == NULL)
return NULL;
nbfd->filename = filename; nbfd->filename = filename;
if(templ) { if (templ)
nbfd->xvec = templ->xvec; nbfd->xvec = templ->xvec;
}
nbfd->direction = no_direction; nbfd->direction = no_direction;
bfd_set_format(nbfd, bfd_object); bfd_set_format (nbfd, bfd_object);
return nbfd; return nbfd;
} }
@ -547,8 +536,8 @@ SYNOPSIS
PTR bfd_alloc (bfd *abfd, size_t wanted); PTR bfd_alloc (bfd *abfd, size_t wanted);
DESCRIPTION DESCRIPTION
Allocate a block of @var{wanted} bytes of memory in the obstack Allocate a block of @var{wanted} bytes of memory attached to
attached to <<abfd>> and return a pointer to it. <<abfd>> and return a pointer to it.
*/ */
@ -559,7 +548,7 @@ bfd_alloc (abfd, size)
{ {
PTR ret; PTR ret;
ret = obstack_alloc (&(abfd->memory), size); ret = objalloc_alloc (abfd->memory, (unsigned long) size);
if (ret == NULL) if (ret == NULL)
bfd_set_error (bfd_error_no_memory); bfd_set_error (bfd_error_no_memory);
return ret; return ret;
@ -571,8 +560,19 @@ bfd_zalloc (abfd, size)
size_t size; size_t size;
{ {
PTR res; PTR res;
res = bfd_alloc(abfd, size);
res = bfd_alloc (abfd, size);
if (res) if (res)
memset(res, 0, (size_t)size); memset (res, 0, size);
return res; return res;
} }
/* Free a block allocated for a BFD. */
void
bfd_release (abfd, block)
bfd *abfd;
PTR block;
{
objalloc_free_block ((struct objalloc *) abfd->memory, block);
}

View File

@ -88,7 +88,7 @@ SUBSECTION
| process_symbol (symbol_table[i]); | process_symbol (symbol_table[i]);
| } | }
All storage for the symbols themselves is in an obstack All storage for the symbols themselves is in an objalloc
connected to the BFD; it is freed when the BFD is closed. connected to the BFD; it is freed when the BFD is closed.
@ -352,6 +352,8 @@ bfd_is_local_label (abfd, sym)
{ {
if ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0) if ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
return false; return false;
if (sym->name == NULL)
return false;
return bfd_is_local_label_name (abfd, sym->name); return bfd_is_local_label_name (abfd, sym->name);
} }