include/
[deliverable/binutils-gdb.git] / bfd / elf-bfd.h
index a90024f090a660e0a6848cdb6ca69c98df479fa0..8a1b6da01464f4d657d5028917df81676844dbbf 100644 (file)
@@ -104,40 +104,6 @@ struct elf_link_hash_entry
      not visible outside this DSO.  */
   long dynindx;
 
-  /* String table index in .dynstr if this is a dynamic symbol.  */
-  unsigned long dynstr_index;
-
-  /* Hash value of the name computed using the ELF hash function.  */
-  unsigned long elf_hash_value;
-
-  /* If this is a weak defined symbol from a dynamic object, this
-     field points to a defined symbol with the same value, if there is
-     one.  Otherwise it is NULL.  */
-  struct elf_link_hash_entry *weakdef;
-
-  /* Version information.  */
-  union
-  {
-    /* This field is used for a symbol which is not defined in a
-       regular object.  It points to the version information read in
-       from the dynamic object.  */
-    Elf_Internal_Verdef *verdef;
-    /* This field is used for a symbol which is defined in a regular
-       object.  It is set up in size_dynamic_sections.  It points to
-       the version information we should write out for this symbol.  */
-    struct bfd_elf_version_tree *vertree;
-  } verinfo;
-
-  /* Virtual table entry use information.  This array is nominally of size
-     size/sizeof(target_void_pointer), though we have to be able to assume
-     and track a size while the symbol is still undefined.  It is indexed
-     via offset/sizeof(target_void_pointer).  */
-  size_t vtable_entries_size;
-  bfd_boolean *vtable_entries_used;
-
-  /* Virtual table derivation info.  */
-  struct elf_link_hash_entry *vtable_parent;
-
   /* If this symbol requires an entry in the global offset table, the
      processor specific backend uses this field to track usage and
      final offset.  Two schemes are supported:  The first assumes that
@@ -162,47 +128,89 @@ struct elf_link_hash_entry
   bfd_size_type size;
 
   /* Symbol type (STT_NOTYPE, STT_OBJECT, etc.).  */
-  char type;
+  unsigned int type : 8;
 
   /* Symbol st_other value, symbol visibility.  */
-  unsigned char other;
+  unsigned int other : 8;
 
-  /* Some flags; legal values follow.  */
-  unsigned short elf_link_hash_flags;
   /* Symbol is referenced by a non-shared object.  */
-#define ELF_LINK_HASH_REF_REGULAR 01
+  unsigned int ref_regular : 1;
   /* Symbol is defined by a non-shared object.  */
-#define ELF_LINK_HASH_DEF_REGULAR 02
+  unsigned int def_regular : 1;
   /* Symbol is referenced by a shared object.  */
-#define ELF_LINK_HASH_REF_DYNAMIC 04
+  unsigned int ref_dynamic : 1;
   /* Symbol is defined by a shared object.  */
-#define ELF_LINK_HASH_DEF_DYNAMIC 010
+  unsigned int def_dynamic : 1;
   /* Symbol has a non-weak reference from a non-shared object.  */
-#define ELF_LINK_HASH_REF_REGULAR_NONWEAK 020
+  unsigned int ref_regular_nonweak : 1;
   /* Dynamic symbol has been adjustd.  */
-#define ELF_LINK_HASH_DYNAMIC_ADJUSTED 040
+  unsigned int dynamic_adjusted : 1;
   /* Symbol needs a copy reloc.  */
-#define ELF_LINK_HASH_NEEDS_COPY 0100
+  unsigned int needs_copy : 1;
   /* Symbol needs a procedure linkage table entry.  */
-#define ELF_LINK_HASH_NEEDS_PLT 0200
+  unsigned int needs_plt : 1;
   /* Symbol appears in a non-ELF input file.  */
-#define ELF_LINK_NON_ELF 0400
+  unsigned int non_elf : 1;
   /* Symbol should be marked as hidden in the version information.  */
