aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfxx-x86.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-06 00:21:48 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-06 00:23:00 -0700
commitdaf1c414a48baf090f005ce4b319b6881d5d6872 (patch)
tree3813ba5466b90157df7f6ca27b1beb706b0f0902 /bfd/elfxx-x86.h
parent51537393bd939e79f6e9291629fb65a17e6f19da (diff)
downloadgdb-daf1c414a48baf090f005ce4b319b6881d5d6872.zip
gdb-daf1c414a48baf090f005ce4b319b6881d5d6872.tar.gz
gdb-daf1c414a48baf090f005ce4b319b6881d5d6872.tar.bz2
x86: Add NEED_DYNAMIC_RELOCATION_P
Add NEED_DYNAMIC_RELOCATION_P which returns TRUE if dynamic relocation is needed. * elf32-i386.c (X86_PCREL_TYPE_P): New. (elf_i386_check_relocs): Use NEED_DYNAMIC_RELOCATION_P. * elf64-x86-64.c (IS_X86_64_PCREL_TYPE): Renamed to ... (X86_PCREL_TYPE_P): This. (elf_x86_64_check_relocs): Use NEED_DYNAMIC_RELOCATION_P. Replace IS_X86_64_PCREL_TYPE with X86_PCREL_TYPE_P. (elf_x86_64_relocate_section): Replace IS_X86_64_PCREL_TYPE with X86_PCREL_TYPE_P. * elfxx-x86.h (NEED_DYNAMIC_RELOCATION_P): New.
Diffstat (limited to 'bfd/elfxx-x86.h')
-rw-r--r--bfd/elfxx-x86.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index 0525c9c..88202b4 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -74,6 +74,45 @@
&& ((EH)->elf.root.u.def.section->owner->flags & DYNAMIC) != 0 \
&& ((EH)->elf.root.u.def.section->flags & SEC_CODE) == 0)
+/* TRUE if dynamic relocation is needed. If we are creating a shared
+ library, and this is a reloc against a global symbol, or a non PC
+ relative reloc against a local symbol, then we need to copy the reloc
+ into the shared library. However, if we are linking with -Bsymbolic,
+ we do not need to copy a reloc against a global symbol which is
+ defined in an object we are including in the link (i.e., DEF_REGULAR
+ is set). At this point we have not seen all the input files, so it
+ is possible that DEF_REGULAR is not set now but will be set later (it
+ is never cleared). In case of a weak definition, DEF_REGULAR may be
+ cleared later by a strong definition in a shared library. We account
+ for that possibility below by storing information in the relocs_copied
+ field of the hash table entry. A similar situation occurs when
+ creating shared libraries and symbol visibility changes render the
+ symbol local.
+
+ If on the other hand, we are creating an executable, we may need to
+ keep relocations for symbols satisfied by a dynamic library if we
+ manage to avoid copy relocs for the symbol.
+
+ We also need to generate dynamic pointer relocation against
+ STT_GNU_IFUNC symbol in the non-code section. */
+#define NEED_DYNAMIC_RELOCATION_P(INFO, H, SEC, R_TYPE, POINTER_TYPE) \
+ ((bfd_link_pic (INFO) \
+ && (! X86_PCREL_TYPE_P (R_TYPE) \
+ || ((H) != NULL \
+ && (! (bfd_link_pie (INFO) \
+ || SYMBOLIC_BIND ((INFO), (H))) \
+ || (H)->root.type == bfd_link_hash_defweak \
+ || !(H)->def_regular)))) \
+ || ((H) != NULL \
+ && (H)->type == STT_GNU_IFUNC \
+ && (R_TYPE) == POINTER_TYPE \
+ && ((SEC)->flags & SEC_CODE) == 0) \
+ || (ELIMINATE_COPY_RELOCS \
+ && !bfd_link_pic (INFO) \
+ && (H) != NULL \
+ && ((H)->root.type == bfd_link_hash_defweak \
+ || !(H)->def_regular)))
+
/* TRUE if TLS IE->LE transition is OK. */
#define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \
(bfd_link_executable (INFO) \