public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gold: x86-64: Fix TLSDESC relaxation for x32
@ 2020-01-21  4:08 H.J. Lu
  2020-05-01 15:55 ` H.J. Lu
  0 siblings, 1 reply; 2+ messages in thread
From: H.J. Lu @ 2020-01-21  4:08 UTC (permalink / raw)
  To: binutils; +Cc: Cary Coutant

X32 TLSDESC sequences can be:

40 8d 05 00 00 00 00	rex lea	foo@TLSDESC(%rip), %reg
...
67 ff 10		call	*foo@TLSCALL(%eax)

or the same sequence as LP64:

48 8d 05 00 00 00 00	lea	foo@TLSDESC(%rip), %reg
...
ff 10			call	*foo@TLSCALL(%rax)

We need to support both sequences for x32.  For both GDesc -> IE/LE
transitions,

67 ff 10		call	*foo@TLSCALL(%eax)

should relaxed to

0f 1f 00		nopl	(%rax)

For GDesc -> LE transition,

40 8d 05 00 00 00 00	rex lea	foo@TLSDESC(%rip), %reg

should relaxed to

40 c7 c0 fc ff ff ff	rex movl $foo@tpoff, %reg

For GDesc -> IE transition,

40 8d 05 00 00 00 00	rex lea	foo@TLSDESC(%rip), %reg

should relaxed to

40 8b 05 00 00 00 00	rex movl foo@gottpoff(%rip), %eax

Tested with GCC 10 20200121 on Linux/x32.  OK for master?

Thanks.

H.J.
--
	PR gold/25426
	* x86_64.cc (Target_x86_64<size>::Relocate::tls_desc_gd_to_ie):
	For x32, relax "rex leal foo@tlsdesc(%rip), %reg" to
	"rex movl foo@gottpoff(%rip), %eax" and relax ""call *(%eax)"
	to "nopl (%rax)".
	(Target_x86_64<size>::Relocate::tls_desc_gd_to_le): For x32,
	relax "rex leal foo@tlsdesc(%rip), %reg" to
	"rex movl foo@tpoff, %eax" and relax "call *foo@tlscall(%eax)"
	to "nopl (%rax)".
	* testsuite/Makefile.am (tls_test_gnu2.o): Depend on
	gcctestdir/as.
	(tls_test_file2_gnu2.o): Likewise.
	(tls_test_c_gnu2.o): Likewise.
	* testsuite/Makefile.in: Regenerated.
---
 gold/testsuite/Makefile.am |  6 +--
 gold/testsuite/Makefile.in |  6 +--
 gold/x86_64.cc             | 78 ++++++++++++++++++++++++++++++--------
 3 files changed, 68 insertions(+), 22 deletions(-)

diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index ed1ea1755ac..397bf694000 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -1032,11 +1032,11 @@ if TLS_GNU2_DIALECT
 
 check_PROGRAMS += tls_shared_gnu2_gd_to_ie_test
 
-tls_test_gnu2.o: tls_test.cc
+tls_test_gnu2.o: tls_test.cc gcctestdir/as
 	$(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
-tls_test_file2_gnu2.o: tls_test_file2.cc
+tls_test_file2_gnu2.o: tls_test_file2.cc gcctestdir/as
 	$(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
-tls_test_c_gnu2.o: tls_test_c.c
+tls_test_c_gnu2.o: tls_test_c.c gcctestdir/as
 	$(COMPILE) -c -fpic -mtls-dialect=gnu2 $(TLS_TEST_C_CFLAGS) -o $@ $<
 tls_test_gnu2_shared2.so: tls_test_file2_gnu2.o gcctestdir/ld
 	$(CXXLINK) -shared tls_test_file2_gnu2.o
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index 9533b0e20b2..d02311564e7 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -8213,11 +8213,11 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@		tls_test_c_pic.o gcctestdir/ld
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@	$(CXXLINK) $(THREADFLAGS) -pie tls_test_main_pie.o tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o $(THREADLIBS)
 
-@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2.o: tls_test.cc
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2.o: tls_test.cc gcctestdir/as
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@	$(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
-@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_file2_gnu2.o: tls_test_file2.cc
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_file2_gnu2.o: tls_test_file2.cc gcctestdir/as
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@	$(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
-@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_c_gnu2.o: tls_test_c.c
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_c_gnu2.o: tls_test_c.c gcctestdir/as
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@	$(COMPILE) -c -fpic -mtls-dialect=gnu2 $(TLS_TEST_C_CFLAGS) -o $@ $<
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2_shared2.so: tls_test_file2_gnu2.o gcctestdir/ld
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@	$(CXXLINK) -shared tls_test_file2_gnu2.o
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index a65e2c55e9e..ee6c0c08572 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -5474,26 +5474,49 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_ie(
 {
   if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
     {
-      // leaq foo@tlsdesc(%rip), %rax
-      // ==> movq foo@gottpoff(%rip), %rax
+      // LP64: leaq foo@tlsdesc(%rip), %rax
+      //       ==> movq foo@gottpoff(%rip), %rax
+      // X32:  rex leal foo@tlsdesc(%rip), %eax
+      //       ==> rex movl foo@gottpoff(%rip), %eax
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
-		     view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
+		     ((view[-3] == 0x48
+		       || (size == 32 && view[-3] == 0x40))
+		      && view[-2] == 0x8d
+		      && view[-1] == 0x05));
       view[-2] = 0x8b;
       const elfcpp::Elf_Xword addend = rela.get_r_addend();
       Relocate_functions<size, false>::pcrela32(view, value, addend, address);
     }
   else
     {
-      // call *foo@tlscall(%rax)
-      // ==> nop; nop
+      // LP64: call *foo@tlscall(%rax)
+      //       ==> xchg %ax, %ax
+      // X32:  call *foo@tlscall(%eax)
+      //       ==> nopl (%rax)
       gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
+      int prefix = 0;
+      if (size == 32 && view[0] == 0x67)
+	{
+	  tls::check_range(relinfo, relnum, rela.get_r_offset(),
+			   view_size, 3);
+	  prefix = 1;
+	}
       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
-		     view[0] == 0xff && view[1] == 0x10);
-      view[0] = 0x66;
-      view[1] = 0x90;
+		     view[prefix] == 0xff && view[prefix + 1] == 0x10);
+      if (prefix)
+	{
+	  view[0] = 0x0f;
+	  view[1] = 0x1f;
+	  view[2] = 0x00;
+	}
+      else
+	{
+	  view[0] = 0x66;
+	  view[1] = 0x90;
+	}
     }
 }
 
@@ -5513,12 +5536,17 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_le(
 {
   if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
     {
-      // leaq foo@tlsdesc(%rip), %rax
-      // ==> movq foo@tpoff, %rax
+      // LP64: leaq foo@tlsdesc(%rip), %rax
+      //       ==> movq foo@tpoff, %rax
+      // X32:  rex leal foo@tlsdesc(%rip), %eax
+      //       ==> rex movl foo@tpoff, %eax
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
-		     view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
+		     ((view[-3] == 0x48
+		       || (size == 32 && view[-3] == 0x40))
+		      && view[-2] == 0x8d
+		      && view[-1] == 0x05));
       view[-2] = 0xc7;
       view[-1] = 0xc0;
       value -= tls_segment->memsz();
@@ -5526,14 +5554,32 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_le(
     }
   else
     {
-      // call *foo@tlscall(%rax)
-      // ==> nop; nop
+      // LP64: call *foo@tlscall(%rax)
+      //       ==> xchg %ax, %ax
+      // X32:  call *foo@tlscall(%eax)
+      //       ==> nopl (%rax)
       gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
+      int prefix = 0;
+      if (size == 32 && view[0] == 0x67)
+	{
+	  tls::check_range(relinfo, relnum, rela.get_r_offset(),
+			   view_size, 3);
+	  prefix = 1;
+	}
       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
-		     view[0] == 0xff && view[1] == 0x10);
-      view[0] = 0x66;
-      view[1] = 0x90;
+		     view[prefix] == 0xff && view[prefix + 1] == 0x10);
+      if (prefix)
+	{
+	  view[0] = 0x0f;
+	  view[1] = 0x1f;
+	  view[2] = 0x00;
+	}
+      else
+	{
+	  view[0] = 0x66;
+	  view[1] = 0x90;
+	}
     }
 }
 
-- 
2.24.1

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] gold: x86-64: Fix TLSDESC relaxation for x32
  2020-01-21  4:08 [PATCH] gold: x86-64: Fix TLSDESC relaxation for x32 H.J. Lu
@ 2020-05-01 15:55 ` H.J. Lu
  0 siblings, 0 replies; 2+ messages in thread