-#define ELF_LINK_HIDDEN 01000
+  unsigned int hidden : 1;
   /* Symbol was forced to local scope due to a version script file.  */
-#define ELF_LINK_FORCED_LOCAL 02000
+  unsigned int forced_local : 1;
   /* Symbol was marked during garbage collection.  */
-#define ELF_LINK_HASH_MARK 04000
+  unsigned int mark : 1;
   /* Symbol is referenced by a non-GOT/non-PLT relocation.  This is
      not currently set by all the backends.  */
-#define ELF_LINK_NON_GOT_REF 010000
-  /* Symbol has a definition in a shared object.  */
-#define ELF_LINK_DYNAMIC_DEF 020000
+  unsigned int non_got_ref : 1;
+  /* Symbol has a definition in a shared object.
+     FIXME: There is no real need for this field if def_dynamic is never
+     cleared and all places that test def_dynamic also test def_regular.  */
+  unsigned int dynamic_def : 1;
   /* Symbol is weak in all shared objects.  */
-#define ELF_LINK_DYNAMIC_WEAK 040000
+  unsigned int dynamic_weak : 1;
   /* Symbol is referenced with a relocation where C/C++ pointer equality
      matters.  */
-#define ELF_LINK_POINTER_EQUALITY_NEEDED 0100000
+  unsigned int pointer_equality_needed : 1;
+
+  /* String table index in .dynstr if this is a dynamic symbol.  */
+  unsigned long dynstr_index;
+
+  union
+  {
+    /* If this is a weak defined symbol from a dynamic object, this
+       field points to a defined symbol with the same value, if there is
+       one.  Otherwise it is NULL.  */
+    struct elf_link_hash_entry *weakdef;
+
+    /* Hash value of the name computed using the ELF hash function.
+       Used part way through size_dynamic_sections, after we've finished
+       with weakdefs.  */
+    unsigned long elf_hash_value;
+  } u;
+
+  /* Version information.  */
+  union
+  {
+    /* This field is used for a symbol which is not defined in a
+       regular object.  It points to the version information read in
+       from the dynamic object.  */
+    Elf_Internal_Verdef *verdef;
+    /* This field is used for a symbol which is defined in a regular
+       object.  It is set up in size_dynamic_sections.  It points to
+       the version information we should write out for this symbol.  */
+    struct bfd_elf_version_tree *vertree;
+  } verinfo;
+
+  struct
+  {
+    /* Virtual table entry use information.  This array is nominally of size
+       size/sizeof(target_void_pointer), though we have to be able to assume
+       and track a size while the symbol is still undefined.  It is indexed
+       via offset/sizeof(target_void_pointer).  */
+    size_t size;
+    bfd_boolean *used;
+
+    /* Virtual table derivation info.  */
+    struct elf_link_hash_entry *parent;
+  } *vtable;
 };
 
 /* Will references to this symbol always reference the symbol
@@ -218,6 +226,13 @@ struct elf_link_hash_entry
 #define SYMBOL_CALLS_LOCAL(INFO, H) \
   _bfd_elf_symbol_refs_local_p (H, INFO, 1)
 
+/* Common symbols that are turned into definitions don't have the
+   DEF_REGULAR flag set, so they might appear to be undefined.  */
+#define ELF_COMMON_DEF_P(H) \
+  (!(H)->def_regular                                                   \
+   && !(H)->def_dynamic                                                        \
+   && (H)->root.type == bfd_link_hash_defined)
+
 /* Records local symbols to be emitted in the dynamic symbol table.  */
 
 struct elf_link_local_dynamic_entry
@@ -278,11 +293,11 @@ struct eh_cie_fde
   unsigned char fde_encoding;
   unsigned char lsda_encoding;
   unsigned char lsda_offset;
-  unsigned char cie : 1;
-  unsigned char removed : 1;
-  unsigned char make_relative : 1;
-  unsigned char make_lsda_relative : 1;
-  unsigned char per_encoding_relative : 1;
+  unsigned int cie : 1;
+  unsigned int removed : 1;
+  unsigned int make_relative : 1;
+  unsigned int make_lsda_relative : 1;
+  unsigned int per_encoding_relative : 1;
 };
 
 struct eh_frame_sec_info
@@ -356,12 +371,12 @@ struct elf_link_hash_table
   /* The _GLOBAL_OFFSET_TABLE_ symbol.  */
   struct elf_link_hash_entry *hgot;
 
-  /* A pointer to information used to link stabs in sections.  */
-  void *stab_info;
-
   /* A pointer to information used to merge SEC_MERGE sections.  */
   void *merge_info;
 
+  /* Used to link stabs in sections.  */
+  struct stab_info stab_info;
+
   /* Used by eh_frame code when editing .eh_frame.  */
   struct eh_frame_hdr_info eh_info;
 
@@ -492,6 +507,7 @@ struct elf_reloc_cookie
   size_t locsymcount;
   size_t extsymoff;
   struct elf_link_hash_entry **sym_hashes;
+  int r_sym_shift;
   bfd_boolean bad_symtab;
 };
 
@@ -530,6 +546,9 @@ struct elf_backend_data
   /* The maximum page size for this backend.  */
   bfd_vma maxpagesize;
 
+  /* The BFD flags applied to sections created for dynamic linking.  */
+  flagword dynamic_sec_flags;
+
   /* A function to translate an ELF RELA relocation to a BFD arelent
      structure.  */
   void (*elf_info_to_howto)
@@ -571,11 +590,16 @@ struct elf_backend_data
   bfd_boolean (*elf_backend_symbol_table_processing)
     (bfd *, elf_symbol_type *, unsigned int);
 
-   /* A function to set the type of the info field.  Processor-specific
+  /* A function to set the type of the info field.  Processor-specific
      types should be handled here.  */
   int (*elf_backend_get_symbol_type)
     (Elf_Internal_Sym *, int);
 
+  /* A function to return the linker hash table entry of a symbol that
+     might be satisfied by an archive symbol.  */
+  struct elf_link_hash_entry * (*elf_backend_archive_symbol_lookup)
+    (bfd *, struct bfd_link_info *, const char *);
+
   /* Return true if local section symbols should have a non-null st_name.
      NULL implies false.  */
   bfd_boolean (*elf_backend_name_local_section_symbols)
@@ -596,7 +620,7 @@ struct elf_backend_data
   /* A function to convert machine dependent section header flags to
      BFD internal section header flags.  */
   bfd_boolean (*elf_backend_section_flags)
-    (flagword *, Elf_Internal_Shdr *);
+    (flagword *, const Elf_Internal_Shdr *);
 
   /* A function to handle unusual program segment types when creating BFD
      sections from ELF program segments.  */
@@ -625,7 +649,7 @@ struct elf_backend_data
      indices, and must set at least *FLAGS and *SEC for each processor
      dependent case; failure to do so will cause a link error.  */
   bfd_boolean (*elf_add_symbol_hook)
-    (bfd *abfd, struct bfd_link_info *info, const Elf_Internal_Sym *,
+    (bfd *abfd, struct bfd_link_info *info, Elf_Internal_Sym *,
      const char **name, flagword *flags, asection **sec, bfd_vma *value);
 
   /* If this field is not NULL, it is called by the elf_link_output_sym
@@ -645,6 +669,11 @@ struct elf_backend_data
   bfd_boolean (*elf_backend_create_dynamic_sections)
     (bfd *abfd, struct bfd_link_info *info);
 
+  /* When creating a shared library, determine whether to omit the
+     dynamic symbol for the section.  */
+  bfd_boolean (*elf_backend_omit_section_dynsym)
+    (bfd *output_bfd, struct bfd_link_info *info, asection *osec);
+
   /* The CHECK_RELOCS function is called by the add_symbols phase of
      the ELF backend linker.  It is called once for each section with
      relocs of an object file, just after the symbols for the object
@@ -659,6 +688,13 @@ struct elf_backend_data
     (bfd *abfd, struct bfd_link_info *info, asection *o,
      const Elf_Internal_Rela *relocs);
 
+  /* The CHECK_DIRECTIVES function is called once per input file by
+     the add_symbols phase of the ELF backend linker.  The function
+     must inspect the bfd and create any additional symbols according
+     to any custom directives in the bfd.  */
+  bfd_boolean (*check_directives)
+    (bfd *abfd, struct bfd_link_info *info);
+
   /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend
      linker for every symbol which is defined by a dynamic object and
      referenced by a regular object.  This is called after all the
@@ -901,6 +937,16 @@ struct elf_backend_data
      (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
       int (*target_read_memory) (bfd_vma vma, char *myaddr, int len));
 
+  /* This function is used by `_bfd_elf_get_synthetic_symtab';
+     see elf.c.  */
+  bfd_vma (*plt_sym_val) (bfd_vma, const asection *, const arelent *);
+
+  /* Used to handle bad SHF_LINK_ORDER input.  */
+  bfd_error_handler_type link_order_error_handler;
+
+  /* Name of the PLT relocation section.  */
+  const char *relplt_name;
+
   /* Alternate EM_xxxx machine codes for this backend.  */
   int elf_machine_alt1;
   int elf_machine_alt2;
@@ -1011,6 +1057,9 @@ struct bfd_elf_section_data
      no dynamic symbol for this section.  */
   int dynindx;
 
+  /* A pointer to the linked-to section for SHF_LINK_ORDER.  */
+  asection *linked_to;
+
   /* Used by the backend linker to store the symbol hash table entries
      associated with relocs against global symbols.  */
   struct elf_link_hash_entry **rel_hashes;
@@ -1035,6 +1084,10 @@ struct bfd_elf_section_data
     struct bfd_symbol *id;
   } group;
 
+  /* Optional information about section group; NULL if it doesn't
+     belongs to any section group. */
+  asection *sec_group;
+
   /* A linked list of sections in the group.  Circular when used by
      the linker.  */
   asection *next_in_group;
@@ -1044,18 +1097,20 @@ struct bfd_elf_section_data
 };
 
 #define elf_section_data(sec)  ((struct bfd_elf_section_data*)sec->used_by_bfd)
+#define elf_linked_to_section(sec) (elf_section_data(sec)->linked_to)
 #define elf_section_type(sec)  (elf_section_data(sec)->this_hdr.sh_type)
 #define elf_section_flags(sec) (elf_section_data(sec)->this_hdr.sh_flags)
 #define elf_group_name(sec)    (elf_section_data(sec)->group.name)
 #define elf_group_id(sec)      (elf_section_data(sec)->group.id)
 #define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group)
+#define elf_sec_group(sec)     (elf_section_data(sec)->sec_group)
 
 /* Return TRUE if section has been discarded.  */
 #define elf_discarded_section(sec)                             \
   (!bfd_is_abs_section (sec)                                   \
    && bfd_is_abs_section ((sec)->output_section)               \
-   && sec->sec_info_type != ELF_INFO_TYPE_MERGE                        \
-   && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
+   && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE              \
+   && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
 
 #define get_elf_backend_data(abfd) \
   ((const struct elf_backend_data *) (abfd)->xvec->backend_data)
@@ -1203,6 +1258,9 @@ struct elf_obj_tdata
   /* Segment flags for the PT_GNU_STACK segment.  */
   unsigned int stack_flags;  
 
+  /* Should the PT_GNU_RELRO segment be emitted?  */
+  bfd_boolean relro;
+
   /* Symbol version definitions in external objects.  */
   Elf_Internal_Verdef *verdef;
 
@@ -1308,9 +1366,6 @@ extern void bfd_elf_print_symbol
   bfd_elf_string_from_elf_section (abfd, elf_elfheader(abfd)->e_shstrndx, \
                                   strindex)
 
-#define bfd_elf32_print_symbol bfd_elf_print_symbol
-#define bfd_elf64_print_symbol bfd_elf_print_symbol
-
 extern void _bfd_elf_sprintf_vma
   (bfd *, char *, bfd_vma);
 extern void _bfd_elf_fprintf_vma
@@ -1363,12 +1418,18 @@ extern bfd_boolean _bfd_elf_slurp_version_tables
   (bfd *);
 extern bfd_boolean _bfd_elf_merge_sections
   (bfd *, struct bfd_link_info *);
+extern bfd_boolean bfd_elf_is_group_section
+  (bfd *, const struct bfd_section *);
 extern bfd_boolean bfd_elf_discard_group
   (bfd *, struct bfd_section *);
+extern void _bfd_elf_section_already_linked
+  (bfd *, struct bfd_section *);
 extern void bfd_elf_set_group_contents
   (bfd *, asection *, void *);
 extern void _bfd_elf_link_just_syms
   (asection *, struct bfd_link_info *);
+extern bfd_boolean _bfd_elf_copy_private_header_data
+  (bfd *, bfd *);
 extern bfd_boolean _bfd_elf_copy_private_symbol_data
   (bfd *, asymbol *, bfd *, asymbol *);
 extern bfd_boolean _bfd_elf_copy_private_section_data
@@ -1387,6 +1448,8 @@ extern long _bfd_elf_get_dynamic_symtab_upper_bound
   (bfd *);
 extern long _bfd_elf_canonicalize_dynamic_symtab
   (bfd *, asymbol **);
+extern long _bfd_elf_get_synthetic_symtab
+  (bfd *, long, asymbol **, long, asymbol **, asymbol **);
 extern long _bfd_elf_get_reloc_upper_bound
   (bfd *, sec_ptr);
 extern long _bfd_elf_canonicalize_reloc
@@ -1476,12 +1539,12 @@ extern bfd_boolean _bfd_elf_maybe_strip_eh_frame_hdr
 extern bfd_boolean _bfd_elf_merge_symbol
   (bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *,
    asection **, bfd_vma *, struct elf_link_hash_entry **, bfd_boolean *,
-   bfd_boolean *, bfd_boolean *, bfd_boolean *, bfd_boolean);
+   bfd_boolean *, bfd_boolean *, bfd_boolean *);
 
 extern bfd_boolean _bfd_elf_add_default_symbol
   (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
    const char *, Elf_Internal_Sym *, asection **, bfd_vma *,
-   bfd_boolean *, bfd_boolean, bfd_boolean);
+   bfd_boolean *, bfd_boolean);
 
 extern bfd_boolean _bfd_elf_export_symbol
   (struct elf_link_hash_entry *, void *);
@@ -1492,8 +1555,6 @@ extern bfd_boolean _bfd_elf_link_find_version_dependencies
 extern bfd_boolean _bfd_elf_link_assign_sym_version
   (struct elf_link_hash_entry *, void *);
 
-extern bfd_boolean _bfd_elf_link_record_dynamic_symbol
-  (struct bfd_link_info *, struct elf_link_hash_entry *);
 extern long _bfd_elf_link_lookup_local_dynindx
   (struct bfd_link_info *, bfd *, long);
 extern bfd_boolean _bfd_elf_compute_section_file_positions
@@ -1508,6 +1569,8 @@ extern bfd_boolean _bfd_elf_validate_reloc
 
 extern bfd_boolean _bfd_elf_link_create_dynamic_sections
   (bfd *, struct bfd_link_info *);
