[ARC] Fixed TLS for IE model.
authorCupertino Miranda <cmiranda@synopsys.com>
Thu, 29 Dec 2016 16:10:01 +0000 (17:10 +0100)
committerCupertino Miranda <cmiranda@synopsys.com>
Thu, 8 Jun 2017 17:00:36 +0000 (19:00 +0200)
In the case of static relocation, the GOT entries are fixed at link time
and are set by the linker.
In order to compute the right TLS offset it is necessary to add TCB_SIZE
to the offset, just in case the dynamic linker is not expected to be
executed (static linked case).
This problem does appear in dynamic linked applications, as the dynamic
linker is adding this TCB_SIZE by operating the TCB block structure.

Problem revealed in GLIBC with static linking.

bfd/ChangeLog:

    Cupertino Miranda  <cmiranda@synopsys.com>

arc-got.h (relocate_fix_got_relocs_for_got_info): Added TCB_SIZE to
patched section contents for TLS IE reloc.
elf32-arc.c: Remove TCB_SIZE preprocessor macro.

Rebase to 0006

bfd/ChangeLog
bfd/arc-got.h
bfd/elf32-arc.c
ld/ChangeLog
ld/testsuite/ld-arc/tls_ie-01.d

index 9ee1bf4ad975fd222a88e2d705708832bd99b528..7fb198a7d6ff993ab2211b9da4c91c0424421282 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-08  Cupertino Miranda  <cmiranda@synopsys.com>
+
+       * arc-got.h (relocate_fix_got_relocs_for_got_info): Added TCB_SIZE to
+       patched section contents for TLS IE reloc.
+       * elf32-arc.c: Remove TCB_SIZE preprocessor macro.
+
 2017-06-08  Cupertino Miranda  <cmiranda@synopsys.com>
 
        * elf32-arc.c (elf_arc_relocate_section): Added "call" to
index b8a6d15a2273cb498e02eb67708bef3c60769157..f1f6c0ea81431f3778dbc35f333616997f1cacef 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef ARC_GOT_H
 #define ARC_GOT_H
 
+#define TCB_SIZE (8)
+
 enum tls_type_e
 {
   GOT_UNKNOWN = 0,
@@ -354,7 +356,8 @@ relocate_fix_got_relocs_for_got_info (struct got_entry **          list_p,
                  = tls_sec->output_section->vma;
 
                bfd_put_32 (output_bfd,
-                           sym_value - sec_vma,
+                           sym_value - sec_vma
+                           + (elf_hash_table (info)->dynamic_sections_created ? 0 : TCB_SIZE),
                            htab->sgot->contents + entry->offset
                            + (entry->existing_entries == TLS_GOT_MOD_AND_OFF
                               ? 4 : 0));
@@ -478,8 +481,10 @@ GOT_OFFSET = %#lx, GOT_VMA = %#lx, INDEX = %ld, ADDEND = 0x0\n",
        {
          bfd_vma addend = 0;
          if (list->type == GOT_TLS_IE)
+         {
            addend = bfd_get_32 (output_bfd,
                                 htab->sgot->contents + got_offset);
+         }
 
          ADD_RELA (output_bfd, got,
                    got_offset + (e == TLS_GOT_MOD_AND_OFF ? 4 : 0),
index f424f13e34ff38fadbcdc01381d01836d859cdb3..c1286b2d614cf5b193d685ce5fb7cebe5229e1a0 100644 (file)
@@ -1187,7 +1187,6 @@ arc_special_overflow_checks (const struct arc_relocation_data reloc_data,
 #define TLS_REL (bfd_signed_vma) \
   ((elf_hash_table (info))->tls_sec->output_section->vma)
 #define TLS_TBSS (8)
-#define TCB_SIZE (8)
 
 #define none (0)
 
index 9dd4256c8490bb69ba1763b69d61daae84c557f6..2cbe09d9116e5bbc2bd5a0ebfed78f37af56504d 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-08  Cupertino Miranda  <cmiranda@synopsys.com>
+
+       * testsuite/ld-arc/tls_ie-01.d: Changed expected result.
+
 2017-06-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-ifunc/ifunc-1-local-x86.d: Pass
index 304973c9d948ce91645528b80e16e4a1deceaa11..62b39324790d8df361f46260b9f748c51a8f184b 100644 (file)
@@ -1,10 +1,10 @@
 #source: tls_ie-01.s
 #as: -mcpu=arc700
-#ld:
+#ld: -static
 #objdump: -s -j .got
 #xfail: arc*-*-elf*
 
 [^:]+:     file format elf32-littlearc
 
 Contents of section \.got:
- [0-9a-f]+ 00000000 04000000 .+
+ [0-9a-f]+ 08000000 0c000000 +.+