x86: Add GENERATE_DYNAMIC_RELOCATION_P
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 6 Oct 2017 07:40:56 +0000 (00:40 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 6 Oct 2017 07:41:58 +0000 (00:41 -0700)
Add GENERATE_DYNAMIC_RELOCATION_P which returns TRUE if dynamic
relocation should be generated.

* 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.
(elf_x86_64_relocate_section): Use GENERATE_DYNAMIC_RELOCATION_P.
* elfxx-x86.h (GENERATE_DYNAMIC_RELOCATION_P): New.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.h

index feff37e078414cd7ba52c36717a5071178bde4f9..0f066026d416fd21a870f8894cf50aa5e32d5f83 100644 (file)
@@ -1,3 +1,11 @@
+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.
+       (elf_x86_64_relocate_section): Use GENERATE_DYNAMIC_RELOCATION_P.
+       * elfxx-x86.h (GENERATE_DYNAMIC_RELOCATION_P): New.
+
 2017-10-06  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elfxx-x86.h (POINTER_LOCAL_IFUNC_P): New.
index b6c478d901dd02ba54e714521922175771cc8b66..0c63d267448e94abc6040cdd8b1e9b1629757502 100644 (file)
@@ -184,6 +184,8 @@ static reloc_howto_type elf_howto_table[]=
 
 #define X86_PCREL_TYPE_P(TYPE) ((TYPE) == R_386_PC32)
 
+#define X86_SIZE_TYPE_P(TYPE) ((TYPE) == R_386_SIZE32)
+
 #ifdef DEBUG_GEN_RELOC
 #define TRACE(str) \
   fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
@@ -2749,29 +2751,9 @@ disallow_got32:
              || is_vxworks_tls)
            break;
 
-         /* Copy dynamic function pointer relocations.  Don't generate
-            dynamic relocations against resolved undefined weak symbols
-            in PIE, except for R_386_PC32.  */
-         if ((bfd_link_pic (info)
-              && (h == NULL
-                  || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
-                       && (!resolved_to_zero
-                           || r_type == R_386_PC32))
-                      || h->root.type != bfd_link_hash_undefweak))
-              && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
-                  || !SYMBOL_CALLS_LOCAL (info, h)))
-             || (ELIMINATE_COPY_RELOCS
-                 && !bfd_link_pic (info)
-                 && h != NULL
-                 && h->dynindx != -1
-                 && (!h->non_got_ref
-                     || eh->func_pointer_refcount > 0
-                     || (h->root.type == bfd_link_hash_undefweak
-                         && !resolved_to_zero))
-                 && ((h->def_dynamic && !h->def_regular)
-                     /* Undefined weak symbol is bound locally when
-                        PIC is false.  */
-                     || h->root.type == bfd_link_hash_undefweak)))
+         if (GENERATE_DYNAMIC_RELOCATION_P (info, eh, r_type,
+                                            FALSE, resolved_to_zero,
+                                            (r_type == R_386_PC32)))
            {
              Elf_Internal_Rela outrel;
              bfd_boolean skip, relocate;
index f5ba5a6cc9dfe5eacf713fc20b8b75b5a16abcc7..b27d4c5761fc7fd0ae52fd844458bba3ae57ea1b 100644 (file)
@@ -206,6 +206,9 @@ static reloc_howto_type x86_64_elf_howto_table[] =
    || ((TYPE) == R_X86_64_PC32_BND)    \
    || ((TYPE) == R_X86_64_PC64))
 
