From: H.J. Lu Date: Tue, 20 Nov 2012 05:57:53 +0000 (+0000) Subject: Fix TLS LD to LE optimization for x32 X-Git-Tag: binutils-2_23_2~181 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c71a3d86fa87bd67330b3f7ca83875bc5d7c6f97;p=thirdparty%2Fbinutils-gdb.git Fix TLS LD to LE optimization for x32 PR gold/14858 * x86_64.cc (Relocate::tls_ld_to_le): Support x32. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 9a1a9d32a94..b31d11f3194 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2012-11-19 H.J. Lu + + PR gold/14858 + * x86_64.cc (Relocate::tls_ld_to_le): Support x32. + 2012-11-14 Roland McGrath * arm.cc (Output_data_plt_arm_nacl::first_plt_entry): Use bic rather diff --git a/gold/x86_64.cc b/gold/x86_64.cc index b5b616fc9ac..8ddf4f2d9bd 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -3959,8 +3959,12 @@ Target_x86_64::Relocate::tls_ld_to_le( section_size_type view_size) { // leaq foo@tlsld(%rip),%rdi; call __tls_get_addr@plt; + // For SIZE == 64: // ... leq foo@dtpoff(%rax),%reg // ==> .word 0x6666; .byte 0x66; movq %fs:0,%rax ... leaq x@tpoff(%rax),%rdx + // For SIZE == 32: + // ... leq foo@dtpoff(%rax),%reg + // ==> nopl 0x0(%rax); movl %fs:0,%eax ... leaq x@tpoff(%rax),%rdx tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3); tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 9); @@ -3970,7 +3974,10 @@ Target_x86_64::Relocate::tls_ld_to_le( tls::check_tls(relinfo, relnum, rela.get_r_offset(), view[4] == 0xe8); - memcpy(view - 3, "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0\0", 12); + if (size == 64) + memcpy(view - 3, "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0\0", 12); + else + memcpy(view - 3, "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0\0", 12); // The next reloc should be a PLT32 reloc against __tls_get_addr. // We can skip it.