mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-06 01:21:08 +00:00
x86-64: Fix the dtv field load for x32 [BZ #31184]
On x32, I got
FAIL: elf/tst-tlsgap
$ gdb elf/tst-tlsgap
...
open tst-tlsgap-mod1.so
Thread 2 "tst-tlsgap" received signal SIGSEGV, Segmentation fault.
[Switching to LWP 2268754]
_dl_tlsdesc_dynamic () at ../sysdeps/x86_64/dl-tlsdesc.S:108
108 movq (%rsi), %rax
(gdb) p/x $rsi
$4 = 0xf7dbf9005655fb18
(gdb)
This is caused by
_dl_tlsdesc_dynamic:
_CET_ENDBR
/* Preserve call-clobbered registers that we modify.
We need two scratch regs anyway. */
movq %rsi, -16(%rsp)
movq %fs:DTV_OFFSET, %rsi
Since the dtv field in TCB is a pointer, %fs:DTV_OFFSET is a 32-bit
location, not 64-bit. Load the dtv field to RSI_LP instead of rsi.
This fixes BZ #31184.
(cherry picked from commit 3502440397
)
This commit is contained in:
parent
f95fe70608
commit
ba52b325c4
1
NEWS
1
NEWS
@ -160,6 +160,7 @@ The following bugs are resolved with this release:
|
||||
[30151] gshadow: Matching sgetsgent, sgetsgent_r ERANGE handling
|
||||
[30163] posix: Fix system blocks SIGCHLD erroneously
|
||||
[30305] x86_64: Fix asm constraints in feraiseexcept
|
||||
[31184] FAIL: elf/tst-tlsgap
|
||||
|
||||
|
||||
Version 2.34
|
||||
|
@ -102,7 +102,7 @@ _dl_tlsdesc_dynamic:
|
||||
/* Preserve call-clobbered registers that we modify.
|
||||
We need two scratch regs anyway. */
|
||||
movq %rsi, -16(%rsp)
|
||||
movq %fs:DTV_OFFSET, %rsi
|
||||
mov %fs:DTV_OFFSET, %RSI_LP
|
||||
movq %rdi, -8(%rsp)
|
||||
movq TLSDESC_ARG(%rax), %rdi
|
||||
movq (%rsi), %rax
|
||||
|
Loading…
Reference in New Issue
Block a user