From: H.J. Lu @ 2020-05-01 15:55 UTC (permalink / raw)
  To: Binutils

On Mon, Jan 20, 2020 at 8:08 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> X32 TLSDESC sequences can be:
>
> 40 8d 05 00 00 00 00    rex lea foo@TLSDESC(%rip), %reg
> ...
> 67 ff 10                call    *foo@TLSCALL(%eax)
>
> or the same sequence as LP64:
>
> 48 8d 05 00 00 00 00    lea     foo@TLSDESC(%rip), %reg
> ...
> ff 10                   call    *foo@TLSCALL(%rax)
>
> We need to support both sequences for x32.  For both GDesc -> IE/LE
> transitions,
>
> 67 ff 10                call    *foo@TLSCALL(%eax)
>
> should relaxed to
>
> 0f 1f 00                nopl    (%rax)
>
> For GDesc -> LE transition,
>
> 40 8d 05 00 00 00 00    rex lea foo@TLSDESC(%rip), %reg
>
> should relaxed to
>
> 40 c7 c0 fc ff ff ff    rex movl $foo@tpoff, %reg
>
> For GDesc -> IE transition,
>
> 40 8d 05 00 00 00 00    rex lea foo@TLSDESC(%rip), %reg
>
> should relaxed to
>
> 40 8b 05 00 00 00 00    rex movl foo@gottpoff(%rip), %eax
>
> Tested with GCC 10 20200121 on Linux/x32.  OK for master?
>
> Thanks.
>
> H.J.
> --
>         PR gold/25426
>         * x86_64.cc (Target_x86_64<size>::Relocate::tls_desc_gd_to_ie):
>         For x32, relax "rex leal foo@tlsdesc(%rip), %reg" to
>         "rex movl foo@gottpoff(%rip), %eax" and relax ""call *(%eax)"
>         to "nopl (%rax)".
>         (Target_x86_64<size>::Relocate::tls_desc_gd_to_le): For x32,
>         relax "rex leal foo@tlsdesc(%rip), %reg" to
>         "rex movl foo@tpoff, %eax" and relax "call *foo@tlscall(%eax)"
>         to "nopl (%rax)".
>         * testsuite/Makefile.am (tls_test_gnu2.o): Depend on
>         gcctestdir/as.
>         (tls_test_file2_gnu2.o): Likewise.
>         (tls_test_c_gnu2.o): Likewise.
>         * testsuite/Makefile.in: Regenerated.
> ---
>  gold/testsuite/Makefile.am |  6 +--
>  gold/testsuite/Makefile.in |  6 +--
>  gold/x86_64.cc             | 78 ++++++++++++++++++++++++++++++--------
>  3 files changed, 68 insertions(+), 22 deletions(-)
>
> diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
> index ed1ea1755ac..397bf694000 100644
> --- a/gold/testsuite/Makefile.am
> +++ b/gold/testsuite/Makefile.am
> @@ -1032,11 +1032,11 @@ if TLS_GNU2_DIALECT
>
>  check_PROGRAMS += tls_shared_gnu2_gd_to_ie_test
>
> -tls_test_gnu2.o: tls_test.cc
> +tls_test_gnu2.o: tls_test.cc gcctestdir/as
>         $(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
> -tls_test_file2_gnu2.o: tls_test_file2.cc
> +tls_test_file2_gnu2.o: tls_test_file2.cc gcctestdir/as
>         $(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
> -tls_test_c_gnu2.o: tls_test_c.c
> +tls_test_c_gnu2.o: tls_test_c.c gcctestdir/as
>         $(COMPILE) -c -fpic -mtls-dialect=gnu2 $(TLS_TEST_C_CFLAGS) -o $@ $<
>  tls_test_gnu2_shared2.so: tls_test_file2_gnu2.o gcctestdir/ld
>         $(CXXLINK) -shared tls_test_file2_gnu2.o
> diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
> index 9533b0e20b2..d02311564e7 100644
> --- a/gold/testsuite/Makefile.in
> +++ b/gold/testsuite/Makefile.in
> @@ -8213,11 +8213,11 @@ uninstall-am:
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@               tls_test_c_pic.o gcctestdir/ld
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@       $(CXXLINK) $(THREADFLAGS) -pie tls_test_main_pie.o tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o $(THREADLIBS)
>
> -@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2.o: tls_test.cc
> +@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2.o: tls_test.cc gcctestdir/as
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@        $(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
> -@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_file2_gnu2.o: tls_test_file2.cc
> +@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_file2_gnu2.o: tls_test_file2.cc gcctestdir/as
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@        $(CXXCOMPILE) -c -fpic -mtls-dialect=gnu2 -o $@ $<
> -@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_c_gnu2.o: tls_test_c.c
> +@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_c_gnu2.o: tls_test_c.c gcctestdir/as
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@        $(COMPILE) -c -fpic -mtls-dialect=gnu2 $(TLS_TEST_C_CFLAGS) -o $@ $<
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@tls_test_gnu2_shared2.so: tls_test_file2_gnu2.o gcctestdir/ld
>  @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_GNU2_DIALECT_TRUE@@TLS_TRUE@        $(CXXLINK) -shared tls_test_file2_gnu2.o
> diff --git a/gold/x86_64.cc b/gold/x86_64.cc
> index a65e2c55e9e..ee6c0c08572 100644
> --- a/gold/x86_64.cc
> +++ b/gold/x86_64.cc
> @@ -5474,26 +5474,49 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_ie(
>  {
>    if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
>      {
> -      // leaq foo@tlsdesc(%rip), %rax
> -      // ==> movq foo@gottpoff(%rip), %rax
> +      // LP64: leaq foo@tlsdesc(%rip), %rax
> +      //       ==> movq foo@gottpoff(%rip), %rax
> +      // X32:  rex leal foo@tlsdesc(%rip), %eax
> +      //       ==> rex movl foo@gottpoff(%rip), %eax
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
>        tls::check_tls(relinfo, relnum, rela.get_r_offset(),
> -                    view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
> +                    ((view[-3] == 0x48
> +                      || (size == 32 && view[-3] == 0x40))
> +                     && view[-2] == 0x8d
> +                     && view[-1] == 0x05));
>        view[-2] = 0x8b;
>        const elfcpp::Elf_Xword addend = rela.get_r_addend();
>        Relocate_functions<size, false>::pcrela32(view, value, addend, address);
>      }
>    else
>      {
> -      // call *foo@tlscall(%rax)
> -      // ==> nop; nop
> +      // LP64: call *foo@tlscall(%rax)
> +      //       ==> xchg %ax, %ax
> +      // X32:  call *foo@tlscall(%eax)
> +      //       ==> nopl (%rax)
>        gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
> +      int prefix = 0;
> +      if (size == 32 && view[0] == 0x67)
> +       {
> +         tls::check_range(relinfo, relnum, rela.get_r_offset(),
> +                          view_size, 3);
> +         prefix = 1;
> +       }
>        tls::check_tls(relinfo, relnum, rela.get_r_offset(),
> -                    view[0] == 0xff && view[1] == 0x10);
> -      view[0] = 0x66;
> -      view[1] = 0x90;
> +                    view[prefix] == 0xff && view[prefix + 1] == 0x10);
> +      if (prefix)
> +       {
> +         view[0] = 0x0f;
> +         view[1] = 0x1f;
> +         view[2] = 0x00;
> +       }
> +      else
> +       {
> +         view[0] = 0x66;
> +         view[1] = 0x90;
> +       }
>      }
>  }
>
> @@ -5513,12 +5536,17 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_le(
>  {
>    if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
>      {
> -      // leaq foo@tlsdesc(%rip), %rax
> -      // ==> movq foo@tpoff, %rax
> +      // LP64: leaq foo@tlsdesc(%rip), %rax
> +      //       ==> movq foo@tpoff, %rax
> +      // X32:  rex leal foo@tlsdesc(%rip), %eax
> +      //       ==> rex movl foo@tpoff, %eax
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
>        tls::check_tls(relinfo, relnum, rela.get_r_offset(),
> -                    view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
> +                    ((view[-3] == 0x48
> +                      || (size == 32 && view[-3] == 0x40))
> +                     && view[-2] == 0x8d
> +                     && view[-1] == 0x05));
>        view[-2] = 0xc7;
>        view[-1] = 0xc0;
>        value -= tls_segment->memsz();
> @@ -5526,14 +5554,32 @@ Target_x86_64<size>::Relocate::tls_desc_gd_to_le(
>      }
>    else
>      {
> -      // call *foo@tlscall(%rax)
> -      // ==> nop; nop
> +      // LP64: call *foo@tlscall(%rax)
> +      //       ==> xchg %ax, %ax
> +      // X32:  call *foo@tlscall(%eax)
> +      //       ==> nopl (%rax)
>        gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
>        tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
> +      int prefix = 0;
> +      if (size == 32 && view[0] == 0x67)
> +       {
> +         tls::check_range(relinfo, relnum, rela.get_r_offset(),
> +                          view_size, 3);
> +         prefix = 1;
> +       }
>        tls::check_tls(relinfo, relnum, rela.get_r_offset(),
> -                    view[0] == 0xff && view[1] == 0x10);
> -      view[0] = 0x66;
> -      view[1] = 0x90;
> +                    view[prefix] == 0xff && view[prefix + 1] == 0x10);
> +      if (prefix)
> +       {
> +         view[0] = 0x0f;
> +         view[1] = 0x1f;
> +         view[2] = 0x00;
> +       }
> +      else
> +       {
> +         view[0] = 0x66;
> +         view[1] = 0x90;
> +       }
>      }
>  }
>
> --
> 2.24.1
>

I am checking in this patch.

-- 
H.J.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-05-01 15:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-21  4:08 [PATCH] gold: x86-64: Fix TLSDESC relaxation for x32 H.J. Lu
2020-05-01 15:55 ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).