aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-06 00:43:31 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-06 00:44:38 -0700
commite74399c47c76b8111651f41b52a05401852cf799 (patch)
treefbb5f6b6bd0784f3e5177087b6112131d0b4174d
parentaebcc8ffd201adbee973b414818b01876dabe1a0 (diff)
downloadfsf-binutils-gdb-e74399c47c76b8111651f41b52a05401852cf799.zip
fsf-binutils-gdb-e74399c47c76b8111651f41b52a05401852cf799.tar.gz
fsf-binutils-gdb-e74399c47c76b8111651f41b52a05401852cf799.tar.bz2
x86: Add COPY_INPUT_RELOC_P
Add COPY_INPUT_RELOC_P which returns TRUE if input relocation should be copied to output. * elfxx-x86.h (COPY_INPUT_RELOC_P): New. * elf32-i386.c (elf_i386_relocate_section): Use it. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-i386.c7
-rw-r--r--bfd/elf64-x86-64.c9
-rw-r--r--bfd/elfxx-x86.h9
4 files changed, 17 insertions, 14 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0f06602..6f2f9a2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2017-10-06 H.J. Lu <hongjiu.lu@intel.com>
+ * elfxx-x86.h (COPY_INPUT_RELOC_P): New.
+ * elf32-i386.c (elf_i386_relocate_section): Use it.
+ * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
+
+2017-10-06 H.J. Lu <hongjiu.lu@intel.com>
+
* elf32-i386.c (X86_SIZE_TYPE_P): New.
(elf_i386_relocate_section): Use GENERATE_DYNAMIC_RELOCATION_P.
* elf64-x86-64.c (X86_SIZE_TYPE_P): New.
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 0c63d26..4adb70a 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -2778,12 +2778,7 @@ disallow_got32:
if (skip)
memset (&outrel, 0, sizeof outrel);
- else if (h != NULL
- && h->dynindx != -1
- && (r_type == R_386_PC32
- || !(bfd_link_executable (info)
- || SYMBOLIC_BIND (info, h))
- || !h->def_regular))
+ else if (COPY_INPUT_RELOC_P (info, h, r_type))
outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
else
{
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index b27d4c5..fcc7f55 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3126,14 +3126,7 @@ direct:
if (skip)
memset (&outrel, 0, sizeof outrel);
- /* h->dynindx may be -1 if this symbol was marked to
- become local. */
- else if (h != NULL
- && h->dynindx != -1
- && (X86_PCREL_TYPE_P (r_type)
- || !(bfd_link_executable (info)
- || SYMBOLIC_BIND (info, h))
- || ! h->def_regular))
+ else if (COPY_INPUT_RELOC_P (info, h, r_type))
{
outrel.r_info = htab->r_info (h->dynindx, r_type);
outrel.r_addend = rel->r_addend;
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index cef2eba..be438c0 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -143,6 +143,15 @@
&& (((EH)->elf.def_dynamic && !(EH)->elf.def_regular) \
|| (EH)->elf.root.type == bfd_link_hash_undefined)))
+/* TRUE if this input relocation should be copied to output. H->dynindx
+ may be -1 if this symbol was marked to become local. */
+#define COPY_INPUT_RELOC_P(INFO, H, R_TYPE) \
+ ((H) != NULL \
+ && (H)->dynindx != -1 \
+ && (X86_PCREL_TYPE_P (R_TYPE) \
+ || !(bfd_link_executable (INFO) || SYMBOLIC_BIND ((INFO), (H))) \
+ || !(H)->def_regular))
+
/* TRUE if this is actually a static link, or it is a -Bsymbolic link
and the symbol is defined locally, or the symbol was forced to be
local because of a version file. */