Update year range in copyright notice of binutils files
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index 00ed5d17a5a60b87b1d301c6dbe62d71868a0c70..c7d8bca710215008a452908c8bb7903500cdb893 100644 (file)
@@ -1,5 +1,5 @@
 /* X86-64 specific support for ELF
-   Copyright (C) 2000-2018 Free Software Foundation, Inc.
+   Copyright (C) 2000-2019 Free Software Foundation, Inc.
    Contributed by Jan Hubicka <jh@suse.cz>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -282,9 +282,10 @@ elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
       if (r_type >= (unsigned int) R_X86_64_standard)
        {
          /* xgettext:c-format */
-         _bfd_error_handler (_("%B: invalid relocation type %d"),
-                             abfd, (int) r_type);
-         r_type = R_X86_64_NONE;
+         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                             abfd, r_type);
+         bfd_set_error (bfd_error_bad_value);
+         return NULL;
        }
       i = r_type;
     }
@@ -336,19 +337,18 @@ elf_x86_64_reloc_name_lookup (bfd *abfd,
 
 /* Given an x86_64 ELF reloc type, fill in an arelent structure.  */
 
-static void
-elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+static bfd_boolean
+elf_x86_64_info_to_howto (bfd *abfd, arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
   unsigned r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  if (r_type != (unsigned int) R_X86_64_GNU_VTINHERIT
-      && r_type != (unsigned int) R_X86_64_GNU_VTENTRY)
-    r_type &= ~R_X86_64_converted_reloc_bit;
   cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
-
+  if (cache_ptr->howto == NULL)
+    return FALSE;
   BFD_ASSERT (r_type == cache_ptr->howto->type || cache_ptr->howto->type == R_X86_64_NONE);
+  return TRUE;
 }
 \f
 /* Support for core dump NOTE sections.  */
@@ -439,6 +439,10 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 }
 
 #ifdef CORE_HEADER
+# if GCC_VERSION >= 8000
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wstringop-truncation"
+# endif
 static char *
 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
                            int note_type, ...)
@@ -524,6 +528,9 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
     }
   /* NOTREACHED */
 }
+# if GCC_VERSION >= 8000
+#  pragma GCC diagnostic pop
+# endif
 #endif
 \f
 /* Functions for the x86-64 ELF linker.         */
@@ -653,6 +660,14 @@ static const bfd_byte elf_x32_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
   0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1)  */
 };
 
+/* The TLSDESC entry in a lazy procedure linkage table.  */
+static const bfd_byte elf_x86_64_tlsdesc_plt_entry[LAZY_PLT_ENTRY_SIZE] =
+{
+  0xf3, 0x0f, 0x1e, 0xfa,           /* endbr64                */
+  0xff, 0x35, 8, 0, 0, 0,           /* pushq GOT+8(%rip)       */
+  0xff, 0x25, 16, 0, 0, 0           /* jmpq *GOT+TDG(%rip)     */
+};
+
 /* .eh_frame covering the lazy .plt section.  */
 
 static const bfd_byte elf_x86_64_eh_frame_lazy_plt[] =
@@ -827,6 +842,12 @@ static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_plt =
     LAZY_PLT_ENTRY_SIZE,               /* plt0_entry_size */
     elf_x86_64_lazy_plt_entry,         /* plt_entry */
     LAZY_PLT_ENTRY_SIZE,               /* plt_entry_size */
+    elf_x86_64_tlsdesc_plt_entry,      /* plt_tlsdesc_entry */
+    LAZY_PLT_ENTRY_SIZE,               /* plt_tlsdesc_entry_size */
+    6,                                 /* plt_tlsdesc_got1_offset */
+    12,                                        /* plt_tlsdesc_got2_offset */
+    10,                                        /* plt_tlsdesc_got1_insn_end */
+    16,                                        /* plt_tlsdesc_got2_insn_end */
     2,                                 /* plt0_got1_offset */
     8,                                 /* plt0_got2_offset */
     12,                                        /* plt0_got2_insn_end */
@@ -859,6 +880,12 @@ static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_bnd_plt =
     LAZY_PLT_ENTRY_SIZE,               /* plt0_entry_size */
     elf_x86_64_lazy_bnd_plt_entry,     /* plt_entry */
     LAZY_PLT_ENTRY_SIZE,               /* plt_entry_size */
