aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>1998-08-29 02:43:47 +0000
committerRichard Henderson <rth@redhat.com>1998-08-29 02:43:47 +0000
commit09e5322ac06823a664de9028cc31deab297c0a08 (patch)
tree71032ae1b8489502f651d317177dce501bf7f45f
parent07f50e4e2c520a9daba3642bf87d9040c99aeb33 (diff)
downloadgdb-09e5322ac06823a664de9028cc31deab297c0a08.zip
gdb-09e5322ac06823a664de9028cc31deab297c0a08.tar.gz
gdb-09e5322ac06823a664de9028cc31deab297c0a08.tar.bz2
* elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare.
* elf.c (_bfd_elf_rel_vtable_reloc_fn): New. * elf32-i386.c (elf_howto_table): Add vtable relocs. (elf_i386_reloc_type_lookup): Recognize them. (elf_i386_check_relocs): Pass them off to generic code. (elf_i386_relocate_section): Ignore them. (elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New. (elf_backend_can_gc_sections): True.
-rw-r--r--bfd/ChangeLog33
-rw-r--r--bfd/elf-bfd.h123
-rw-r--r--bfd/elf.c20
3 files changed, 138 insertions, 38 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 80c329c..fb569c2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,4 +1,15 @@
-start-sanitize-armelf
+Fri Aug 28 19:38:53 1998 Richard Henderson <rth@cygnus.com>
+
+ * elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare.
+ * elf.c (_bfd_elf_rel_vtable_reloc_fn): New.
+
+ * elf32-i386.c (elf_howto_table): Add vtable relocs.
+ (elf_i386_reloc_type_lookup): Recognize them.
+ (elf_i386_check_relocs): Pass them off to generic code.
+ (elf_i386_relocate_section): Ignore them.
+ (elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New.
+ (elf_backend_can_gc_sections): True.
+
Thu Aug 20 15:03:45 1998 Nick Clifton <nickc@cygnus.com>
* elf32-arm.c (elf32_thumb_to_arm_stub): Check sym_sec is not NULL
@@ -6,7 +17,7 @@ Thu Aug 20 15:03:45 1998 Nick Clifton <nickc@cygnus.com>
(elf32_arm_to_thumb_stub): Ditto.
(elf32_arm_relocate_section): Compute name before calling
elf32_arm_final_link_relocate().
-end-sanitize-armelf
+
Wed Aug 19 15:43:26 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
* elfcode.h (elf_object_p): Reject files of header type ET_CORE
@@ -37,12 +48,11 @@ Wed Aug 19 15:43:26 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
R_PPC_EMB_SDA21, R_PPC_EMB_RELSDA. In all these cases also ignore
output_offset for correct evaluation of addend.
-start-sanitize-armelf
Tue Aug 18 11:48:12 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c: Add prefix bfd_ to elf32_arm_get_bfd_for_interworking,
- elf32_arm_allocate_interworking_sections and
- elf32_arm_process_before_allocation.
+ elf32_arm_allocate_interworking_sections and
+ elf32_arm_process_before_allocation.
Tue Aug 18 11:46:00 1998 Nick Clifton <nickc@cygnus.com>
@@ -52,7 +62,6 @@ Tue Aug 18 11:46:00 1998 Nick Clifton <nickc@cygnus.com>
* bfd-in2.h: Regenerate.
-end-sanitize-armelf
Sat Aug 15 20:55:08 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (elf64_alpha_relax_section): Handle indirect symbols.
@@ -62,7 +71,6 @@ Fri Aug 14 09:12:28 1998 Stan Cox <scox@cygnus.com>
* aoutx.h (aout_link_input_section_ext): Use the relocation already
calculated for RELOC_SPARC_REV32 case.
-start-sanitize-armelf
Thu Aug 13 14:02:02 1998 Catherine Moore <clm@cygnus.com>
* bfd-in.h: Add prototypes for elf32_arm_get_bfd_for_interworking,
@@ -88,7 +96,6 @@ Thu Aug 13 14:02:02 1998 Catherine Moore <clm@cygnus.com>
(elf32_arm_relocate_section): Pass symbol section to
elf32_arm_final_link_relocate.
-end-sanitize-armelf
Wed Aug 12 19:00:39 1998 Geoff Keating <geoffk@ozemail.com.au>
* elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Generate PLT
@@ -99,14 +106,11 @@ Wed Aug 12 14:48:33 1998 Ian Lance Taylor <ian@cygnus.com>
* libaout.h: Remove nested comment to avoid warning.
-start-sanitize-armelf
Wed Aug 12 08:10:11 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Rework
R_ARM_PC24 relocation.
-end-sanitize-armelf
-start-sanitize-armelf
Tue Aug 11 14:42:26 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Remove unused
@@ -115,7 +119,6 @@ Tue Aug 11 14:42:26 1998 Catherine Moore <clm@cygnus.com>
(elf32_arm_relocate_section): Don't pass local sym and pass
sym_flags to elf32_arm_final_link_relocate.
-end-sanitize-armelf
Mon Aug 10 20:38:39 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (elf64_alpha_calc_dynrel_sizes): Correct last change
@@ -139,13 +142,11 @@ Mon Aug 10 17:31:21 1998 Ian Lance Taylor <ian@cygnus.com>
* ieee.c (ieee_write_processor): Correct the processor ID written
out for bfd_arch_m68k, accommodating change of March 25.
-start-sanitize-armelf
Sun Aug 9 20:55:44 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Rework
R_ARM_THM_RPC22 relocations.
-end-sanitize-armelf
Sat Aug 8 15:15:30 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (alpha_elf_dynamic_symbol_p): Undef weak symbols
@@ -153,7 +154,6 @@ Sat Aug 8 15:15:30 1998 Richard Henderson <rth@cygnus.com>
(elf64_alpha_calc_dynrel_sizes): Allow enough room for RELATIVE
.got relocs in -Bsymbolic shared objects.
-start-sanitize-armelf
Wed Aug 5 15:48:08 1998 Nick Clifton <nickc@cygnus.com>
* elf32-arm.c: Add private flags to ELF header.
@@ -162,7 +162,6 @@ Wed Aug 5 15:48:08 1998 Nick Clifton <nickc@cygnus.com>
(elf32_arm_copy_private_flags): New Function.
(elf32_arm_merge_private_bfd_data): New Function.
-end-sanitize-armelf
Mon Aug 3 17:10:15 1998 Ian Lance Taylor <ian@cygnus.com>
* elf32-sparc.c (elf32_sparc_check_relocs): Permit WPLT30 against
@@ -181,7 +180,6 @@ Sun Aug 2 03:19:23 1998 Richard Henderson <rth@cygnus.com>
* elf32-mips.c (_bfd_mips_elf_section_from_shdr): Don't pass
".liblist" string through gettext.
-start-sanitize-armelf
Fri Jul 31 16:38:14 1998 Catherine Moore <clm@cygnus.com>
* Makefile.am: Add support for elf32-arm.lo.
@@ -195,7 +193,6 @@ Fri Jul 31 16:38:14 1998 Catherine Moore <clm@cygnus.com>
bfd_target bfd_elf32_littlearm_vec.
* elf32-arm.c: New file.
-end-sanitize-armelf
Tue Jun 28 19:05:28 1998 Stan Cox <scox@cygnus.com>
* libaout.h (M_SPARCLITE_LE): New machine.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 455bc5c..252f024 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1,5 +1,5 @@
/* BFD back-end data structures for ELF files.
- Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@@ -96,17 +96,24 @@ struct elf_link_hash_entry
struct elf_link_hash_entry *weakdef;
/* If this symbol requires an entry in the global offset table, the
- processor specific backend uses this field to hold the offset
- into the .got section. If this field is -1, then the symbol does
- not require a global offset table entry. */
- bfd_vma got_offset;
-
- /* If this symbol requires an entry in the procedure linkage table,
- the processor specific backend uses these two fields to hold the
- offset into the procedure linkage section and the offset into the
- .got section. If plt_offset is -1, then the symbol does not
- require an entry in the procedure linkage table. */
- bfd_vma plt_offset;
+ processor specific backend uses this field to track usage and
+ final offset. We use a union and two names primarily to document
+ the intent of any particular piece of code. The field should be
+ used as a count until size_dynamic_sections, at which point the
+ contents of the .got is fixed. Afterward, if this field is -1,
+ then the symbol does not require a global offset table entry. */
+ union
+ {
+ bfd_signed_vma refcount;
+ bfd_vma offset;
+ } got;
+
+ /* Same, but tracks a procedure linkage table entry. */
+ union
+ {
+ bfd_signed_vma refcount;
+ bfd_vma offset;
+ } plt;
/* If this symbol is used in the linker created sections, the processor
specific backend uses this field to map the field into the offset
@@ -126,6 +133,14 @@ struct elf_link_hash_entry
struct bfd_elf_version_tree *vertree;
} verinfo;
+ /* Virtual table entry use information. This array is of size
+ size/sizeof(target_void_pointer), and indexed via
+ offset/sizeof(void*) as well. */
+ boolean *vtable_entries_used;
+
+ /* Virtual table derivation info. */
+ struct elf_link_hash_entry *vtable_parent;
+
/* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */
char type;
@@ -152,6 +167,10 @@ struct elf_link_hash_entry
#define ELF_LINK_NON_ELF 0200
/* Symbol should be marked as hidden in the version information. */
#define ELF_LINK_HIDDEN 0400
+ /* Symbol was forced to local scope due to a version script file. */
+#define ELF_LINK_FORCED_LOCAL 01000
+ /* Symbol was marked during garbage collection. */
+#define ELF_LINK_HASH_MARK 02000
};
/* ELF linker hash table. */
@@ -471,6 +490,20 @@ struct elf_backend_data
backend specific fashion. */
boolean (*elf_backend_modify_segment_map) PARAMS ((bfd *));
+ /* This function is called during section gc to discover the section a
+ particular relocation refers to. It need not be defined for hosts
+ that have no queer relocation types. */
+ asection * (*gc_mark_hook)
+ PARAMS ((bfd *abfd, struct bfd_link_info *, Elf_Internal_Rela *,
+ struct elf_link_hash_entry *h, Elf_Internal_Sym *));
+
+ /* This function, if defined, is called during the sweep phase of gc
+ in order that a backend might update any data structures it might
+ be maintaining. */
+ boolean (*gc_sweep_hook)
+ PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *o,
+ const Elf_Internal_Rela *relocs));
+
/* The swapping table to use when dealing with ECOFF information.
Used for the MIPS ELF .mdebug section. */
const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
@@ -481,9 +514,21 @@ struct elf_backend_data
const struct elf_size_info *s;
+ /* offset of the _GLOBAL_OFFSET_TABLE_ symbol from the start of the
+ .got section */
+ bfd_vma got_symbol_offset;
+
+ /* The size in bytes of the headers for the GOT and PLT. This includes
+ the so-called reserved entries on some systems. */
+ bfd_vma got_header_size;
+ bfd_vma plt_header_size;
+
unsigned want_got_plt : 1;
unsigned plt_readonly : 1;
unsigned want_plt_sym : 1;
+ unsigned plt_not_loaded : 1;
+ unsigned plt_alignment : 4;
+ unsigned can_gc_sections : 1;
};
/* Information stored for each BFD section in an ELF file. This
@@ -557,7 +602,7 @@ typedef struct elf_linker_section
bfd_vma max_hole_offset; /* maximum offset for the hole */
elf_linker_section_enum_t which; /* which section this is */
boolean hole_written_p; /* whether the hole has been initialized */
- int alignment; /* alignment for the section */
+ unsigned int alignment; /* alignment for the section */
flagword flags; /* flags to use to create the section */
} elf_linker_section_t;
@@ -613,8 +658,17 @@ struct elf_obj_tdata
struct elf_link_hash_entry **sym_hashes;
/* A mapping from local symbols to offsets into the global offset
- table, used when linking. This is indexed by the symbol index. */
- bfd_vma *local_got_offsets;
+ table, used when linking. This is indexed by the symbol index.
+ Like for the globals, we use a union and two names primarily to
+ document the intent of any particular piece of code. The field
+ should be used as a count until size_dynamic_sections, at which
+ point the contents of the .got is fixed. Afterward, if an entry
+ is -1, then the symbol does not require a global offset table entry. */
+ union
+ {
+ bfd_signed_vma *refcounts;
+ bfd_vma *offsets;
+ } local_got;
/* A mapping from local symbols to offsets into the various linker
sections added. This is index by the symbol index. */
@@ -649,6 +703,9 @@ struct elf_obj_tdata
find_nearest_line. */
struct mips_elf_find_line *find_line_info;
+ /* A place to stash dwarf2 info for this bfd. */
+ struct dwarf2_debug *dwarf2_find_line_info;
+
/* An array of stub sections indexed by symbol number, used by the
MIPS ELF linker. FIXME: We should figure out some way to only
include this field for a MIPS ELF target. */
@@ -658,10 +715,10 @@ struct elf_obj_tdata
boolean flags_init;
/* Number of symbol version definitions we are about to emit. */
- int cverdefs;
+ unsigned int cverdefs;
/* Number of symbol version references we are about to emit. */
- int cverrefs;
+ unsigned int cverrefs;
/* Symbol version definitions in external objects. */
Elf_Internal_Verdef *verdef;
@@ -690,7 +747,8 @@ struct elf_obj_tdata
#define elf_gp(bfd) (elf_tdata(bfd) -> gp)
#define elf_gp_size(bfd) (elf_tdata(bfd) -> gp_size)
#define elf_sym_hashes(bfd) (elf_tdata(bfd) -> sym_hashes)
-#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got_offsets)
+#define elf_local_got_refcounts(bfd) (elf_tdata(bfd) -> local_got.refcounts)
+#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets)
#define elf_local_ptr_offsets(bfd) (elf_tdata(bfd) -> linker_section_pointers)
#define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name)
#define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab)
@@ -742,6 +800,7 @@ extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *,
bfd *,
char **));
extern boolean bfd_elf_mkobject PARAMS ((bfd *));
+extern boolean bfd_elf_mkcorefile PARAMS ((bfd *));
extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *));
extern boolean _bfd_elf_make_section_from_shdr
PARAMS ((bfd *abfd, Elf_Internal_Shdr *hdr, const char *name));
@@ -761,6 +820,7 @@ extern boolean _bfd_elf_copy_private_symbol_data
extern boolean _bfd_elf_copy_private_section_data
PARAMS ((bfd *, asection *, bfd *, asection *));
extern boolean _bfd_elf_write_object_contents PARAMS ((bfd *));
+extern boolean _bfd_elf_write_corefile_contents PARAMS ((bfd *));
extern boolean _bfd_elf_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
file_ptr,
bfd_size_type));
@@ -962,6 +1022,33 @@ extern Elf_Internal_Rela *_bfd_elf64_link_read_relocs
#define bfd_elf32_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
#define bfd_elf64_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
+extern boolean _bfd_elf_close_and_cleanup PARAMS ((bfd *));
+extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
+ PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR,
+ asection *, bfd *, char **));
+
+boolean _bfd_elf32_gc_sections
+ PARAMS ((bfd *abfd, struct bfd_link_info *info));
+boolean _bfd_elf32_gc_common_finalize_got_offsets
+ PARAMS ((bfd *abfd, struct bfd_link_info *info));
+boolean _bfd_elf32_gc_common_final_link
+ PARAMS ((bfd *, struct bfd_link_info *));
+boolean _bfd_elf32_gc_record_vtinherit
+ PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
+boolean _bfd_elf32_gc_record_vtentry
+ PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
+
+boolean _bfd_elf64_gc_sections
+ PARAMS ((bfd *abfd, struct bfd_link_info *info));
+boolean _bfd_elf64_gc_common_finalize_got_offsets
+ PARAMS ((bfd *abfd, struct bfd_link_info *info));
+boolean _bfd_elf64_gc_common_final_link
+ PARAMS ((bfd *, struct bfd_link_info *));
+boolean _bfd_elf64_gc_record_vtinherit
+ PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
+boolean _bfd_elf64_gc_record_vtentry
+ PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
+
/* MIPS ELF specific routines. */
extern boolean _bfd_mips_elf_object_p PARAMS ((bfd *));
diff --git a/bfd/elf.c b/bfd/elf.c
index 3e7c145..c4417e2 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3075,11 +3075,9 @@ prep_headers (abfd)
case bfd_arch_arc:
i_ehdrp->e_machine = EM_CYGNUS_ARC;
break;
-/* start-sanitize-armelf */
case bfd_arch_arm:
i_ehdrp->e_machine = EM_ARM;
break;
-/* end-sanitize-armelf */
case bfd_arch_m32r:
i_ehdrp->e_machine = EM_CYGNUS_M32R;
break;
@@ -4738,3 +4736,21 @@ _bfd_elf_close_and_cleanup (abfd)
return _bfd_generic_close_and_cleanup (abfd);
}
+
+/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
+ in the relocation's offset. Thus we cannot allow any sort of sanity
+ range-checking to interfere. There is nothing else to do in processing
+ this reloc. */
+
+bfd_reloc_status_type
+_bfd_elf_rel_vtable_reloc_fn (abfd, re, symbol, data, is, obfd, errmsg)
+ bfd *abfd;
+ arelent *re;
+ struct symbol_cache_entry *symbol;
+ PTR data;
+ asection *is;
+ bfd *obfd;
+ char **errmsg;
+{
+ return bfd_reloc_ok;
+}