aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog31
-rw-r--r--bfd/Makefile.in34
-rw-r--r--bfd/VERSION2
-rw-r--r--bfd/aoutx.h9
-rw-r--r--bfd/bfd-in2.h18
-rw-r--r--bfd/coff-a29k.c3
-rw-r--r--bfd/coff-ppc.c584
-rw-r--r--bfd/coff-rs6000.c45
-rw-r--r--bfd/coffcode.h3
-rw-r--r--bfd/ecofflink.c146
-rw-r--r--bfd/opncls.c218
-rw-r--r--bfd/syms.c4
12 files changed, 396 insertions, 701 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b459de0..7b71d22 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,36 @@
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.
* libbfd-in.h (bfd_alloc_grow, bfd_alloc_finish): Don't declare.
* libbfd.h: Rebuild.
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index ada0662..628e820 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -1,5 +1,5 @@
# 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.
# Written by Cygnus Support.
#
@@ -116,9 +116,7 @@ ALL_MACHINES = \
cpu-arc.o \
$(end-sanitize-arc) \
cpu-arm.o \
- $(start-sanitize-d10v) \
cpu-d10v.o \
- $(end-sanitize-d10v) \
$(start-sanitize-d30v) \
cpu-d30v.o \
$(end-sanitize-d30v) \
@@ -220,9 +218,7 @@ BFD32_BACKENDS = \
$(start-sanitize-arc) \
elf32-arc.o \
$(end-sanitize-arc) \
- $(start-sanitize-d10v) \
elf32-d10v.o \
- $(end-sanitize-d10v) \
$(start-sanitize-d30v) \
elf32-d30v.o \
$(end-sanitize-d30v) \
@@ -567,10 +563,10 @@ $(SHLINK): $(SHLIB)
ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed -e '$(program_transform_name)'`; \
if [ "$$ts" != "$(SHLIB)" ]; then \
rm -f $$ts; \
- ln -sf $(SHLIB) $$ts; \
+ ln -s $(SHLIB) $$ts; \
else true; fi
rm -f $(SHLINK)
- ln -sf $(SHLIB) $(SHLINK)
+ ln -s $(SHLIB) $(SHLINK)
# This target creates libTARGET-bfd.so.VERSION as a symlink to
# 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)'`; \
if [ "$$tf" != "$(SHLIB)" ]; then \
rm -f $$tf; \
- ln -sf $(SHLIB) $$tf; \
+ ln -s $(SHLIB) $$tf; \
else true; fi
touch stamp-tshlink
@@ -655,7 +651,7 @@ clobber maintainer-clean realclean:
$(MAKE) subdir_do DO=maintainer-clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS)
$(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
$(BFD_LIBS): $(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; \
if [ "$$f" = "$(SHLINK)" ]; then \
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 \
@INSTALL_SHLIB@ \
else \
@@ -738,13 +734,11 @@ install: $(ALLLIBS)
$(INSTALL_DATA) $(BFD_H) $(includedir)/bfd.h
$(INSTALL_DATA) $(INCDIR)/ansidecl.h $(includedir)/ansidecl.h
$(INSTALL_DATA) $(INCDIR)/bfdlink.h $(includedir)/bfdlink.h
- $(INSTALL_DATA) $(INCDIR)/obstack.h $(includedir)/obstack.h
-if test -z "$(oldincludedir)"; then true; else \
test -d $(oldincludedir) || mkdir $(oldincludedir); \
$(INSTALL_DATA) $(BFD_H) $(oldincludedir)/bfd.h; \
$(INSTALL_DATA) $(INCDIR)/ansidecl.h $(oldincludedir)/ansidecl.h; \
$(INSTALL_DATA) $(INCDIR)/bfdlink.h $(oldincludedir)/bfdlink.h; \
- $(INSTALL_DATA) $(INCDIR)/obstack.h $(oldincludedir)/obstack.h; \
fi
$(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
end-sanitize-arc:
-start-sanitize-d10v:
elf32-d10v.o: elf32-d10v.c elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
elf32-target.h
-end-sanitize-d10v:
start-sanitize-d30v:
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
init.o: init.c
libbfd.o: libbfd.c
-opncls.o: opncls.c
+opncls.o: opncls.c $(INCDIR)/objalloc.h
reloc.o: reloc.c $(INCDIR)/bfdlink.h
section.o: section.c
syms.o: syms.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \
$(INCDIR)/aout/stab.def
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
elf.o: elf.c $(INCDIR)/bfdlink.h elf-bfd.h $(INCDIR)/elf/common.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 \
$(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \
libcoff.h libecoff.h
-ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \
- $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \
- $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h
+ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/objalloc.h \
+ $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.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 \
$(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.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
elf32.o: elf32.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.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 \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.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
elf64.o: elf64.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.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-egsd.o: evax-egsd.c $(INCDIR)/bfdlink.h evax.h
evax-etir.o: evax-etir.c $(INCDIR)/bfdlink.h evax.h
diff --git a/bfd/VERSION b/bfd/VERSION
index c3be8ac..b9a40b7 100644
--- a/bfd/VERSION
+++ b/bfd/VERSION
@@ -1 +1 @@
-cygnus-2.7.2
+cygnus-2.7.3
diff --git a/bfd/aoutx.h b/bfd/aoutx.h
index df6d34a..f99383d 100644
--- a/bfd/aoutx.h
+++ b/bfd/aoutx.h
@@ -1,5 +1,5 @@
/* 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.
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;
#else
/* 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. */
syms = ((struct external_nlist *)
bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
@@ -4263,10 +4263,7 @@ aout_link_write_symbols (finfo, input_bfd)
break;
case discard_l:
if ((type & N_STAB) == 0
- && *name == *finfo->info->lprefix
- && (finfo->info->lprefix_len == 1
- || strncmp (name, finfo->info->lprefix,
- finfo->info->lprefix_len) == 0))
+ && bfd_is_local_label_name (input_bfd, name))
skip = true;
break;
case discard_all:
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 631348a..bcead95 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -49,7 +49,6 @@ extern "C" {
#endif
#include "ansidecl.h"
-#include "obstack.h"
/* These two lines get substitutions done by commands in Makefile.in. */
#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_table *,
const char *));
- /* An obstack for this hash table. */
- struct obstack memory;
+ /* An objalloc for this hash table. This is a struct objalloc *,
+ but we use PTR to avoid requiring the inclusion of objalloc.h. */
+ PTR memory;
};
/* Initialize a hash table. */
@@ -710,9 +710,6 @@ bfd_close PARAMS ((bfd *abfd));
boolean
bfd_close_all_done PARAMS ((bfd *));
-bfd_size_type
-bfd_alloc_size PARAMS ((bfd *abfd));
-
bfd *
bfd_create PARAMS ((CONST char *filename, bfd *templ));
@@ -2263,8 +2260,10 @@ struct _bfd
/* Used by the application to hold private data*/
PTR usrdata;
- /* Where all the allocated stuff under this BFD goes */
- struct obstack memory;
+ /* Where all the allocated stuff under this BFD goes. This is a
+ struct objalloc *, but we use PTR to avoid requiring the inclusion of
+ objalloc.h. */
+ PTR memory;
};
typedef enum bfd_error
@@ -2731,6 +2730,9 @@ CAT(NAME,_canonicalize_dynamic_reloc)
PTR backend_data;
} bfd_target;
+boolean
+bfd_set_default_target PARAMS ((const char *name));
+
const bfd_target *
bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd));
diff --git a/bfd/coff-a29k.c b/bfd/coff-a29k.c
index 3ceabfb..b1d15dc 100644
--- a/bfd/coff-a29k.c
+++ b/bfd/coff-a29k.c
@@ -1,5 +1,5 @@
/* 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.
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 "sysdep.h"
#include "libbfd.h"
-#include "obstack.h"
#include "coff/a29k.h"
#include "coff/internal.h"
#include "libcoff.h"
diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c
index b6a23c7..e93be51 100644
--- a/bfd/coff-ppc.c
+++ b/bfd/coff-ppc.c
@@ -1,5 +1,5 @@
/* 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)
@@ -36,7 +36,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "sysdep.h"
#include "libbfd.h"
-#include "obstack.h"
#include "coff/powerpc.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 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
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 */
int symbol_is_glue;
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. */
@@ -140,7 +156,8 @@ ppc_coff_link_hash_newfunc (entry, table, string)
SET_UNALLOCATED(ret->toc_offset);
ret->symbol_is_glue = 0;
ret->glue_insn = 0;
- strcpy(ret->eye_catcher, EYE);
+
+ HASH_CHECK_INIT(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 */
-/* use the complete range of a 16-bit displacement (I guess). We have */
-/* to adjust for this when we fix up loads displaced off the toc reg. */
+/* use the complete range of a 16-bit displacement. We have to adjust */
+/* for this when we fix up loads displaced off the toc reg. */
#define TOC_LOAD_ADJUSTMENT (-32768)
#define TOC_SECTION_NAME ".private.toc"
@@ -852,7 +869,7 @@ record_toc(toc_section, our_toc_offset, cat, name)
#ifdef COFF_IMAGE_WITH_PE
/* record a toc offset against a symbol */
-static int
+static boolean
ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
bfd *abfd;
struct bfd_link_info *info;
@@ -861,7 +878,6 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
enum toc_type toc_kind;
{
struct ppc_coff_link_hash_entry *h;
- int ret_val;
const char *name;
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]);
if (h != 0)
{
- CHECK_EYE(h->eye_catcher);
+ HASH_CHECK(h);
}
if (h == 0)
@@ -896,31 +912,15 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
if (IS_UNALLOCATED(local_syms[sym]))
{
local_syms[sym] = global_toc_size;
- ret_val = global_toc_size;
global_toc_size += 4;
/* The size must fit in a 16bit displacment */
- if (global_toc_size >= 65535)
+ if (global_toc_size > 65535)
{
- fprintf(stderr,
- "Exceeded toc size of 65535\n");
- abort();
+ (*_bfd_error_handler) ("TOC overflow");
+ bfd_set_error (bfd_error_file_too_big);
+ 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
@@ -932,155 +932,21 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
if (IS_UNALLOCATED(h->toc_offset))
{
h->toc_offset = global_toc_size;
- ret_val = global_toc_size;
global_toc_size += 4;
/* The size must fit in a 16bit displacment */
if (global_toc_size >= 65535)
{
- fprintf(stderr,
- "Exceeded toc size of 65535\n");
- abort();
- }
-
-#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]);
+ (*_bfd_error_handler) ("TOC overflow");
+ bfd_set_error (bfd_error_file_too_big);
+ return false;
}
}
-
- 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 */
static void
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;
h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-#ifdef DEBUG_RELOC
- fprintf(stderr,
- "ppc_mark_symbol_as_glue:\n");
-#endif
- CHECK_EYE(h->eye_catcher);
+
+ HASH_CHECK(h);
h->symbol_is_glue = 1;
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 */
-#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
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 long addr = reloc_entry->address ; /*+ input_section->vma*/
- fprintf(stderr, "pe_ppc_reloc (%s)\n", TARGET_LITTLE_NAME);
-
r_type = reloc_entry->howto->type;
if (output_bfd)
@@ -1240,15 +1075,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_vma relocation;
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
thing. The caller will take care of adjusting the reloc
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_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;
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]);
if (h != 0)
{
- CHECK_EYE(h->eye_catcher);
+ HASH_CHECK(h);
}
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)
{
- fprintf(stderr,
- "relocate_section: IMGLUE reloc has no name!\n");
+ /* An IMGLUE reloc must have a name. Something is very wrong. */
abort();
}
@@ -1340,7 +1148,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- CHECK_EYE(h->eye_catcher);
+ HASH_CHECK(h);
if (h->root.root.type == bfd_link_hash_defined
|| 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)
{
default:
- fprintf( stderr,
- "ERROR: during reloc processing -- unsupported reloc %s\n",
- howto->name);
+ (*_bfd_error_handler)
+ ("%s: unsupported relocation type 0x%02x",
+ bfd_get_filename (input_bfd), r_type);
bfd_set_error (bfd_error_bad_value);
- abort();
return false;
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_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 )
{
- fprintf(stderr, "No Toc section!\n");
+ /* There is no toc section. Something is very wrong. */
abort();
}
}
@@ -1423,27 +1223,14 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
again.
*/
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
{
/* write out the toc entry */
- record_toc(toc_section, our_toc_offset, priv, strdup(name));
-#ifdef TOC_DEBUG
- 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
+ record_toc(toc_section,
+ our_toc_offset,
+ priv,
+ strdup(name));
bfd_put_32(output_bfd,
val,
@@ -1475,29 +1262,19 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
dll linkage, takes advantage of that and considers
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 -
(toc_section->output_section->vma +
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 */
if (our_toc_offset >= 65535)
{
- fprintf(stderr,
- "Error: TOCDEFN Relocation of %d for %s exceeded displacement of 65535\n", our_toc_offset, name);
- abort();
+ (*_bfd_error_handler)
+ ("%s: Relocation for %s of %x exceeds Toc size limit",
+ 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));
@@ -1509,28 +1286,11 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
again.
*/
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
{
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 */
bfd_put_32(output_bfd,
val,
@@ -1558,10 +1318,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (coff_data(output_bfd)->pe)
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);
}
@@ -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 &&
our_toc_offset > toc_section->_raw_size)
{
- fprintf(stderr,
- "reloc offset is bigger than the toc size!\n");
- abort();
+ (*_bfd_error_handler)
+ ("%s: Relocation exceeds allocated TOC (%x)",
+ 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 */
@@ -1645,15 +1404,13 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
if (h->symbol_is_glue == 1)
break;
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:
{
@@ -1684,12 +1441,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
"__idata4_magic__",
false, false, true);
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)
@@ -1718,7 +1469,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
false, false, true);
if (myh == 0)
{
- fprintf(stderr, "Missing idata magic cookies, this cannot work anyway...\n");
+ /* Missing magic cookies. Something is very wrong. */
abort();
}
@@ -1745,13 +1496,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
"__idata4_magic__",
false, false, true);
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)
{
-#ifdef DEBUG_RELOC
- bfd_vma before_addr = addr;
-#endif
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);
}
}
@@ -1844,28 +1577,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
buf[SYMNMLEN] = '\0';
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)
(info, name, howto->name,
(bfd_vma) 0, input_bfd,
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;
}
}
@@ -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;
}
@@ -1965,15 +1673,14 @@ ppc_allocate_toc_section (info)
if (bfd_of_toc_owner == 0)
{
- fprintf(stderr,
- "There is no bfd that owns the toc section!\n");
+ /* No toc owner? Something is very wrong. */
abort();
}
s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
if (s == NULL)
{
- fprintf(stderr, "No Toc section!\n");
+ /* No toc section? Something is very wrong. */
abort();
}
@@ -1994,12 +1701,6 @@ ppc_process_before_allocation (abfd, info)
asection *sec;
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
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)
{
- 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)
continue;
@@ -2038,46 +1730,20 @@ ppc_process_before_allocation (abfd, info)
{
unsigned short r_type = EXTRACT_TYPE (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);
switch(r_type)
{
case IMAGE_REL_PPC_TOCREL16:
-#if 0
- /* FIXME:
- 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 TOCDEFN is on, ignore as someone else has allocated the
+ toc entry */
if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
- toc_offset = ppc_record_toc_entry(abfd, info, sec,
- rel->r_symndx, default_toc);
+ ok = ppc_record_toc_entry(abfd, info, sec,
+ rel->r_symndx, default_toc);
+ if (!ok)
+ return false;
break;
case IMAGE_REL_PPC_IMGLUE:
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. */
if ( r_type > MAX_RELOC_INDEX )
- {
- fprintf(stderr,
- "ppc_coff_rtype2howto: reloc index %d out of range [%d, %ld]\n",
- internal->r_type, 0, (long) MAX_RELOC_INDEX);
- abort();
- }
+ abort();
/* check for absolute crap */
if ( junk != 0 )
- {
- 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
+ abort();
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. */
if ( r_type > MAX_RELOC_INDEX )
- {
- fprintf(stderr,
- "coff_ppc_rtype_to_howto: index %d out of range [%d, %ld]\n",
- r_type, 0, (long) MAX_RELOC_INDEX);
- abort();
- }
+ abort();
/* check for absolute crap */
if ( junk != 0 )
- {
- 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
-
+ abort();
+
switch(r_type)
{
case IMAGE_REL_PPC_ADDR32NB:
@@ -2528,12 +2140,6 @@ ppc_coff_reloc_type_lookup (abfd, code)
bfd *abfd;
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)
{
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 ;
-#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);
if (s == NULL
|| !bfd_set_section_flags (abfd, s, flags)
|| !bfd_set_section_alignment (abfd, s, 2))
{
- fprintf(stderr,
- "toc section allocation failed!\n");
+ /* FIXME: set appropriate bfd error */
abort();
}
@@ -2738,7 +2337,10 @@ ppc_bfd_coff_final_link (abfd, info)
/* Compute the file positions for all the sections. */
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
output file. Set the file positions for the relocs. */
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index 8389060..ba879d2 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -1,5 +1,5 @@
/* 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?
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
@@ -31,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
-#include "obstack.h"
#include "coff/internal.h"
#include "coff/rs6000.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_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean xcoff_is_local_label_name PARAMS ((bfd *, const char *));
static void xcoff_rtype2howto
PARAMS ((arelent *, struct internal_reloc *));
static reloc_howto_type *xcoff_reloc_type_lookup
@@ -94,6 +94,7 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
bfd *obfd;
{
struct xcoff_tdata *ix, *ox;
+ asection *sec;
if (ibfd->xvec != obfd->xvec)
return true;
@@ -101,14 +102,26 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
ox = xcoff_data (obfd);
ox->full_aouthdr = ix->full_aouthdr;
ox->toc = ix->toc;
- if (ix->toc_section == NULL)
- ox->toc_section = NULL;
+ if (ix->sntoc == 0)
+ ox->sntoc = 0;
else
- ox->toc_section = ix->toc_section->output_section;
- if (ix->entry_section == NULL)
- ox->entry_section = NULL;
+ {
+ sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
+ if (sec == NULL)
+ ox->sntoc = 0;
+ else
+ ox->sntoc = sec->output_section->target_index;
+ }
+ if (ix->snentry == 0)
+ ox->snentry = 0;
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->data_align_power = ix->data_align_power;
ox->modtype = ix->modtype;
@@ -117,6 +130,19 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
ox->maxstack = ix->maxstack;
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
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_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_relocate_section _bfd_ppc_xcoff_relocate_section
@@ -1384,7 +1411,7 @@ const bfd_target
BFD_JUMP_TABLE_RELOCS (coff),
BFD_JUMP_TABLE_WRITE (coff),
BFD_JUMP_TABLE_LINK (_bfd_xcoff),
- BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+ BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
COFF_SWAP_TABLE,
};
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 948165e..7679a44 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -3114,8 +3114,7 @@ coff_close_and_cleanup (abfd)
return false;
}
- /* We depend on bfd_close to free all the memory on the obstack. */
- /* FIXME if bfd_release is not using obstacks! */
+ /* We depend on bfd_close to free all the memory on the objalloc. */
return true;
}
diff --git a/bfd/ecofflink.c b/bfd/ecofflink.c
index af84d20..7982945 100644
--- a/bfd/ecofflink.c
+++ b/bfd/ecofflink.c
@@ -1,5 +1,5 @@
/* 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>.
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 "bfdlink.h"
#include "libbfd.h"
-#include "obstack.h"
+#include "objalloc.h"
#include "aout/stab_gnu.h"
#include "coff/internal.h"
#include "coff/sym.h"
@@ -46,10 +46,9 @@ static boolean mk_fdrtab PARAMS ((bfd *,
const struct ecoff_debug_swap * const,
struct ecoff_find_line *));
static long fdrtab_lookup PARAMS ((struct ecoff_find_line *, bfd_vma));
-
-/* Obstack allocation and deallocation routines. */
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
+static boolean lookup_line
+ PARAMS ((bfd *, struct ecoff_debug_info * const,
+ const struct ecoff_debug_swap * const, struct ecoff_find_line *));
/* Routines to swap auxiliary information in and out. I am assuming
that the auxiliary information format is always going to be target
@@ -392,8 +391,8 @@ struct accumulate
struct shuffle *rfd_end;
/* The size of the largest file shuffle. */
unsigned long largest_file_shuffle;
- /* An obstack for debugging information. */
- struct obstack memory;
+ /* An objalloc for debugging information. */
+ struct objalloc *memory;
};
/* Add a file entry to a shuffle list. */
@@ -426,8 +425,8 @@ add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
return true;
}
- n = (struct shuffle *) obstack_alloc (&ainfo->memory,
- sizeof (struct shuffle));
+ n = (struct shuffle *) objalloc_alloc (ainfo->memory,
+ sizeof (struct shuffle));
if (!n)
{
bfd_set_error (bfd_error_no_memory);
@@ -465,8 +464,8 @@ add_memory_shuffle (ainfo, head, tail, data, size)
{
struct shuffle *n;
- n = (struct shuffle *) obstack_alloc (&ainfo->memory,
- sizeof (struct shuffle));
+ n = (struct shuffle *) objalloc_alloc (ainfo->memory,
+ sizeof (struct shuffle));
if (!n)
{
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;
}
- if (!obstack_begin (&ainfo->memory, 4050))
+ ainfo->memory = objalloc_create ();
+ if (ainfo->memory == NULL)
{
bfd_set_error (bfd_error_no_memory);
return NULL;
@@ -561,7 +561,7 @@ bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
if (! info->relocateable)
bfd_hash_table_free (&ainfo->str_hash.table);
- obstack_free (&ainfo->memory, (PTR) NULL);
+ objalloc_free (ainfo->memory);
free (ainfo);
}
@@ -666,7 +666,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
* sizeof (RFDT)));
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)
{
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
information. */
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)
{
bfd_set_error (bfd_error_no_memory);
@@ -821,7 +821,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
out again. */
fgotfilename = false;
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)
{
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;
}
- if ((output_bfd->xvec->header_byteorder_big_p
- == input_bfd->xvec->header_byteorder_big_p)
+ if ((output_bfd->xvec->header_byteorder
+ == input_bfd->xvec->header_byteorder)
&& input_debug->adjust == (struct ecoff_value_adjust *) NULL)
{
/* 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);
end = in + fdr.cpd * insz;
sz = fdr.cpd * outsz;
- out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+ out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!out)
{
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);
end = in + fdr.copt * insz;
sz = fdr.copt * outsz;
- out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+ out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
if (!out)
{
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.index = indexNil;
- external_sym = (PTR) obstack_alloc (&ainfo->memory,
- output_swap->external_sym_size);
+ external_sym = (PTR) objalloc_alloc (ainfo->memory,
+ output_swap->external_sym_size);
if (!external_sym)
{
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
indicate little endian format, but it doesn't matter because
it only applies to aux fields and there are none. */
- external_fdr = (PTR) obstack_alloc (&ainfo->memory,
- output_swap->external_fdr_size);
+ external_fdr = (PTR) objalloc_alloc (ainfo->memory,
+ output_swap->external_fdr_size);
if (!external_fdr)
{
bfd_set_error (bfd_error_no_memory);
@@ -1949,27 +1949,23 @@ fdrtab_lookup (line_info, offset)
return mid;
}
-/* Do the work of find_nearest_line. */
+/* Look up a line given an address, storing the information in
+ LINE_INFO->cache. */
-boolean
-_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
- line_info, filename_ptr, functionname_ptr, retline_ptr)
+static boolean
+lookup_line (abfd, debug_info, debug_swap, line_info)
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;
{
struct ecoff_fdrtab_entry *tab;
+ bfd_vma offset;
boolean stabs;
FDR *fdr_ptr;
int i;
- offset += section->vma;
+ offset = line_info->cache.start;
/* Build FDR table (sorted by object file's base-address) if we
don't have it already. */
@@ -2155,7 +2151,10 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
}
lineno += delta;
if (offset < count * 4)
- break;
+ {
+ line_info->cache.stop += count * 4 - offset;
+ break;
+ }
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. */
if (fdr_ptr->rss == -1)
{
- *filename_ptr = NULL;
+ line_info->cache.filename = NULL;
if (pdr.isym == -1)
- *functionname_ptr = NULL;
+ line_info->cache.functionname = NULL;
else
{
EXTR proc_ext;
@@ -2175,24 +2174,30 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
((char *) debug_info->external_ext
+ pdr.isym * debug_swap->external_ext_size),
&proc_ext);
- *functionname_ptr = debug_info->ssext + proc_ext.asym.iss;
+ line_info->cache.functionname = (debug_info->ssext
+ + proc_ext.asym.iss);
}
}
else
{
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)
(abfd,
((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);
- *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)
lineno = 0;
- *retline_ptr = lineno;
+ line_info->cache.line_num = lineno;
}
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
and a function name which are beyond the address we want. */
- *filename_ptr = NULL;
- *functionname_ptr = NULL;
- *retline_ptr = 0;
+ line_info->cache.filename = NULL;
+ line_info->cache.functionname = NULL;
+ line_info->cache.line_num = 0;
directory_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;
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;
/* 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, ':');
if (colon != NULL)
*colon = '\0';
- *functionname_ptr = buffer;
+ line_info->cache.functionname = buffer;
}
if (main_file_name != NULL)
{
if (directory_name == NULL || main_file_name[0] == '/')
- *filename_ptr = main_file_name;
+ line_info->cache.filename = main_file_name;
else
{
sprintf (buffer + funclen, "%s%s", directory_name,
main_file_name);
- *filename_ptr = buffer + funclen;
+ line_info->cache.filename = buffer + funclen;
}
}
}
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.
diff --git a/bfd/opncls.c b/bfd/opncls.c
index 810df70..ebef3ca 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -22,8 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
+#include "objalloc.h"
#include "libbfd.h"
-#include "obstack.h"
#ifndef S_IXUSR
#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
if we do that we can't use fcntl. */
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-
-#ifndef HAVE_GETPAGESIZE
-#define getpagesize() 2048
-#endif
-
+/* FIXME: This is no longer used. */
long _bfd_chunksize = -1;
/* Return a new BFD. All BFD's are allocated through this routine. */
@@ -55,25 +48,15 @@ _bfd_new_bfd ()
{
bfd *nbfd;
- nbfd = (bfd *)bfd_zmalloc (sizeof (bfd));
- if (!nbfd)
- return 0;
-
- if (_bfd_chunksize <= 0)
- {
- _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;
- }
+ nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
+ if (nbfd == NULL)
+ return NULL;
- if (!obstack_begin(&nbfd->memory, _bfd_chunksize))
+ nbfd->memory = (PTR) objalloc_create ();
+ if (nbfd->memory == NULL)
{
bfd_set_error (bfd_error_no_memory);
- return 0;
+ return NULL;
}
nbfd->arch_info = &bfd_default_arch_struct;
@@ -81,14 +64,14 @@ _bfd_new_bfd ()
nbfd->direction = no_direction;
nbfd->iostream = NULL;
nbfd->where = 0;
- nbfd->sections = (asection *)NULL;
+ nbfd->sections = (asection *) NULL;
nbfd->format = bfd_unknown;
- nbfd->my_archive = (bfd *)NULL;
+ nbfd->my_archive = (bfd *) NULL;
nbfd->origin = 0;
nbfd->opened_once = false;
nbfd->output_has_begun = false;
nbfd->section_count = 0;
- nbfd->usrdata = (PTR)NULL;
+ nbfd->usrdata = (PTR) NULL;
nbfd->cacheable = false;
nbfd->flags = BFD_NO_FLAGS;
nbfd->mtime_set = false;
@@ -104,7 +87,7 @@ _bfd_new_bfd_contained_in (obfd)
{
bfd *nbfd;
- nbfd = _bfd_new_bfd();
+ nbfd = _bfd_new_bfd ();
nbfd->xvec = obfd->xvec;
nbfd->my_archive = obfd;
nbfd->direction = read_direction;
@@ -144,28 +127,34 @@ bfd_openr (filename, target)
bfd *nbfd;
const bfd_target *target_vec;
- nbfd = _bfd_new_bfd();
+ nbfd = _bfd_new_bfd ();
if (nbfd == NULL)
return NULL;
target_vec = bfd_find_target (target, nbfd);
- if (target_vec == NULL) {
- bfd_set_error (bfd_error_invalid_target);
- return NULL;
- }
+ if (target_vec == NULL)
+ {
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ bfd_set_error (bfd_error_invalid_target);
+ return NULL;
+ }
nbfd->filename = filename;
nbfd->direction = read_direction;
- if (bfd_open_file (nbfd) == NULL) {
- bfd_set_error (bfd_error_system_call); /* File didn't exist, or some such */
- bfd_release(nbfd,0);
- return NULL;
- }
+ if (bfd_open_file (nbfd) == NULL)
+ {
+ /* File didn't exist, or some such */
+ bfd_set_error (bfd_error_system_call);
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
+ }
+
return nbfd;
}
-
/* Don't try to `optimize' this function:
o - We lock using stack space so that interrupting the locking
@@ -218,16 +207,19 @@ bfd_fdopenr (filename, target, fd)
#endif
if (fdflags == -1) return NULL;
- nbfd = _bfd_new_bfd();
-
+ nbfd = _bfd_new_bfd ();
if (nbfd == NULL)
return NULL;
target_vec = bfd_find_target (target, nbfd);
- if (target_vec == NULL) {
- bfd_set_error (bfd_error_invalid_target);
- return NULL;
- }
+ if (target_vec == NULL)
+ {
+ bfd_set_error (bfd_error_invalid_target);
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
+ }
+
#if defined(VMS) || defined(__GO32__)
nbfd->iostream = (PTR)fopen(filename, FOPEN_RB);
#else
@@ -239,10 +231,13 @@ bfd_fdopenr (filename, target, fd)
default: abort ();
}
#endif
- if (nbfd->iostream == NULL) {
- (void) obstack_free (&nbfd->memory, (PTR)0);
- return NULL;
- }
+
+ if (nbfd->iostream == NULL)
+ {
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
+ }
/* 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
the previous clause with a preposition. */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug */
- switch (fdflags & (O_ACCMODE)) {
- case O_RDONLY: nbfd->direction = read_direction; break;
- case O_WRONLY: nbfd->direction = write_direction; break;
- case O_RDWR: nbfd->direction = both_direction; break;
- default: abort ();
- }
-
+ switch (fdflags & O_ACCMODE)
+ {
+ case O_RDONLY: nbfd->direction = read_direction; break;
+ case O_WRONLY: nbfd->direction = write_direction; break;
+ case O_RDWR: nbfd->direction = both_direction; break;
+ default: abort ();
+ }
+
if (! bfd_cache_init (nbfd))
- return NULL;
+ {
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
+ }
nbfd->opened_once = true;
return nbfd;
@@ -296,6 +296,8 @@ bfd_openstreamr (filename, target, stream)
if (target_vec == NULL)
{
bfd_set_error (bfd_error_invalid_target);
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
return NULL;
}
@@ -304,7 +306,11 @@ bfd_openstreamr (filename, target, stream)
nbfd->direction = read_direction;
if (! bfd_cache_init (nbfd))
- return NULL;
+ {
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
+ }
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
reclaim it correctly. */
- nbfd = _bfd_new_bfd();
+ nbfd = _bfd_new_bfd ();
if (nbfd == NULL)
return NULL;
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->direction = write_direction;
- if (bfd_open_file (nbfd) == NULL) {
- bfd_set_error (bfd_error_system_call); /* File not writeable, etc */
- (void) obstack_free (&nbfd->memory, (PTR)0);
- return NULL;
+ if (bfd_open_file (nbfd) == NULL)
+ {
+ bfd_set_error (bfd_error_system_call); /* File not writeable, etc */
+ objalloc_free ((struct objalloc *) nbfd->memory);
+ free (nbfd);
+ return NULL;
}
+
return nbfd;
}
@@ -375,7 +389,7 @@ DESCRIPTION
and closed. If the created file is executable, then
<<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
if it was passed in to BFD by <<bfd_fdopenr>>).
@@ -420,8 +434,8 @@ bfd_close (abfd)
}
}
- (void) obstack_free (&abfd->memory, (PTR)0);
- (void) free (abfd);
+ objalloc_free ((struct objalloc *) abfd->memory);
+ free (abfd);
return ret;
}
@@ -442,7 +456,7 @@ DESCRIPTION
If the created file is executable, then <<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.
RETURNS
<<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))));
}
}
- (void) obstack_free (&abfd->memory, (PTR)0);
- (void) free(abfd);
- return ret;
-}
+ objalloc_free ((struct objalloc *) abfd->memory);
+ free (abfd);
-/*
-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;
+ return ret;
}
-
-
/*
FUNCTION
bfd_create
@@ -527,15 +515,16 @@ bfd_create (filename, templ)
CONST char *filename;
bfd *templ;
{
- bfd *nbfd = _bfd_new_bfd();
- if (nbfd == (bfd *)NULL)
- return (bfd *)NULL;
+ bfd *nbfd;
+
+ nbfd = _bfd_new_bfd ();
+ if (nbfd == NULL)
+ return NULL;
nbfd->filename = filename;
- if(templ) {
+ if (templ)
nbfd->xvec = templ->xvec;
- }
nbfd->direction = no_direction;
- bfd_set_format(nbfd, bfd_object);
+ bfd_set_format (nbfd, bfd_object);
return nbfd;
}
@@ -547,8 +536,8 @@ SYNOPSIS
PTR bfd_alloc (bfd *abfd, size_t wanted);
DESCRIPTION
- Allocate a block of @var{wanted} bytes of memory in the obstack
- attached to <<abfd>> and return a pointer to it.
+ Allocate a block of @var{wanted} bytes of memory attached to
+ <<abfd>> and return a pointer to it.
*/
@@ -559,7 +548,7 @@ bfd_alloc (abfd, size)
{
PTR ret;
- ret = obstack_alloc (&(abfd->memory), size);
+ ret = objalloc_alloc (abfd->memory, (unsigned long) size);
if (ret == NULL)
bfd_set_error (bfd_error_no_memory);
return ret;
@@ -571,8 +560,19 @@ bfd_zalloc (abfd, size)
size_t size;
{
PTR res;
- res = bfd_alloc(abfd, size);
+
+ res = bfd_alloc (abfd, size);
if (res)
- memset(res, 0, (size_t)size);
+ memset (res, 0, size);
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);
+}
diff --git a/bfd/syms.c b/bfd/syms.c
index 23a1c19..feaddd6 100644
--- a/bfd/syms.c
+++ b/bfd/syms.c
@@ -88,7 +88,7 @@ SUBSECTION
| 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.
@@ -352,6 +352,8 @@ bfd_is_local_label (abfd, sym)
{
if ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
return false;
+ if (sym->name == NULL)
+ return false;
return bfd_is_local_label_name (abfd, sym->name);
}