]> git.ipfire.org Git - thirdparty/glibc.git/commit
nptl: fix potential merge of __rseq_* relro symbols
authorMichael Jeanson <mjeanson@efficios.com>
Wed, 3 Jul 2024 16:35:34 +0000 (12:35 -0400)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 16 Jul 2024 15:25:28 +0000 (17:25 +0200)
commit72f4c0533c8c21c52a7874896eb7e90da1be01e6
tree09fdd8ba634d7e2b857c7143313d0c568059ae2d
parent61da55a07f7609ca7b6e9ef42113a53593286eda
nptl: fix potential merge of __rseq_* relro symbols

While working on a patch to add support for the extensible rseq ABI, we
came across an issue where a new 'const' variable would be merged with
the existing '__rseq_size' variable. We tracked this to the use of
'-fmerge-all-constants' which allows the compiler to merge identical
constant variables. This means that all 'const' variables in a compile
unit that are of the same size and are initialized to the same value can
be merged.

In this specific case, on 32 bit systems 'unsigned int' and 'ptrdiff_t'
are both 4 bytes and initialized to 0 which should trigger the merge.
However for reasons we haven't delved into when the attribute 'section
(".data.rel.ro")' is added to the mix, only variables of the same exact
types are merged. As far as we know this behavior is not specified
anywhere and could change with a new compiler version, hence this patch.

Move the definitions of these variables into an assembler file and add
hidden writable aliases for internal use. This has the added bonus of
removing the asm workaround to set the values on rseq registration.

Tested on Debian 12 with GCC 12.2.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
(cherry picked from commit 2b92982e2369d292560793bee8e730f695f48ff3)
elf/Makefile
elf/dl-rseq-symbols.S [new file with mode: 0644]
sysdeps/nptl/dl-tls_init_tp.c