+    elf_x86_64_tlsdesc_plt_entry,      /* plt_tlsdesc_entry */
+    LAZY_PLT_ENTRY_SIZE,               /* plt_tlsdesc_entry_size */
+    6,                                 /* plt_tlsdesc_got1_offset */
+    12,                                        /* plt_tlsdesc_got2_offset */
+    10,                                        /* plt_tlsdesc_got1_insn_end */
+    16,                                        /* plt_tlsdesc_got2_insn_end */
     2,                                 /* plt0_got1_offset */
     1+8,                               /* plt0_got2_offset */
     1+12,                              /* plt0_got2_insn_end */
@@ -891,6 +918,12 @@ static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_ibt_plt =
     LAZY_PLT_ENTRY_SIZE,               /* plt0_entry_size */
     elf_x86_64_lazy_ibt_plt_entry,     /* plt_entry */
     LAZY_PLT_ENTRY_SIZE,               /* plt_entry_size */
+    elf_x86_64_tlsdesc_plt_entry,      /* plt_tlsdesc_entry */
+    LAZY_PLT_ENTRY_SIZE,               /* plt_tlsdesc_entry_size */
+    6,                                 /* plt_tlsdesc_got1_offset */
+    12,                                        /* plt_tlsdesc_got2_offset */
+    10,                                        /* plt_tlsdesc_got1_insn_end */
+    16,                                        /* plt_tlsdesc_got2_insn_end */
     2,                                 /* plt0_got1_offset */
     1+8,                               /* plt0_got2_offset */
     1+12,                              /* plt0_got2_insn_end */
@@ -912,6 +945,12 @@ static const struct elf_x86_lazy_plt_layout elf_x32_lazy_ibt_plt =
     LAZY_PLT_ENTRY_SIZE,               /* plt0_entry_size */
     elf_x32_lazy_ibt_plt_entry,                /* plt_entry */
     LAZY_PLT_ENTRY_SIZE,               /* plt_entry_size */
+    elf_x86_64_tlsdesc_plt_entry,      /* plt_tlsdesc_entry */
+    LAZY_PLT_ENTRY_SIZE,               /* plt_tlsdesc_entry_size */
+    6,                                 /* plt_tlsdesc_got1_offset */
+    12,                                        /* plt_tlsdesc_got2_offset */
+    10,                                        /* plt_tlsdesc_got1_insn_end */
+    16,                                        /* plt_tlsdesc_got2_insn_end */
     2,                                 /* plt0_got1_offset */
     8,                                 /* plt0_got2_offset */
     12,                                        /* plt0_got2_insn_end */
@@ -1311,6 +1350,9 @@ elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
       from = elf_x86_64_rtype_to_howto (abfd, from_type);
       to = elf_x86_64_rtype_to_howto (abfd, to_type);
 
+      if (from == NULL || to == NULL)
+       return FALSE;
+
       if (h)
        name = h->root.root.string;
       else
@@ -1332,9 +1374,9 @@ elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
 
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%B: TLS transition from %s to %s against `%s' at %#Lx "
-          "in section `%A' failed"),
-        abfd, from->name, to->name, name, rel->r_offset, sec);
+       (_("%pB: TLS transition from %s to %s against `%s' at %#" PRIx64
+          " in section `%pA' failed"),
+        abfd, from->name, to->name, name, (uint64_t) rel->r_offset, sec);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
     }
@@ -1401,7 +1443,7 @@ elf_x86_64_need_pic (struct bfd_link_info *info,
     object = _("a PDE object");
 
   /* xgettext:c-format */
-  _bfd_error_handler (_("%B: relocation %s against %s%s`%s' can "
+  _bfd_error_handler (_("%pB: relocation %s against %s%s`%s' can "
                        "not be used when making %s%s"),
                      input_bfd, howto->name, und, v, name,
                      object, pic);
@@ -1820,7 +1862,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
        {
          /* xgettext:c-format */
-         _bfd_error_handler (_("%B: bad symbol index: %d"),
+         _bfd_error_handler (_("%pB: bad symbol index: %d"),
                              abfd, r_symndx);
          goto error_return;
        }
@@ -1886,7 +1928,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                                           NULL);
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B: relocation %s against symbol `%s' isn't "
+                 (_("%pB: relocation %s against symbol `%s' isn't "
                     "supported in x32 mode"), abfd,
                   x86_64_elf_howto_table[r_type].name, name);
                bfd_set_error (bfd_error_bad_value);
@@ -2028,7 +2070,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                                               isym, NULL);
                    _bfd_error_handler
                      /* xgettext:c-format */
