+2013-07-02  Marcus Shawcroft  <marcus.shawcroft@arm.com>
+
+       * elfnn-aarch64.c (aarch64_elf_create_got_section): New.
+       (elfNN_aarch64_check_relocs): Use aarch64_elf_create_got_section.
+       (elfNN_aarch64_create_dynamic_sections): Do not define
+       _GLOBAL_OFFSET_TABLE_; call aarch64_elf_create_got_section.
+
 2013-07-02  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
        * ld-aarch64/emit-relocs-309-low.d: Adjust .text address.
 
   return TRUE;
 }
 
+/* Create the .got section to hold the global offset table.  */
+
+static bfd_boolean
+aarch64_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
+{
+  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+  flagword flags;
+  asection *s;
+  struct elf_link_hash_entry *h;
+  struct elf_link_hash_table *htab = elf_hash_table (info);
+
+  /* This function may be called more than once.  */
+  s = bfd_get_linker_section (abfd, ".got");
+  if (s != NULL)
+    return TRUE;
+
+  flags = bed->dynamic_sec_flags;
+
+  s = bfd_make_section_anyway_with_flags (abfd,
+                                         (bed->rela_plts_and_copies_p
+                                          ? ".rela.got" : ".rel.got"),
+                                         (bed->dynamic_sec_flags
+                                          | SEC_READONLY));
+  if (s == NULL
+      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
+    return FALSE;
+  htab->srelgot = s;
+
+  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
+  if (s == NULL
+      || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
+    return FALSE;
+  htab->sgot = s;
+  htab->sgot->size += GOT_ENTRY_SIZE;
+
+  if (bed->want_got_sym)
+    {
+      /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
+        (or .got.plt) section.  We don't do this in the linker script
+        because we don't want to define the symbol if we are not creating
+        a global offset table.  */
+      h = _bfd_elf_define_linkage_sym (abfd, info, s,
+                                      "_GLOBAL_OFFSET_TABLE_");
+      elf_hash_table (info)->hgot = h;
+      if (h == NULL)
+       return FALSE;
+    }
+
+  if (bed->want_got_plt)
+    {
+      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
+      if (s == NULL
+         || !bfd_set_section_alignment (abfd, s,
+                                        bed->s->log_file_align))
+       return FALSE;
+      htab->sgotplt = s;
+    }
+
+  /* The first bit of the global offset table is the header.  */
+  s->size += bed->got_header_size;
+
+  return TRUE;
+}
+
 /* Look through the relocs for a section during the first phase.  */
 
 static bfd_boolean
                  }
              }
 
-           if (htab->root.sgot == NULL)
-             {
-               if (htab->root.dynobj == NULL)
-                 htab->root.dynobj = abfd;
-               if (!_bfd_elf_create_got_section (htab->root.dynobj, info))
-                 return FALSE;
-               htab->root.sgot->size += GOT_ENTRY_SIZE;
-             }
+           if (htab->root.dynobj == NULL)
+             htab->root.dynobj = abfd;
+           if (! aarch64_elf_create_got_section (htab->root.dynobj, info))
+             return FALSE;
            break;
          }
 
                                       struct bfd_link_info *info)
 {
   struct elf_aarch64_link_hash_table *htab;
-  struct elf_link_hash_entry *h;
+
+  /* We need to create .got section.  */
+  if (!aarch64_elf_create_got_section (dynobj, info))
+    return FALSE;
 
   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
     return FALSE;
   if (!htab->sdynbss || (!info->shared && !htab->srelbss))
     abort ();
 
-  /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
-     dynobj's .got section.  We don't do this in the linker script
-     because we don't want to define the symbol if we are not creating
-     a global offset table.  */
-  h = _bfd_elf_define_linkage_sym (dynobj, info,
-                                  htab->root.sgot, "_GLOBAL_OFFSET_TABLE_");
-  elf_hash_table (info)->hgot = h;
-  if (h == NULL)
-    return FALSE;
-
   return TRUE;
 }
 
 
+2013-07-02  Marcus Shawcroft  <marcus.shawcroft@arm.com>
+
+       * ld-aarch64/gc-plt-relocs.d: Adjust expected .got offsets.
+       * ld-aarch64/tls-desc-ie.d: Likewise.
+       * ld-aarch64/emit-relocs-311.d: Adjust expected symbol.
+       * ld-aarch64/tls-relax-all.d: Likewise.
+       * ld-aarch64/tls-relax-gd-ie.d: Likewise.
+       * ld-aarch64/tls-relax-gdesc-ie.d: Likewise.
+       * ld-aarch64/tls-relax-gdesc-ie-2.d: Likewise.
+
 2013-07-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-x86-64/tlsg.sd: Adjusted.
 
        +1000c: R_AARCH64_ADR_PREL_PG_HI21      tempy2
  +10010:       b0ffff91        adrp    x17, 1000 <tempy3-0x234>
        +10010: R_AARCH64_ADR_PREL_PG_HI21      tempy3
