mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-09 04:41:16 +00:00
fe20bb1d60
The pre-ARMv7 CPUs are missing atomic compare and exchange and/or barrier instructions. Therefore those are implemented using kernel assistance, calling a kernel function at a specific address, and passing the arguments in the r0 to r4 registers. This is done by specifying registers for local variables. The a_ptr variable is placed in the r2 register and declared with __typeof (mem). According to the GCC documentation on local register variables, if mem is a constant pointer, the compiler may substitute the variable with its initializer in asm statements, which may cause the corresponding operand to appear in a different register. This happens in __libc_start_main with the pointer to the thread counter for static binaries (but not the shared ones): # ifdef SHARED unsigned int *ptr = __libc_pthread_functions.ptr_nthreads; # ifdef PTR_DEMANGLE PTR_DEMANGLE (ptr); # endif # else extern unsigned int __nptl_nthreads __attribute ((weak)); unsigned int *const ptr = &__nptl_nthreads; # endif This causes static binaries using threads to crash when the GNU libc is built with GCC 8 and most notably tst-cancel21-static. To fix that, use the same trick than for the volatile qualifier, defining a_ptr as a union. Changelog: [BZ #24034] * sysdeps/unix/sysv/linux/arm/atomic-machine.h (__arm_assisted_compare_and_exchange_val_32_acq): Use uint32_t rather than __typeof (...) for the a_ptr variable. |
||
---|---|---|
.. | ||
bits | ||
sys | ||
____longjmp_chk.S | ||
aeabi_read_tp.S | ||
arm-features.h | ||
atomic-machine.h | ||
brk.c | ||
c++-types.data | ||
clone.S | ||
dl-cache.h | ||
dl-machine.h | ||
dl-procinfo.c | ||
dl-procinfo.h | ||
fxstat.c | ||
fxstatat.c | ||
getcontext.S | ||
Implies | ||
init-first.c | ||
ioperm.c | ||
jmp_buf-macros.h | ||
kernel-features.h | ||
ld.abilist | ||
ldconfig.h | ||
ldsodefs.h | ||
libanl.abilist | ||
libBrokenLocale.abilist | ||
libc-do-syscall.S | ||
libc-vdso.h | ||
libc.abilist | ||
libcrypt.abilist | ||
libdl.abilist | ||
libm.abilist | ||
libnsl.abilist | ||
libpthread.abilist | ||
libresolv.abilist | ||
librt.abilist | ||
libthread_db.abilist | ||
libutil.abilist | ||
localplt.data | ||
lockf64.c | ||
lxstat.c | ||
makecontext.c | ||
Makefile | ||
profil-counter.h | ||
readelflib.c | ||
register-dump.h | ||
setcontext.S | ||
shlib-versions | ||
sigaction.c | ||
sigcontextinfo.h | ||
sigrestorer.S | ||
swapcontext.S | ||
syscall.S | ||
syscalls.list | ||
sysdep.h | ||
sysdep.S | ||
tls.h | ||
ucontext_i.sym | ||
Versions | ||
vfork.S | ||
xstat.c |