-                     (_("%B: '%s' accessed both as normal and"
+                     (_("%pB: '%s' accessed both as normal and"
                         " thread local symbol"),
                       abfd, name);
                    bfd_set_error (bfd_error_bad_value);
@@ -2347,7 +2389,11 @@ elf_x86_64_relocate_section (bfd *output_bfd,
   if (htab == NULL)
     return FALSE;
 
-  BFD_ASSERT (is_x86_elf (input_bfd, htab));
+  if (!is_x86_elf (input_bfd, htab))
+    {
+      bfd_set_error (bfd_error_wrong_format);
+      return FALSE;
+    }
 
   plt_entry_size = htab->plt.plt_entry_size;
   symtab_hdr = &elf_symtab_hdr (input_bfd);
@@ -2389,19 +2435,18 @@ elf_x86_64_relocate_section (bfd *output_bfd,
          continue;
        }
 
+      r_symndx = htab->r_sym (rel->r_info);
       converted_reloc = (r_type & R_X86_64_converted_reloc_bit) != 0;
-      r_type &= ~R_X86_64_converted_reloc_bit;
+      if (converted_reloc)
+       {
+         r_type &= ~R_X86_64_converted_reloc_bit;
+         rel->r_info = htab->r_info (r_symndx, r_type);
+       }
 
-      if (r_type >= (int) R_X86_64_standard)
+      howto = elf_x86_64_rtype_to_howto (input_bfd, r_type);
+      if (howto == NULL)
        return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
 
-      if (r_type != (int) R_X86_64_32
-         || ABI_64_P (output_bfd))
-       howto = x86_64_elf_howto_table + r_type;
-      else
-       howto = (x86_64_elf_howto_table
-                + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
-      r_symndx = htab->r_sym (rel->r_info);
       h = NULL;
       sym = NULL;
       sec = NULL;
@@ -2444,7 +2489,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
       if (sec != NULL && discarded_section (sec))
        {
          _bfd_clear_contents (howto, input_bfd, input_section,
-                              contents + rel->r_offset);
+                              contents, rel->r_offset);
          wrel->r_offset = rel->r_offset;
          wrel->r_info = 0;
          wrel->r_addend = 0;
@@ -2497,6 +2542,10 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 
          if ((input_section->flags & SEC_ALLOC) == 0)
            {
+             /* If this is a SHT_NOTE section without SHF_ALLOC, treat
+                STT_GNU_IFUNC symbol as STT_FUNC.  */
+             if (elf_section_type (input_section) == SHT_NOTE)
+               goto skip_ifunc;
              /* Dynamic relocs are not propagated for SEC_DEBUGGING
                 sections because such sections are not SEC_ALLOC and
                 thus ld.so will not process them.  */
@@ -2618,7 +2667,7 @@ bad_ifunc_reloc:
                                         NULL);
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: relocation %s against STT_GNU_IFUNC "
+               (_("%pB: relocation %s against STT_GNU_IFUNC "
                   "symbol `%s' isn't supported"), input_bfd,
                 howto->name, name);
              bfd_set_error (bfd_error_bad_value);
@@ -2644,9 +2693,9 @@ do_ifunc_pointer:
                                             sym, NULL);
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B: relocation %s against STT_GNU_IFUNC "
-                      "symbol `%s' has non-zero addend: %Ld"),
-                    input_bfd, howto->name, name, rel->r_addend);
+                   (_("%pB: relocation %s against STT_GNU_IFUNC "
+                      "symbol `%s' has non-zero addend: %" PRId64),
+                    input_bfd, howto->name, name, (int64_t) rel->r_addend);
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
@@ -2675,7 +2724,7 @@ do_ifunc_pointer:
 
                  if (POINTER_LOCAL_IFUNC_P (info, h))
                    {
-                     info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                     info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
                                              h->root.root.string,
                                              h->root.u.def.section->owner);
 
@@ -2720,6 +2769,7 @@ do_ifunc_pointer:
            }
        }
 
+skip_ifunc:
       resolved_to_zero = (eh != NULL
                          && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
 
@@ -2881,7 +2931,7 @@ do_ifunc_pointer:
 
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s"
+                   (_("%pB: relocation R_X86_64_GOTOFF64 against undefined %s"
                       " `%s' can not be used when making a shared object"),
                     input_bfd, v, h->root.root.string);
                  bfd_set_error (bfd_error_bad_value);
@@ -2895,7 +2945,7 @@ do_ifunc_pointer:
                {
                  _bfd_error_handler
              /* xgettext:c-format */
-                   (_("%B: relocation R_X86_64_GOTOFF64 against protected %s"
+                   (_("%pB: relocation R_X86_64_GOTOFF64 against protected %s"
                       " `%s' can not be used when making a shared object"),
                     input_bfd,
                     h->type == STT_FUNC ? "function" : "data",
@@ -3155,11 +3205,12 @@ direct:
                                                     sym, NULL);
                          _bfd_error_handler
                            /* xgettext:c-format */
-                           (_("%B: addend %s%#x in relocation %s against "
-                              "symbol `%s' at %#Lx in section `%A' is "
-                              "out of range"),
+                           (_("%pB: addend %s%#x in relocation %s against "
+                              "symbol `%s' at %#" PRIx64
+                              " in section `%pA' is out of range"),
                             input_bfd, addend < 0 ? "-" : "", addend,
-                            howto->name, name, rel->r_offset, input_section);
+                            howto->name, name, (uint64_t) rel->r_offset,
+                            input_section);
                          bfd_set_error (bfd_error_bad_value);
                          return FALSE;
                        }
@@ -3792,10 +3843,11 @@ direct:
            default:
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
+               (_("%pB(%pA+%#" PRIx64 "): "
+                  "unresolvable %s relocation against symbol `%s'"),
                 input_bfd,
                 input_section,
-                rel->r_offset,
+                (uint64_t) rel->r_offset,
                 howto->name,
                 h->root.root.string);
              return FALSE;
@@ -3841,9 +3893,9 @@ check_relocation_error:
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B(%A+%#Lx): reloc against `%s': error %d"),
+               (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
                 input_bfd, input_section,
-                rel->r_offset, name, (int) r);
+                (uint64_t) rel->r_offset, name, (int) r);
              return FALSE;
            }
        }
@@ -3988,7 +4040,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       /* Check PC-relative offset overflow in PLT entry.  */
       if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
        /* xgettext:c-format */
-       info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
+       info->callbacks->einfo (_("%F%pB: PC-relative offset overflow in PLT entry for `%s'\n"),
                                output_bfd, h->root.root.string);
 
       bfd_put_32 (output_bfd, plt_got_pcrel_offset,
@@ -4014,7 +4066,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                           + got_offset);
          if (PLT_LOCAL_IFUNC_P (info, h))
            {
-             info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+             info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
                                      h->root.root.string,
                                      h->root.u.def.section->owner);
 
@@ -4051,7 +4103,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                 will overflow first.  */
              if (plt0_offset > 0x80000000)
                /* xgettext:c-format */
-               info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
+               info->callbacks->einfo (_("%F%pB: branch displacement overflow in PLT entry for `%s'\n"),
                                        output_bfd, h->root.root.string);
              bfd_put_32 (output_bfd, - plt0_offset,
                          (plt->contents + h->plt.offset
@@ -4104,7 +4156,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       if ((got_after_plt && got_pcrel_offset < 0)
          || (!got_after_plt && got_pcrel_offset > 0))
        /* xgettext:c-format */
-       info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
+       info->callbacks->einfo (_("%F%pB: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
                                output_bfd, h->root.root.string);
 
       bfd_put_32 (output_bfd, got_pcrel_offset,
@@ -4130,6 +4182,8 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
        sym->st_value = 0;
     }
 
+  _bfd_x86_elf_link_fixup_ifunc_symbol (info, htab, h, sym);
+
   /* Don't generate dynamic GOT relocation against undefined weak
      symbol in executable.  */
   if (h->got.offset != (bfd_vma) -1
@@ -4168,7 +4222,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                }
              if (SYMBOL_REFERENCES_LOCAL_P (info, h))
                {
-                 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                 info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
                                          h->root.root.string,
                                          h->root.u.def.section->owner);
 
@@ -4402,11 +4456,12 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
                      htab->elf.sgot->contents + htab->tlsdesc_got);
 
          memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
-                 htab->lazy_plt->plt0_entry,
-                 htab->lazy_plt->plt0_entry_size);
+                 htab->lazy_plt->plt_tlsdesc_entry,
+                 htab->lazy_plt->plt_tlsdesc_entry_size);
 
-         /* Add offset for pushq GOT+8(%rip), since the
-            instruction uses 6 bytes subtract this value.  */
+         /* Add offset for pushq GOT+8(%rip), since ENDBR64 uses 4
+            bytes and the instruction uses 6 bytes, subtract these
+            values.  */
          bfd_put_32 (output_bfd,
                      (htab->elf.sgotplt->output_section->vma
                       + htab->elf.sgotplt->output_offset
@@ -4414,14 +4469,13 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
                       - htab->elf.splt->output_section->vma
                       - htab->elf.splt->output_offset
                       - htab->tlsdesc_plt
-                      - 6),
+                      - htab->lazy_plt->plt_tlsdesc_got1_insn_end),
                      (htab->elf.splt->contents
                       + htab->tlsdesc_plt
-                      + htab->lazy_plt->plt0_got1_offset));
-         /* Add offset for the PC-relative instruction accessing
-            GOT+TDG, where TDG stands for htab->tlsdesc_got,
-            subtracting the offset to the end of that
-            instruction.  */
+                      + htab->lazy_plt->plt_tlsdesc_got1_offset));
+         /* Add offset for indirect branch via GOT+TDG, where TDG
+            stands for htab->tlsdesc_got, subtracting the offset
+            to the end of that instruction.  */
          bfd_put_32 (output_bfd,
                      (htab->elf.sgot->output_section->vma
                       + htab->elf.sgot->output_offset
@@ -4429,10 +4483,10 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
                       - htab->elf.splt->output_section->vma
                       - htab->elf.splt->output_offset
                       - htab->tlsdesc_plt
-                      - htab->lazy_plt->plt0_got2_insn_end),
+                      - htab->lazy_plt->plt_tlsdesc_got2_insn_end),
                      (htab->elf.splt->contents
                       + htab->tlsdesc_plt
-                      + htab->lazy_plt->plt0_got2_offset));
+                      + htab->lazy_plt->plt_tlsdesc_got2_offset));
        }
     }
 
