* bfd-in.h: Don't include obstack.h.
(struct bfd_hash_table): Change memory field to PTR. * bfd.c (struct _bfd): Change memory field to PTR. * bfd-in2.h: Rebuild. * libbfd-in.h (bfd_release): Declare as function, don't define as macro. * libbfd.h: Rebuild. * opncls.c: Include "objalloc.h" rather than "obstack.h". Use objalloc routines rather than obstack routines. (obstack_chunk_alloc, obstack_chunk_free): Don't define. (getpagesize): Don't define. (_bfd_new_bfd): Don't set _bfd_chunksize. (bfd_openr): Free new bfd and objalloc on failure. (bfd_fdopenr, bfd_openstreamr, bfd_openw): Likewise. (bfd_alloc_size): Remove. (bfd_release): New function. * hash.c: Include "objalloc.h" rather than "obstack.h". Use objalloc routines rather than obstack routines. (obstack_chunk_alloc, obstack_chunk_free): Don't define. * ecofflink.c: Include "objalloc.h" rather than "obstack.h". Use objalloc routines rather than obstack routines. (obstack_chunk_alloc, obstack_chunk_free): Don't define. (struct accumulate): Change memory to struct objalloc *. * liboasys.h (oasys_data_type): Remove oasys_obstack field. * dep-in.sed: Don't remove obstack.h from dependency list. * Makefile.in: Rebuild dependencies. (BFD_H_DEPS): Remove obstack.h. (install): Don't install obstack.h. * Many files: Don't include "obstack.h". * VERSION: Bump.
This commit is contained in:
parent
cadddcea29
commit
508539ab8b
12 changed files with 397 additions and 702 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
cygnus-2.7.2
|
||||
cygnus-2.7.3
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
584
bfd/coff-ppc.c
584
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. */
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
146
bfd/ecofflink.c
146
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.
|
||||
|
||||
|
|
220
bfd/opncls.c
220
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;
|
||||
nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
|
||||
if (nbfd == NULL)
|
||||
return NULL;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
objalloc_free ((struct objalloc *) abfd->memory);
|
||||
free (abfd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_alloc_size
|
||||
|
||||
SYNOPSIS
|
||||
bfd_size_type bfd_alloc_size(bfd *abfd);
|
||||
|
||||
DESCRIPTION
|
||||
Return the number of bytes in the obstacks connected to @var{abfd}.
|
||||
|
||||
*/
|
||||
|
||||
bfd_size_type
|
||||
bfd_alloc_size (abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
struct _obstack_chunk *chunk = abfd->memory.chunk;
|
||||
size_t size = 0;
|
||||
while (chunk) {
|
||||
size += chunk->limit - &(chunk->contents[0]);
|
||||
chunk = chunk->prev;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue