aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf-bfd.h
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf-bfd.h')
-rw-r--r--bfd/elf-bfd.h142
1 files changed, 66 insertions, 76 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index ff26613..5565e49 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -104,6 +104,40 @@ 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
@@ -128,89 +162,47 @@ struct elf_link_hash_entry
bfd_size_type size;
/* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */
- unsigned int type : 8;
+ char type;
/* Symbol st_other value, symbol visibility. */
- unsigned int other : 8;
+ unsigned char other;
+ /* Some flags; legal values follow. */
+ unsigned short elf_link_hash_flags;
/* Symbol is referenced by a non-shared object. */
- unsigned int ref_regular : 1;
+#define ELF_LINK_HASH_REF_REGULAR 01
/* Symbol is defined by a non-shared object. */
- unsigned int def_regular : 1;
+#define ELF_LINK_HASH_DEF_REGULAR 02
/* Symbol is referenced by a shared object. */
- unsigned int ref_dynamic : 1;
+#define ELF_LINK_HASH_REF_DYNAMIC 04
/* Symbol is defined by a shared object. */
- unsigned int def_dynamic : 1;
+#define ELF_LINK_HASH_DEF_DYNAMIC 010
/* Symbol has a non-weak reference from a non-shared object. */
- unsigned int ref_regular_nonweak : 1;
+#define ELF_LINK_HASH_REF_REGULAR_NONWEAK 020
/* Dynamic symbol has been adjustd. */
- unsigned int dynamic_adjusted : 1;
+#define ELF_LINK_HASH_DYNAMIC_ADJUSTED 040
/* Symbol needs a copy reloc. */
- unsigned int needs_copy : 1;
+#define ELF_LINK_HASH_NEEDS_COPY 0100
/* Symbol needs a procedure linkage table entry. */
- unsigned int needs_plt : 1;
+#define ELF_LINK_HASH_NEEDS_PLT 0200
/* Symbol appears in a non-ELF input file. */
- unsigned int non_elf : 1;
+#define ELF_LINK_NON_ELF 0400
/* Symbol should be marked as hidden in the version information. */
- unsigned int hidden : 1;
+#define ELF_LINK_HIDDEN 01000
/* Symbol was forced to local scope due to a version script file. */
- unsigned int forced_local : 1;
+#define ELF_LINK_FORCED_LOCAL 02000
/* Symbol was marked during garbage collection. */
- unsigned int mark : 1;
+#define ELF_LINK_HASH_MARK 04000
/* Symbol is referenced by a non-GOT/non-PLT relocation. This is
not currently set by all the backends. */
- 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;
+#define ELF_LINK_NON_GOT_REF 010000
+ /* Symbol has a definition in a shared object. */
+#define ELF_LINK_DYNAMIC_DEF 020000
/* Symbol is weak in all shared objects. */
- unsigned int dynamic_weak : 1;
+#define ELF_LINK_DYNAMIC_WEAK 040000
/* Symbol is referenced with a relocation where C/C++ pointer equality
matters. */
- 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;
+#define ELF_LINK_POINTER_EQUALITY_NEEDED 0100000
};
/* Will references to this symbol always reference the symbol
@@ -229,8 +221,8 @@ struct elf_link_hash_entry
/* 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)->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 \
+ && ((H)->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 \
&& (H)->root.type == bfd_link_hash_defined)
/* Records local symbols to be emitted in the dynamic symbol table. */
@@ -286,10 +278,9 @@ struct cie
struct eh_cie_fde
{
- /* For FDEs, this points to the CIE used. */
- struct eh_cie_fde *cie_inf;
- unsigned int size;
unsigned int offset;
+ unsigned int size;
+ asection *sec;
unsigned int new_offset;
unsigned char fde_encoding;
unsigned char lsda_encoding;
@@ -298,8 +289,6 @@ struct eh_cie_fde
unsigned int removed : 1;
unsigned int make_relative : 1;
unsigned int make_lsda_relative : 1;
- unsigned int need_relative : 1;
- unsigned int need_lsda_relative : 1;
unsigned int per_encoding_relative : 1;
};
@@ -320,15 +309,14 @@ struct eh_frame_hdr_info
{
struct cie last_cie;
asection *last_cie_sec;
- struct eh_cie_fde *last_cie_inf;
asection *hdr_sec;
+ unsigned int last_cie_offset;
unsigned int fde_count, array_count;
struct eh_frame_array_ent *array;
/* TRUE if .eh_frame_hdr should contain the sorted search table.
We build it if we successfully read all .eh_frame input sections
and recognize them. */
bfd_boolean table;
- bfd_boolean offsets_adjusted;
};
/* ELF linker hash table. */
@@ -1260,7 +1248,7 @@ struct elf_obj_tdata
unsigned int cverrefs;
/* Segment flags for the PT_GNU_STACK segment. */
- unsigned int stack_flags;
+ unsigned int stack_flags;
/* Should the PT_GNU_RELRO segment be emitted? */
bfd_boolean relro;
@@ -1532,7 +1520,7 @@ extern bfd_boolean _bfd_elf_discard_section_eh_frame
extern bfd_boolean _bfd_elf_discard_section_eh_frame_hdr
(bfd *, struct bfd_link_info *);
extern bfd_vma _bfd_elf_eh_frame_section_offset
- (bfd *, struct bfd_link_info *, asection *, bfd_vma);
+ (bfd *, asection *, bfd_vma);
extern bfd_boolean _bfd_elf_write_section_eh_frame
(bfd *, struct bfd_link_info *, asection *, bfd_byte *);
extern bfd_boolean _bfd_elf_write_section_eh_frame_hdr
@@ -1783,8 +1771,10 @@ extern bfd_boolean _sh_elf_set_mach_from_flags
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))
+ && ((SHARED) \
+ || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
+ && ((H)->dynindx != -1 \
+ || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
/* This macro is to avoid lots of duplicated code in the body
of xxx_relocate_section() in the various elfxx-xxxx.c files. */