@@ -4934,7 +4988,11 @@ elf_x86_64_special_sections[]=
 #define ELF_ARCH                           bfd_arch_i386
 #define ELF_TARGET_ID                      X86_64_ELF_DATA
 #define ELF_MACHINE_CODE                   EM_X86_64
-#define ELF_MAXPAGESIZE                            0x200000
+#if DEFAULT_LD_Z_SEPARATE_CODE
+# define ELF_MAXPAGESIZE                   0x1000
+#else
+# define ELF_MAXPAGESIZE                   0x200000
+#endif
 #define ELF_MINPAGESIZE                            0x1000
 #define ELF_COMMONPAGESIZE                 0x1000
 
@@ -5000,6 +5058,9 @@ elf_x86_64_special_sections[]=
 #define elf_backend_hide_symbol \
   _bfd_x86_elf_hide_symbol
 
+#undef elf64_bed
+#define elf64_bed elf64_x86_64_bed
+
 #include "elf64-target.h"
 
 /* CloudABI support.  */
@@ -5214,6 +5275,12 @@ static const struct elf_x86_lazy_plt_layout elf_x86_64_nacl_plt =
     NACL_PLT_ENTRY_SIZE,                    /* plt0_entry_size */
     elf_x86_64_nacl_plt_entry,              /* plt_entry */
     NACL_PLT_ENTRY_SIZE,                    /* plt_entry_size */
+    elf_x86_64_nacl_plt0_entry,                     /* plt_tlsdesc_entry */
+    NACL_PLT_ENTRY_SIZE,                    /* plt_tlsdesc_entry_size */
+    2,                                      /* plt_tlsdesc_got1_offset */
+    9,                                      /* plt_tlsdesc_got2_offset */
+    6,                                      /* plt_tlsdesc_got1_insn_end */
+    13,                                             /* plt_tlsdesc_got2_insn_end */
     2,                                      /* plt0_got1_offset */
     9,                                      /* plt0_got2_offset */
     13,                                             /* plt0_got2_insn_end */
@@ -5284,6 +5351,9 @@ elf32_x86_64_nacl_elf_object_p (bfd *abfd)
 #define elf_backend_size_info \
   _bfd_elf32_size_info
 
+#undef elf32_bed
+#define        elf32_bed                       elf32_x86_64_bed
+
 #include "elf32-target.h"
 
 /* Restore defaults.  */
@@ -5327,7 +5397,11 @@ elf64_l1om_elf_object_p (bfd *abfd)
 #undef ELF_MAXPAGESIZE
 #undef ELF_MINPAGESIZE
 #undef ELF_COMMONPAGESIZE
-#define ELF_MAXPAGESIZE                        0x200000
+#if DEFAULT_LD_Z_SEPARATE_CODE
+# define ELF_MAXPAGESIZE               0x1000
+#else
+# define ELF_MAXPAGESIZE               0x200000
+#endif
 #define ELF_MINPAGESIZE                        0x1000
 #define ELF_COMMONPAGESIZE             0x1000
 #undef elf_backend_plt_alignment
This page took 0.031975 seconds and 4 git commands to generate.