- +10014:       90000083        adrp    x3, 20000 <tempy[+]0xf000>
+ +10014:       90000083        adrp    x3, 20000 <_GLOBAL_OFFSET_TABLE_>
        +10014: R_AARCH64_ADR_GOT_PAGE  gempy
 
 0+8010 \<\.plt\>:
     8010:      a9bf7bf0        stp     x16, x30, \[sp,#-16\]!
     8014:      b0000010        adrp    x16, 9000 .*
-    8018:      f9400a11        ldr     x17, \[x16,#16\]
-    801c:      91004210        add     x16, x16, #0x10
+    8018:      f9400e11        ldr     x17, \[x16,#24\]
+    801c:      91006210        add     x16, x16, #0x18
     8020:      d61f0220        br      x17
     8024:      d503201f        nop
     8028:      d503201f        nop
     802c:      d503201f        nop
     8030:      b0000010        adrp    x16, 9000 .*
-    8034:      f9400e11        ldr     x17, \[x16,#24\]
-    8038:      91006210        add     x16, x16, #0x18
+    8034:      f9401211        ldr     x17, \[x16,#32\]
+    8038:      91008210        add     x16, x16, #0x20
     803c:      d61f0220        br      x17
 
 #objdump: -dr
 #...
  +10000:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
- +10004:       91002000        add     x0, x0, #0x8
+ +10004:       91004000        add     x0, x0, #0x10
  +10008:       94000016        bl      10060 <v1\+0x10060>
  +1000c:       d503201f        nop
  +10010:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
- +10014:       f9400000        ldr     x0, \[x0\]
+ +10014:       f9400400        ldr     x0, \[x0,#8\]
  +10018:       d503201f        nop
  +1001c:       d503201f        nop
  +10020:       d53bd041        mrs     x1, tpidr_el0
  +10024:       8b000020        add     x0, x1, x0
  +10028:       d53bd042        mrs     x2, tpidr_el0
  +1002c:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
- +10030:       f9400000        ldr     x0, \[x0\]
+ +10030:       f9400400        ldr     x0, \[x0,#8\]
  +10034:       8b000040        add     x0, x2, x0
  +10038:       b9400000        ldr     w0, \[x0\]
  +1003c:       0b000020        add     w0, w1, w0
 0000000000010040 <.plt>:
  +10040:       a9bf7bf0        stp     x16, x30, \[sp,#-16\]!
  +10044:       90000090        adrp    x16, 20000 <_GLOBAL_OFFSET_TABLE_>
- +10048:       f9401611        ldr     x17, \[x16,#40\]
- +1004c:       9100a210        add     x16, x16, #0x28
+ +10048:       f9401a11        ldr     x17, \[x16,#48\]
+ +1004c:       9100c210        add     x16, x16, #0x30
  +10050:       d61f0220        br      x17
  +10054:       d503201f        nop
  +10058:       d503201f        nop
  +1005c:       d503201f        nop
  +10060:       90000090        adrp    x16, 20000 <_GLOBAL_OFFSET_TABLE_>
- +10064:       f9401a11        ldr     x17, \[x16,#48\]
- +10068:       9100c210        add     x16, x16, #0x30
+ +10064:       f9401e11        ldr     x17, \[x16,#56\]
+ +10068:       9100e210        add     x16, x16, #0x38
  +1006c:       d61f0220        br      x17
 
 #...
  +10000:       a9bf7bfd        stp     x29, x30, \[sp,#-16\]!
  +10004:       910003fd        mov     x29, sp
- +10008:       90000080        adrp    x0, 20000 <ie_var\+0x1fff0>
+ +10008:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
  +1000c:       f9400400        ldr     x0, \[x0,#8\]
  +10010:       d503201f        nop
  +10014:       d503201f        nop
  +10038:       8b000040        add     x0, x2, x0
  +1003c:       b9400000        ldr     w0, \[x0\]
  +10040:       0b000021        add     w1, w1, w0
- +10044:       90000080        adrp    x0, 20000 <ie_var\+0x1fff0>
+ +10044:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
  +10048:       f9400800        ldr     x0, \[x0,#16\]
  +1004c:       d53bd041        mrs     x1, tpidr_el0
  +10050:       8b000020        add     x0, x1, x0
 
 #ld: -T relocs.ld -e0
 #objdump: -dr
 #...
- +10000:       90000080        adrp    x0, 20000 <var\+0x20000>
+ +10000:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
  +10004:       f9400400        ldr     x0, \[x0,#8\]
  +10008:       d53bd041        mrs     x1, tpidr_el0
  +1000c:       8b000020        add     x0, x1, x0
 
 #ld: -T relocs.ld -e0
 #objdump: -dr
 #...
- +10000:       90000080        adrp    x0, 20000 <var\+0x20000>
+ +10000:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
  +10004:       d503201f        nop
  +10008:       f9400400        ldr     x0, \[x0,#8\]
  +1000c:       d503201f        nop
 
 #ld: -T relocs.ld -e0
 #objdump: -dr
 #...
- +10000:       90000080        adrp    x0, 20000 <var\+0x20000>
+ +10000:       90000080        adrp    x0, 20000 <_GLOBAL_OFFSET_TABLE_>
  +10004:       f9400400        ldr     x0, \[x0,#8\]
  +10008:       d503201f        nop
  +1000c:       d503201f        nop