+#define X86_SIZE_TYPE_P(TYPE)          \
+  ((TYPE) == R_X86_64_SIZE32 || (TYPE) == R_X86_64_SIZE64)
+
 /* Map BFD relocs to the x86_64 elf relocs.  */
 struct elf_reloc_map
 {
@@ -2393,6 +2396,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
       bfd_boolean resolved_to_zero;
       bfd_boolean relative_reloc;
       bfd_boolean converted_reloc;
+      bfd_boolean need_copy_reloc_in_pie;
 
       r_type = ELF32_R_TYPE (rel->r_info);
       if (r_type == (int) R_X86_64_GNU_VTINHERIT
@@ -3085,40 +3089,18 @@ direct:
          if ((input_section->flags & SEC_ALLOC) == 0)
            break;
 
-          /* Don't copy a pc-relative relocation into the output file
-             if the symbol needs copy reloc or the symbol is undefined
-             when building executable.  Copy dynamic function pointer
-             relocations.  Don't generate dynamic relocations against
-             resolved undefined weak symbols in PIE.  */
-         if ((bfd_link_pic (info)
-              && !(bfd_link_pie (info)
-                   && h != NULL
-                   && (h->needs_copy
-                       || eh->needs_copy
-                       || h->root.type == bfd_link_hash_undefined)
-                   && (X86_PCREL_TYPE_P (r_type)
-                       || r_type == R_X86_64_SIZE32
-                       || r_type == R_X86_64_SIZE64))
-              && (h == NULL
-                  || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
-                       && !resolved_to_zero)
-                      || h->root.type != bfd_link_hash_undefweak))
-              && ((! X86_PCREL_TYPE_P (r_type)
-                     && r_type != R_X86_64_SIZE32
-                     && r_type != R_X86_64_SIZE64)
-                  || ! SYMBOL_CALLS_LOCAL (info, h)))
-             || (ELIMINATE_COPY_RELOCS
-                 && !bfd_link_pic (info)
-                 && h != NULL
-                 && h->dynindx != -1
-                 && (!h->non_got_ref
-                     || eh->func_pointer_refcount > 0
-                     || (h->root.type == bfd_link_hash_undefweak
-                         && !resolved_to_zero))
-                 && ((h->def_dynamic && !h->def_regular)
-                     /* Undefined weak symbol is bound locally when
-                        PIC is false.  */
-                     || h->root.type == bfd_link_hash_undefined)))
+         need_copy_reloc_in_pie = (bfd_link_pie (info)
+                                   && h != NULL
+                                   && (h->needs_copy
+                                       || eh->needs_copy
+                                       || (h->root.type
+                                           == bfd_link_hash_undefined))
+                                   && (X86_PCREL_TYPE_P (r_type)
+                                       || X86_SIZE_TYPE_P (r_type)));
+
+         if (GENERATE_DYNAMIC_RELOCATION_P (info, eh, r_type,
+                                            need_copy_reloc_in_pie,
+                                            resolved_to_zero, FALSE))
            {
              Elf_Internal_Rela outrel;
              bfd_boolean skip, relocate;
index 3be85d085f2f3f7c429e62205a2ec854b4c0ce19..cef2eba30e3dd2ee69292dd0c5f8c249f39b4483 100644 (file)
                        && ((H)->root.type == bfd_link_hash_defweak \
                            || !(H)->def_regular)))
 
+/* TRUE if dynamic relocation should be generated.  Don't copy a
+   pc-relative relocation into the output file if the symbol needs
+   copy reloc or the symbol is undefined when building executable.
+   Copy dynamic function pointer relocations.  Don't generate dynamic
+   relocations against resolved undefined weak symbols in PIE, except
+   when PC32_RELOC is TRUE.  Undefined weak symbol is bound locally
+   when PIC is false.  */
+#define GENERATE_DYNAMIC_RELOCATION_P(INFO, EH, R_TYPE, \
+                                     NEED_COPY_RELOC_IN_PIE, \
+                                     RESOLVED_TO_ZERO, PC32_RELOC) \
+  ((bfd_link_pic (INFO) \
+    && !(NEED_COPY_RELOC_IN_PIE) \
+    && ((EH) == NULL \
+       || ((ELF_ST_VISIBILITY ((EH)->elf.other) == STV_DEFAULT \
+            && (!(RESOLVED_TO_ZERO) || PC32_RELOC)) \
+           || (EH)->elf.root.type != bfd_link_hash_undefweak)) \
+    && ((!X86_PCREL_TYPE_P (R_TYPE) \
+        && !X86_SIZE_TYPE_P (R_TYPE)) \
+        || ! SYMBOL_CALLS_LOCAL ((INFO), &(EH)->elf))) \
+   || (ELIMINATE_COPY_RELOCS \
+       && !bfd_link_pic (INFO) \
+       && (EH) != NULL \
+       && (EH)->elf.dynindx != -1 \
+       && (!(EH)->elf.non_got_ref \
+          || (EH)->func_pointer_refcount > 0 \
+          || ((EH)->elf.root.type == bfd_link_hash_undefweak \
+              && !(RESOLVED_TO_ZERO))) \
+              && (((EH)->elf.def_dynamic && !(EH)->elf.def_regular) \
+                  || (EH)->elf.root.type == bfd_link_hash_undefined)))
+
 /* 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.  */
This page took 0.031874 seconds and 4 git commands to generate.