* elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare.
authorRichard Henderson <rth@redhat.com>
Sat, 29 Aug 1998 02:43:47 +0000 (02:43 +0000)
committerRichard Henderson <rth@redhat.com>
Sat, 29 Aug 1998 02:43:47 +0000 (02:43 +0000)
        * 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.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c

index 80c329cfdd4c77936187c07dc8556b776c1bfc4d..fb569c25715b5a87f731a5999136ad12ad9816e2 100644 (file)
@@ -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.
index 455bc5c2ef88eb519e376caf4af737ddc28cb17d..252f02423ea44d2aa45650fea61f45bbf0440bbd 100644 (file)
@@ -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 *));
index 3e7c14504fff087b0d1affea43a13969b19294a3..c4417e2cb06a087bb13c260c69ff760c9d32557e 100644 (file)
--- 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;
+}