+extern bfd_boolean _bfd_elf_link_omit_section_dynsym
+  (bfd *, struct bfd_link_info *, asection *);
 extern bfd_boolean _bfd_elf_create_dynamic_sections
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean _bfd_elf_create_got_section
@@ -1544,8 +1607,11 @@ extern bfd_boolean _bfd_elf_dynamic_symbol_p
 extern bfd_boolean _bfd_elf_symbol_refs_local_p
   (struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean);
 
-extern bfd_boolean _bfd_elf_link_add_archive_symbols
-  (bfd *, struct bfd_link_info *);
+extern bfd_boolean bfd_elf_match_symbols_in_sections
+  (asection *sec1, asection *sec2);
+
+extern bfd_boolean _bfd_elf_setup_group_pointers
+  (bfd *);
 
 extern const bfd_target *bfd_elf32_object_p
   (bfd *);
@@ -1558,11 +1624,6 @@ extern int bfd_elf32_core_file_failing_signal
 extern bfd_boolean bfd_elf32_core_file_matches_executable_p
   (bfd *, bfd *);
 
-extern bfd_boolean bfd_elf32_bfd_link_add_symbols
-  (bfd *, struct bfd_link_info *);
-extern bfd_boolean bfd_elf32_bfd_final_link
-  (bfd *, struct bfd_link_info *);
-
 extern void bfd_elf32_swap_symbol_in
   (bfd *, const void *, const void *, Elf_Internal_Sym *);
 extern void bfd_elf32_swap_symbol_out
@@ -1593,8 +1654,6 @@ extern void bfd_elf32_write_relocs
   (bfd *, asection *, void *);
 extern bfd_boolean bfd_elf32_slurp_reloc_table
   (bfd *, asection *, asymbol **, bfd_boolean);
-extern bfd_boolean bfd_elf32_add_dynamic_entry
-  (struct bfd_link_info *, bfd_vma, bfd_vma);
 
 extern const bfd_target *bfd_elf64_object_p
   (bfd *);
@@ -1606,10 +1665,6 @@ extern int bfd_elf64_core_file_failing_signal
   (bfd *);
 extern bfd_boolean bfd_elf64_core_file_matches_executable_p
   (bfd *, bfd *);
-extern bfd_boolean bfd_elf64_bfd_link_add_symbols
-  (bfd *, struct bfd_link_info *);
-extern bfd_boolean bfd_elf64_bfd_final_link
-  (bfd *, struct bfd_link_info *);
 
 extern void bfd_elf64_swap_symbol_in
   (bfd *, const void *, const void *, Elf_Internal_Sym *);
@@ -1641,20 +1696,19 @@ extern void bfd_elf64_write_relocs
   (bfd *, asection *, void *);
 extern bfd_boolean bfd_elf64_slurp_reloc_table
   (bfd *, asection *, asymbol **, bfd_boolean);
-extern bfd_boolean bfd_elf64_add_dynamic_entry
+
+extern struct elf_link_hash_entry *_bfd_elf_archive_symbol_lookup
+  (bfd *, struct bfd_link_info *, const char *);
+extern bfd_boolean bfd_elf_link_add_symbols
+  (bfd *, struct bfd_link_info *);
+extern bfd_boolean _bfd_elf_add_dynamic_entry
   (struct bfd_link_info *, bfd_vma, bfd_vma);
 
-#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 bfd_boolean bfd_elf_link_record_dynamic_symbol
+  (struct bfd_link_info *, struct elf_link_hash_entry *);
 
-extern int elf_link_record_local_dynamic_symbol
+extern int bfd_elf_link_record_local_dynamic_symbol
   (struct bfd_link_info *, bfd *, long);
-#define _bfd_elf32_link_record_local_dynamic_symbol \
-  elf_link_record_local_dynamic_symbol
-#define _bfd_elf64_link_record_local_dynamic_symbol \
-  elf_link_record_local_dynamic_symbol
 
 extern bfd_boolean _bfd_elf_close_and_cleanup
   (bfd *);
@@ -1662,33 +1716,36 @@ extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
   (bfd *, arelent *, struct bfd_symbol *, void *,
    asection *, bfd *, char **);
 
