From 4dd72ffdfe254fec30fd5eab0c5fd4445df73529 Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Tue, 12 Jul 2016 16:31:40 +0200 Subject: [PATCH] Content for TLS_IE_GOT not written to .got. When no dynamic relocation was generated the .got content would not be updated for the TLS_IE_GOT relocation addresses. bfd/ChangeLog: Cupertino Miranda * arc-got.h (relocate_fix_got_relocs_for_got_info): Fixed addresses in debug comments. Fixed address in .got related to TLS_IE_GOT dynamic relocation. ld/ChangeLog: Cupertino Miranda * testsuite/ld-arc/tls_ie-01.s: Added to verify associated fix. * testsuite/ld-arc/tls_ie-01.d: Likewise --- bfd/ChangeLog | 6 ++++++ bfd/arc-got.h | 24 +++++++++++++++++------- ld/ChangeLog | 5 +++++ ld/testsuite/ld-arc/tls_ie-01.d | 9 +++++++++ ld/testsuite/ld-arc/tls_ie-01.s | 10 ++++++++++ 5 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 ld/testsuite/ld-arc/tls_ie-01.d create mode 100644 ld/testsuite/ld-arc/tls_ie-01.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b7206aecac5..66e65c37288 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-08-26 Cupertino Miranda + + * arc-got.h (relocate_fix_got_relocs_for_got_info): Fixed addresses in + debug comments. Fixed address in .got related to TLS_IE_GOT dynamic + relocation. + 2016-08-26 Cupertino Miranda * reloc.c: Fixed type in ARC_SECTOFF relocations. Added ARC_SDA_12 diff --git a/bfd/arc-got.h b/bfd/arc-got.h index 7c3cfd952d2..9ac02957df6 100644 --- a/bfd/arc-got.h +++ b/bfd/arc-got.h @@ -334,13 +334,15 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p, ? 4 : 0)); ARC_DEBUG ("arc_info: FIXED -> %s value = %#lx " - "@ %p, for symbol %s\n", + "@ %lx, for symbol %s\n", (entry->type == GOT_TLS_GD ? "GOT_TLS_GD" : "GOT_TLS_IE"), (long) (sym_value - sec_vma), - htab->sgot->contents + entry->offset - + (entry->existing_entries == TLS_GOT_MOD_AND_OFF - ? 4 : 0), + (long) (htab->sgot->output_section->vma + + htab->sgot->output_offset->vma + + entry->offset + + (entry->existing_entries == TLS_GOT_MOD_AND_OFF + ? 4 : 0)), symbol_name); } break; @@ -351,14 +353,22 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p, bfd_vma ATTRIBUTE_UNUSED sec_vma = tls_sec->output_section->vma; + bfd_put_32 (output_bfd, + sym_value - sec_vma, + htab->sgot->contents + entry->offset + + (entry->existing_entries == TLS_GOT_MOD_AND_OFF + ? 4 : 0)); + ARC_DEBUG ("arc_info: FIXED -> %s value = %#lx " "@ %p, for symbol %s\n", (entry->type == GOT_TLS_GD ? "GOT_TLS_GD" : "GOT_TLS_IE"), (long) (sym_value - sec_vma), - htab->sgot->contents + entry->offset - + (entry->existing_entries == TLS_GOT_MOD_AND_OFF - ? 4 : 0), + (long) (htab->sgot->output_section->vma + + htab->sgot->output_offset->vma + + entry->offset + + (entry->existing_entries == TLS_GOT_MOD_AND_OFF + ? 4 : 0)), symbol_name); } break; diff --git a/ld/ChangeLog b/ld/ChangeLog index fccaea3bb18..76c28631ff1 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2016-08-26 Cupertino Miranda + + * testsuite/ld-arc/tls_ie-01.s: Added to verify associated fix. + * testsuite/ld-arc/tls_ie-01.d: Likewise + 2016-08-26 Thomas Preud'homme * emultempl/armelf.em (in_implib_filename): Declare and initialize new diff --git a/ld/testsuite/ld-arc/tls_ie-01.d b/ld/testsuite/ld-arc/tls_ie-01.d new file mode 100644 index 00000000000..8d53ef5704c --- /dev/null +++ b/ld/testsuite/ld-arc/tls_ie-01.d @@ -0,0 +1,9 @@ +#source: tls_ie-01.s +#as: -mcpu=arc700 +#ld: +#objdump: -s -j .got + +[^:]+: file format elf32-littlearc + +Contents of section \.got: + [0-9a-f]+ 00000000 04000000 .+ diff --git a/ld/testsuite/ld-arc/tls_ie-01.s b/ld/testsuite/ld-arc/tls_ie-01.s new file mode 100644 index 00000000000..74f40ed8879 --- /dev/null +++ b/ld/testsuite/ld-arc/tls_ie-01.s @@ -0,0 +1,10 @@ + .tls_common foo,4,4 + .tls_common bar,4,4 + + .text + .align 4 + + .global __start +__start: + ld r14, [pcl, @foo@tlsie] + ld r15, [pcl, @bar@tlsie] -- 2.30.2