From 508539ab8b346a62252cac5cb6feefe99b4f0661 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 18 Mar 1997 00:47:04 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 31 +++ bfd/Makefile.in | 34 ++-- bfd/VERSION | 2 +- bfd/aoutx.h | 9 +- bfd/bfd-in2.h | 18 +- bfd/coff-a29k.c | 3 +- bfd/coff-ppc.c | 584 +++++++++--------------------------------------------- bfd/coff-rs6000.c | 45 ++++- bfd/coffcode.h | 3 +- bfd/ecofflink.c | 146 +++++++++----- bfd/opncls.c | 218 ++++++++++---------- bfd/syms.c | 4 +- 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 + * 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 \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, . 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 <> 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 <>). @@ -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 <> 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 <> is returned if all is ok, otherwise <>. @@ -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 <> and return a pointer to it. + Allocate a block of @var{wanted} bytes of memory attached to + <> 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); } -- 2.7.4