-extern bfd_boolean _bfd_elf32_gc_sections
-  (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf32_gc_common_finalize_got_offsets
+extern bfd_boolean bfd_elf_final_link
   (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf32_gc_common_final_link
+
+extern bfd_boolean bfd_elf_gc_sections
   (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf32_gc_record_vtinherit
+
+extern bfd_boolean bfd_elf_gc_record_vtinherit
   (bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
-extern bfd_boolean _bfd_elf32_gc_record_vtentry
+
+extern bfd_boolean bfd_elf_gc_record_vtentry
   (bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
 
-extern bfd_boolean _bfd_elf64_gc_sections
-  (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf64_gc_common_finalize_got_offsets
+extern bfd_boolean _bfd_elf_gc_mark
+  (struct bfd_link_info *, asection *,
+   asection * (*) (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
+                  struct elf_link_hash_entry *, Elf_Internal_Sym *));
+
+extern bfd_boolean bfd_elf_gc_common_finalize_got_offsets
   (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf64_gc_common_final_link
+
+extern bfd_boolean bfd_elf_gc_common_final_link
   (bfd *, struct bfd_link_info *);
-extern bfd_boolean _bfd_elf64_gc_record_vtinherit
-  (bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
-extern bfd_boolean _bfd_elf64_gc_record_vtentry
-  (bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
 
-extern bfd_boolean _bfd_elf32_reloc_symbol_deleted_p
-  (bfd_vma, void *);
-extern bfd_boolean _bfd_elf64_reloc_symbol_deleted_p
+extern bfd_boolean bfd_elf_reloc_symbol_deleted_p
   (bfd_vma, void *);
 
+extern struct elf_segment_map *
+_bfd_elf_make_dynamic_segment
+  (bfd *, asection *);
+
 /* Exported interface for writing elf corefile notes. */
 extern char *elfcore_write_note
   (bfd *, char *, int *, const char *, int, const void *, int);
@@ -1717,60 +1774,71 @@ extern bfd *_bfd_elf64_bfd_from_remote_memory
 extern bfd_boolean _sh_elf_set_mach_from_flags
   (bfd *);
 
+/* This is the condition under which finish_dynamic_symbol will be called.
+   If our finish_dynamic_symbol isn't called, we'll need to do something
+   about initializing any .plt and .got entries in relocate_section.  */
+#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
+  ((DYN)                                                               \
+   && ((SHARED) || !(H)->forced_local)                                 \
+   && ((H)->dynindx != -1 || (H)->forced_local))
+
 /* This macro is to avoid lots of duplicated code in the body
    of xxx_relocate_section() in the various elfxx-xxxx.c files.  */
-#define RELOC_FOR_GLOBAL_SYMBOL(h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned)  \
-  do                                                                                                                   \
-    {                                                                                                                  \
-      /* It seems this can happen with erroneous or unsupported                                                                \
-        input (mixing a.out and elf in an archive, for example.)  */                                                   \
-      if (sym_hashes == NULL)                                                                                          \
-       return FALSE;                                                                                                   \
-                                                                                                                       \
-      h = sym_hashes[r_symndx - symtab_hdr->sh_info];                                                                  \
-                                                                                                                       \
-      while (h->root.type == bfd_link_hash_indirect                                                                    \
-            || h->root.type == bfd_link_hash_warning)                                                                  \
-       h = (struct elf_link_hash_entry *) h->root.u.i.link;                                                            \
-                                                                                                                       \
-      warned = FALSE;                                                                                                  \
-      unresolved_reloc = FALSE;                                                                                                \
-      relocation = 0;                                                                                                  \
-      if (h->root.type == bfd_link_hash_defined                                                                                \
-         || h->root.type == bfd_link_hash_defweak)                                                                     \
-       {                                                                                                               \
-         sec = h->root.u.def.section;                                                                                  \
-         if (sec == NULL                                                                                               \
-             || sec->output_section == NULL)                                                                           \
-           /* Set a flag that will be cleared later if we find a                                                       \
-              relocation value for this symbol.  output_section                                                        \
-              is typically NULL for symbols satisfied by a shared                                                      \
-              library.  */                                                                                             \
-           unresolved_reloc = TRUE;                                                                                    \
-         else                                                                                                          \
-           relocation = (h->root.u.def.value                                                                           \
-                         + sec->output_section->vma                                                                    \
-                         + sec->output_offset);                                                                        \
-       }                                                                                                               \
-      else if (h->root.type == bfd_link_hash_undefweak)                                                                        \
-       ;                                                                                                               \
-      else if (!info->executable                                                                                       \
-              && info->unresolved_syms_in_objects == RM_IGNORE                                                         \
-              && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)                                                          \
-       ;                                                                                                               \
-      else                                                                                                             \
-       {                                                                                                               \
-         if (! info->callbacks->undefined_symbol                                                                       \
-             (info, h->root.root.string, input_bfd,                                                                    \
-              input_section, rel->r_offset,                                                                            \
-              ((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)                             \
-               || (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR)                             \
-               || ELF_ST_VISIBILITY (h->other))                                                                        \
-              ))                                                                                                       \
-           return FALSE;                                                                                               \
-         warned = TRUE;                                                                                                \
-       }                                                                                                               \
-    }                                                                                                                  \
+#define RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel,   \
+                               r_symndx, symtab_hdr, sym_hashes,       \
+                               h, sec, relocation,                     \
+                               unresolved_reloc, warned)               \
+  do                                                                   \
+    {                                                                  \
+      /* It seems this can happen with erroneous or unsupported                \
+        input (mixing a.out and elf in an archive, for example.)  */   \
+      if (sym_hashes == NULL)                                          \
+       return FALSE;                                                   \
+                                                                       \
+      h = sym_hashes[r_symndx - symtab_hdr->sh_info];                  \
+                                                                       \
+      while (h->root.type == bfd_link_hash_indirect                    \
+            || h->root.type == bfd_link_hash_warning)                  \
+       h = (struct elf_link_hash_entry *) h->root.u.i.link;            \
+                                                                       \
+      warned = FALSE;                                                  \
+      unresolved_reloc = FALSE;                                                \
+      relocation = 0;                                                  \
+      if (h->root.type == bfd_link_hash_defined                                \
+         || h->root.type == bfd_link_hash_defweak)                     \
+       {                                                               \
+         sec = h->root.u.def.section;                                  \
+         if (sec == NULL                                               \
+             || sec->output_section == NULL)                           \
+           /* Set a flag that will be cleared later if we find a       \
+              relocation value for this symbol.  output_section        \
+              is typically NULL for symbols satisfied by a shared      \
+              library.  */                                             \
+           unresolved_reloc = TRUE;                                    \
+         else                                                          \
+           relocation = (h->root.u.def.value                           \
+                         + sec->output_section->vma                    \
+                         + sec->output_offset);                        \
+       }                                                               \
+      else if (h->root.type == bfd_link_hash_undefweak)                        \
+       ;                                                               \
+      else if (info->unresolved_syms_in_objects == RM_IGNORE           \
+              && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)          \
+       ;                                                               \
+      else                                                             \
+       {                                                               \
+         bfd_boolean err;                                              \
+         err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR  \
+                || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);       \
+         if (!info->callbacks->undefined_symbol (info,                 \
+                                                 h->root.root.string,  \
+                                                 input_bfd,            \
+                                                 input_section,        \
+                                                 rel->r_offset, err))  \
+           return FALSE;                                               \
+         warned = TRUE;                                                \
+       }                                                               \
+    }                                                                  \
   while (0)
 
 #endif /* _LIBELF_H_ */
This page took 0.032693 seconds and 4 git commands to generate.