aboutsummaryrefslogtreecommitdiff
path: root/elf
AgeCommit message (Collapse)AuthorFilesLines
13 daysld.so: Decorate BSS mappingsPetr Malat1-0/+30
Decorate BSS mappings with [anon: glibc: .bss <file>], for example [anon: glibc: .bss /lib/libc.so.6]. The string ".bss" is already used by bionic so use the same, but add the filename as well. If the name would be longer than what the kernel allows, drop the directory part of the path. Refactor glibc.mem.decorate_maps check to a separate function and use it to avoid assembling a name, which would not be used later. Signed-off-by: Petr Malat <oss@malat.biz> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-01-25elf: fix 'valgrind' typo in commentSam James1-1/+1
2025-01-20elf: Make tst-ro-dynamic-mod.map compatible with older binutilsFlorian Weimer1-1/+1
Older versions such as binutils 2.35.2 do not recognize PT_GNU_PROPERTY. Fixes commit d3f2b71ef1d146137a25dd1367d97a14fac341c6 ("aarch64: Fix tests not compatible with targets supporting GCS").
2025-01-20aarch64: Fix tests not compatible with targets supporting GCSYury Khrustalev3-4/+54
- Add GCS marking to some of the tests when target supports GCS - Fix tst-ro-dynamic-mod.map linker script to avoid removing GNU properties - Add header with macros for GNU properties Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
2025-01-20elf.h: Define GNU_PROPERTY_AARCH64_FEATURE_1_GCSSzabolcs Nagy1-0/+1
Reviewed-by: Carlos O'Donell <carlos@redhat.com> Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
2025-01-16Consolidate TLS block allocation for static binaries with ld.soFlorian Weimer2-43/+77
Use the same code to compute the TLS block size and its alignment. The code in elf/dl-tls.c is linked in anyway for all binaries due to the reference to _dl_tls_static_surplus_init. It is not possible to call _dl_allocate_tls_storage directly because malloc is not available in the static case. (The dynamic linker uses the minimal malloc at this stage.) Therefore, split _dl_tls_block_size_with_pre and _dl_tls_block_align from _dl_allocate_tls_storage, and call those new functions from __libc_setup_tls. This fixes extra TLS allocation for the static case, and apparently some pre-existing bugs as well (the independent recomputation of TLS block sizes in init_static_tls looks rather suspect). Fixes commit 0e411c5d3098982d67cd2d7a233eaa6c977a1869 ("Add generic 'extra TLS'").
2025-01-16elf: Iterate over loaded object list in _dl_determine_tlsoffsetFlorian Weimer2-57/+39
The old code used the slotinfo array as a scratch area to pass the list of TLS-using objects to _dl_determine_tlsoffset. All array entries are subsequently overwritten by _dl_add_to_slotinfo, except the first one. The link maps are usually not at their right position for their module ID in the slotinfo array, so the initial use of the slotinfo array would be incorrect if not for scratch purposes only. In _dl_tls_initial_modid_limit_setup, the old code relied that some link map was written to the first slotinfo entry. After the change, this no longer happens because TLS module ID zero is unused. It's also necessary to move the call after the real initialization of the slotinfo array.
2025-01-13elf: Suppress unused function clang for __ifunc_resolverAdhemerval Zanella2-0/+8
The __ifunc_resolver macro expands to: extern __typeof (__redirect_name) name __attribute__ ((ifunc ("iname_ifunc"))); static __typeof (__redirect_name) *name_ifunc (void) { [...] }; And although NAME_IFUNC is and alias for NAME, clang-18 still emits an 'unused function 'name_ifunc' [-Werror,-Wunused-function]' warning.
2025-01-12elf: make tst-tls_tp_offset compare &thread_var to THREAD_SELFSamuel Thibault1-1/+1
rather than pthread_self (), which in htl is not a pointer into dtv, but an index.
2025-01-10Add generic 'extra TLS'Michael Jeanson1-0/+72
Add the logic to append an 'extra TLS' block in the TLS block allocator with a generic stub implementation. The duplicated code in 'csu/libc-tls.c' and 'elf/dl-tls.c' is to handle both statically linked applications and the ELF dynamic loader. Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Reviewed-by: Florian Weimer <fweimer@redhat.com>
2025-01-09elf: Always define TLS_TP_OFFSETFlorian Weimer2-0/+58
This will be needed to compute __rseq_offset outside of the TLS relocation machinery. Reviewed-by: Michael Jeanson <mjeanson@efficios.com>
2025-01-08elf: Minimize library dependencies of tst-nolink-libc.cFlorian Weimer1-2/+4
On 32-bit Arm, -fasynchronous-unwind-tables creates a reference to the symbol __aeabi_unwind_cpp_pr0. Compile the tests without this flag even if it is passed as part of CC, to avoid linker failures.
2025-01-07elf: Second ld.so relocation only if libc.so has been loadedFlorian Weimer2-34/+45
Commit 8f8dd904c4a2207699bb666f30acceb5209c8d3f (“elf: rtld_multiple_ref is always true”) removed some code that happened to enable compatibility with programs that do not link against libc.so. Such programs cannot call dlopen or any dynamic linker functions (except __tls_get_addr), so this is not really useful. Still ld.so should not crash with a null-pointer dereference or undefined symbol reference in these cases. In the main relocation loop, call _dl_relocate_object unconditionally because it already checks if the object has been relocated. If libc.so was loaded, self-relocate ld.so against it and call __rtld_mutex_init and __rtld_malloc_init_real to activate the full implementations. Those are available only if libc.so is there, so skip these initialization steps if libc.so is absent. Without libc.so, the global scope can be completely empty. This can cause ld.so self-relocation to fail because if it uses symbol-based relocations, which is why the second ld.so self-relocation is not performed if libc.so is missing. The previous concern regarding GOT updates through self-relocation no longer applies because function pointers are updated explicitly through __rtld_mutex_init and __rtld_malloc_init_real, and not through relocation. However, the second ld.so self-relocation is still delayed, in case there are other symbols being used. Fixes commit 8f8dd904c4a2207699bb666f30acceb5209c8d3f (“elf: rtld_multiple_ref is always true”). Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-01-04Rename have-mtls-descriptor to have-test-mtls-descriptorH.J. Lu1-17/+17
Since have-mtls-descriptor is only used for glibc testing, rename it to have-test-mtls-descriptor. Also enable tst-gnu2-tls2-amx only if $(have-test-mtls-descriptor) == gnu2. Tested with GCC 14 and Clang 19/18/17 on x86-64. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2025-01-03tst-unique[34].cc: Use explicit instantiation declaration/definitionH.J. Lu3-22/+51
Use explicit instantiation declaration and definition to silence Clang error: tst-unique3.cc:6:18: error: instantiation of variable 'S<char>::i' required here, but no definition is available [-Werror,-Wundefined-var-template] 6 | int t = S<char>::i; | ^ ./tst-unique3.h:5:14: note: forward declaration of template entity is here 5 | static int i; | ^ tst-unique3.cc:6:18: note: add an explicit instantiation declaration to suppress this warning if 'S<char>::i' is explicitly instantiated in another translation unit 6 | int t = S<char>::i; | ^ Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2025-01-02elf: Use TLS_DTV_OFFSET in __tls_get_addrFlorian Weimer1-4/+16
This fixes commit 5e249192cac7354af02a7347a0d8c984e0c88ed3 ("elf: Remove the GET_ADDR_ARGS and related macros from the TLS code"): GET_ADDR_ARGS was indeed unused, but GET_ADDR_OFFSET was used on several targets, those that define TLS_DTV_OFFSET. Instead of reintroducing GET_ADDR_OFFSET, use TLS_DTV_OFFSET directly, now that it is defined on all targets. In the new tls_get_addr_adjust helper function, add a cast to uintptr_t to help the s390 case, where the offset can be positive or negative, depending on the addresses malloc returns. The cast avoids pointer wraparound/overflow. The outer uintptr_t cast is needed to suppress a warning on x86-64 x32 about mismatched integer/pointer sizes. Eventually this offset should be folded into the DTV addresses themselves, to eliminate the subtraction on the TLS fast path. This will require an adjustment to libthread_db because the debugger interface currently returns unadjusted pointers. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-01-01Update copyright dates with scripts/update-copyrightsPaul Eggert430-431/+431
2025-01-01Pass glibc pre-commit checksPaul Eggert1-1/+0
This is needed for the next patch which updates copyright dates. * assert/test-assert-2.c: Remove trailing white space. * elf/tst-startup-errno.c: Remove trailing empty lines.
2024-12-31elf: Add glibc.rtld.execstackAdhemerval Zanella6-1/+63
The new tunable can be used to control whether executable stacks are allowed from either the main program or dependencies. The default is to allow executable stacks. The executable stacks default permission is checked agains the one provided by the PT_GNU_STACK from program headers (if present). The tunable also disables the stack permission change if any dependency requires an executable stack at loading time. Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu. Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-12-31elf: Add tst-execstack-prog-staticAdhemerval Zanella2-0/+8
Similar to tst-execstack-prog, check if executable stacks works for statically linked programs. Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-12-31elf: Do not change stack permission on dlopen/dlmopenAdhemerval Zanella4-40/+45
If some shared library loaded with dlopen/dlmopen requires an executable stack, either implicitly because of a missing GNU_STACK ELF header (where the ABI default flags implies in the executable bit) or explicitly because of the executable bit from GNU_STACK; the loader will try to set the both the main thread and all thread stacks (from the pthread cache) as executable. Besides the issue where any __nptl_change_stack_perm failure does not undo the previous executable transition (meaning that if the library fails to load, there can be thread stacks with executable stacks), this behavior was used on a CVE [1] as a vector for RCE. This patch changes that if a shared library requires an executable stack, and the current stack is not executable, dlopen fails. The change is done only for dynamically loaded modules, if the program or any dependency requires an executable stack, the loader will still change the main thread before program execution and any thread created with default stack configuration. [1] https://www.qualys.com/2023/07/19/cve-2023-38408/rce-openssh-forwarded-ssh-agent.txt Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-12-31elf: Cleanup and improve tst-execstackAdhemerval Zanella1-85/+41
Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-12-27elf: Remove the GET_ADDR_ARGS and related macros from the TLS codeFlorian Weimer1-36/+19
This was used to manage an IA-64 ABI divergence is no longere needed after the IA-64 removal. (It should be possible to encode all the required information in one machine word, so the pointer indirection is really unnecessary. Technically, none of this is part of the ABI, so perhaps it's possible to do this retroactively. See bug 27404.) Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-23Suppress Clang -Wimplicit-fallthrough warningsH.J. Lu1-0/+4
Since Clang doesn't properly handle /* FALLTHROUGH */ in elf/tst-align2.c nor /* fall through */ in misc/tst-tsearch.c tst-align2.c:100:9: error: unannotated fall-through between switch labels [-Werror,-Wimplicit-fallthrough] 100 | case 'A': | ^ tst-align2.c:100:9: note: insert '__attribute__((fallthrough));' to silence this warning 100 | case 'A': | ^ | __attribute__((fallthrough)); tst-align2.c:100:9: note: insert 'break;' to avoid fall-through 100 | case 'A': | ^ | break; suppress them when compiled with Clang. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-23include/sys/cdefs.h: Add __attribute_optimization_barrier__Adhemerval Zanella1-1/+1
Add __attribute_optimization_barrier__ to disable inlining and cloning on a function. For Clang, expand it to __attribute__ ((optnone)) Otherwise, expand it to __attribute__ ((noinline, clone)) Co-Authored-By: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-22elf: Suppress clang warning on tst-unique4Adhemerval Zanella2-1/+7
clang warns that the instantiation of the variable is required, but no definition is available. They are implemented on tst-unique4lib.so. Checked on x86_64-linux-gnu. Reviewed-by: Sam James <sam@gentoo.org>
2024-12-22elf: Enable tst-dlopen-nodelete-reloc if TEST_CXX supports STB_GNU_UNIQUEH.J. Lu1-7/+15
tst-dlopen-nodelete-reloc requires STB_GNU_UNIQUE support so that NODELETE is propagated by do_lookup_unique. Enable it only if TEST_CXX supports STB_GNU_UNIQUE, Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-22elf: Compile test modules with -fsemantic-interpositionH.J. Lu1-0/+20
Compiler may default to -fno-semantic-interposition. But some elf test modules must be compiled with -fsemantic-interposition to function properly. Add a TEST_CC check for -fsemantic-interposition and use it on elf test modules. This fixed FAIL: elf/tst-dlclose-lazy FAIL: elf/tst-pie1 FAIL: elf/tst-plt-rewrite1 FAIL: elf/unload4 when Clang 19 is used to test glibc. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-22Enable execstack tests only if compiler supports trampolineH.J. Lu1-0/+4
Since trampoline is required to test execstack, enable execstack tests only if compiler supports trampoline. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-20elf: Reorder audit events in dlcose to match _dl_fini (bug 32066)Florian Weimer2-16/+37
This was discovered after extending elf/tst-audit23 to cover dlclose of the dlmopen namespace. Auditors already experience the new order during process shutdown (_dl_fini), so no LAV_CURRENT bump or backwards compatibility code seems necessary. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Call la_objclose for proxy link maps in _dl_fini (bug 32065)Florian Weimer2-3/+25
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Signal la_objopen for the proxy link map in dlmopen (bug 31985)Florian Weimer2-29/+40
Previously, the ld.so link map was silently added to the namespace. This change produces an auditing event for it. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Add the endswith function to <endswith.h>Florian Weimer1-0/+8
And include <stdbool.h> for a definition of bool. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Update DSO list, write audit log to elf/tst-audit23.outFlorian Weimer1-5/+22
After commit 1d5024f4f052c12e404d42d3b5bfe9c3e9fd27c4 ("support: Build with exceptions and asynchronous unwind tables [BZ #30587]"), libgcc_s is expected to show up in the DSO list on 32-bit Arm. Do not update max_objs because vdso is not tracked (and which is the reason why the test currently passes even with libgcc_s present). Also write the log output from the auditor to standard output, for easier test debugging. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Move _dl_rtld_map, _dl_rtld_audit_state out of GLFlorian Weimer3-72/+73
This avoids immediate GLIBC_PRIVATE ABI issues if the size of struct link_map or struct auditstate changes. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-20elf: Introduce is_rtld_link_mapFlorian Weimer4-18/+4
Unconditionally define it to false for static builds. This avoids the awkward use of weak_extern for _dl_rtld_map in checks that cannot be possibly true on static builds. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-19elf: Remove code dependent on __rtld_lock_default_lock_recursive macroFlorian Weimer1-21/+0
Neither NPTL nor Hurd define this macro anymore. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2024-12-19Add further DSO dependency sorting testsJoseph Myers2-1/+243
The current DSO dependency sorting tests are for a limited number of specific cases, including some from particular bug reports. Add tests that systematically cover all possible DAGs for an executable and the shared libraries it depends on, directly or indirectly, up to four objects (an executable and three shared libraries). (For this kind of DAG - ones with a single source vertex from which all others are reachable, and an ordering on the edges from each vertex - there are 57 DAGs on four vertices, 3399 on five vertices and 1026944 on six vertices; see https://arxiv.org/pdf/2303.14710 for more details on this enumeration. I've tested that the 3399 cases with five vertices do all pass if enabled.) These tests are replicating the sorting logic from the dynamic linker (thereby, for example, asserting that it doesn't accidentally change); I'm not claiming that the logic in the dynamic linker is in some abstract sense optimal. Note that these tests do illustrate how in some cases the two sorting algorithms produce different results for a DAG (I think all the existing tests for such differences are ones involving cycles, and the motivation for the new algorithm was also to improve the handling of cycles): tst-dso-ordering-all4-44: a->[bc];{}->[cba] output(glibc.rtld.dynamic_sort=1): c>b>a>{}<a<b<c output(glibc.rtld.dynamic_sort=2): b>c>a>{}<a<c<b They also illustrate that sometimes the sorting algorithms do not follow the order in which dependencies are listed in DT_NEEDED even though there is a valid topological sort that does follow that, which might be counterintuitive considering that the DT_NEEDED ordering is followed in the simplest cases: tst-dso-ordering-all4-56: {}->[abc] output: c>b>a>{}<a<b<c shows such a simple case following DT_NEEDED order for destructor execution (the reverse of it for constructor execution), but tst-dso-ordering-all4-41: a->[cb];{}->[cba] output: c>b>a>{}<a<b<c shows that c and b are in the opposite order to what might be expected from the simplest case, though there is no dependency requiring such an opposite order to be used. (I'm not asserting that either of those things is a problem, simply observing them as less obvious properties of the sorting algorithms shown up by these tests.) Tested for x86_64.
2024-12-19Add NT_X86_XSAVE_LAYOUT and NT_ARM_POE from Linux 6.12 to elf.hJoseph Myers1-0/+2
Linux 6.12 adds new ELF note types NT_X86_XSAVE_LAYOUT and NT_ARM_POE. Add these to glibc's elf.h. Tested for x86_64.
2024-12-18tst-unique3.cc: Add explicit instantiation declaration for S<char>::iH.J. Lu1-0/+3
Add explicit instantiation declaration of S<char>::i to silence Clang error: tst-unique3.cc:6:18: error: instantiation of variable 'S<char>::i' required here, but no definition is available [-Werror,-Wundefined-var-template] 6 | int t = S<char>::i; | ^ ./tst-unique3.h:5:14: note: forward declaration of template entity is here 5 | static int i; | ^ tst-unique3.cc:6:18: note: add an explicit instantiation declaration to suppress this warning if 'S<char>::i' is explicitly instantiated in another translation unit 6 | int t = S<char>::i; | ^ Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-12-15Return EXIT_UNSUPPORTED if __builtin_add_overflow unavailableH.J. Lu1-0/+10
Since GCC 4.9 doesn't have __builtin_add_overflow: In file included from tst-stringtable.c:180:0: stringtable.c: In function ‘stringtable_finalize’: stringtable.c:185:7: error: implicit declaration of function ‘__builtin_add_overflow’ [-Werror=implicit-function-declaration] else if (__builtin_add_overflow (previous->offset, ^ return EXIT_UNSUPPORTED for GCC 4.9 or older. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-14ifuncmain9.c: Return EXIT_UNSUPPORTED for GCC 5.4 or olderH.J. Lu1-2/+12
Since elf/ifuncmain9.c fails at run-time when compiled with GCC 5.4 or older (PR ipa/81128), return EXIT_UNSUPPORTED for GCC 5.4 or older. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2024-12-05Fix typo in elf/Makefile:postclean-generatedJoseph Myers1-1/+1
The postclean-generated setting in elf/Makefile lists $(objpfx)/dso-sort-tests-2.generated-makefile twice and $(objpfx)/dso-sort-tests-1.generated-makefile not at all, which looks like a typo; fix it to list each once. Tested for x86_64.
2024-12-05Add further test of TLSJoseph Myers11-0/+381
Add an additional test of TLS variables, with different alignment, accessed from different modules. The idea of the alignment test is similar to tst-tlsalign and the same code is shared for setting up test variables, but unlike the tst-tlsalign code, there are multiple threads and variables are accessed from multiple objects to verify that they get a consistent notion of the address of an object within a thread. Threads are repeatedly created and shut down to verify proper initialization in each new thread. The test is also repeated with TLS descriptors when supported. (However, only initial-exec TLS is covered in this test.) Tested for x86_64.
2024-11-29Add test of ELF hash collisionsJoseph Myers19-1/+1364
Add tests that the dynamic linker works correctly with symbol names involving hash collisions, for both choices of hash style (and --hash-style=both as well). I note that there weren't actually any previous tests using --hash-style (so tests would only cover the default linker configuration in that regard). Also test symbol versions involving hash collisions. Tested for x86_64.
2024-11-25Silence most -Wzero-as-null-pointer-constant diagnosticsAlejandro Colomar9-14/+14
Replace 0 by NULL and {0} by {}. Omit a few cases that aren't so trivial to fix. Link: <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117059> Link: <https://software.codidact.com/posts/292718/292759#answer-292759> Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-11-22elf: Handle static PIE with non-zero load address [BZ #31799]H.J. Lu4-7/+90
For a static PIE with non-zero load address, its PT_DYNAMIC segment entries contain the relocated values for the load address in static PIE. Since static PIE usually doesn't have PT_PHDR segment, use p_vaddr of the PT_LOAD segment with offset == 0 as the load address in static PIE and adjust the entries of PT_DYNAMIC segment in static PIE by properly setting the l_addr field for static PIE. This fixes BZ #31799. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
2024-11-13elf: handle addition overflow in _dl_find_object_update_1 [BZ #32245]Aurelien Jarno1-0/+8
The remaining_to_add variable can be 0 if (current_used + count) wraps, This is caught by GCC 14+ on hppa, which determines from there that target_seg could be be NULL when remaining_to_add is zero, which in turns causes a -Wstringop-overflow warning: In file included from ../include/atomic.h:49, from dl-find_object.c:20: In function '_dlfo_update_init_seg', inlined from '_dl_find_object_update_1' at dl-find_object.c:689:30, inlined from '_dl_find_object_update' at dl-find_object.c:805:13: ../sysdeps/unix/sysv/linux/hppa/atomic-machine.h:44:4: error: '__atomic_store_4' writing 4 bytes into a region of size 0 overflows the destination [-Werror=stringop-overflow=] 44 | __atomic_store_n ((mem), (val), __ATOMIC_RELAXED); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ dl-find_object.c:644:3: note: in expansion of macro 'atomic_store_relaxed' 644 | atomic_store_relaxed (&seg->size, new_seg_size); | ^~~~~~~~~~~~~~~~~~~~ In function '_dl_find_object_update': cc1: note: destination object is likely at address zero In practice, this is not possible as it represent counts of link maps. Link maps have sizes larger than 1 byte, so the sum of any two link map counts will always fit within a size_t without wrapping around. This patch therefore adds a check on remaining_to_add == 0 and tell GCC that this can not happen using __builtin_unreachable. Thanks to Andreas Schwab for the investigation. Closes: BZ #32245 Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> Tested-by: John David Anglin <dave.anglin@bell.net> Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-11-12linux: Add support for getrandom vDSOAdhemerval Zanella1-0/+3
Linux 6.11 has getrandom() in vDSO. It operates on a thread-local opaque state allocated with mmap using flags specified by the vDSO. Multiple states are allocated at once, as many as fit into a page, and these are held in an array of available states to be doled out to each thread upon first use, and recycled when a thread terminates. As these states run low, more are allocated. To make this procedure async-signal-safe, a simple guard is used in the LSB of the opaque state address, falling back to the syscall if there's reentrancy contention. Also, _Fork() is handled by blocking signals on opaque state allocation (so _Fork() always sees a consistent state even if it interrupts a getrandom() call) and by iterating over the thread stack cache on reclaim_stack. Each opaque state will be in the free states list (grnd_alloc.states) or allocated to a running thread. The cancellation is handled by always using GRND_NONBLOCK flags while calling the vDSO, and falling back to the cancellable syscall if the kernel returns EAGAIN (would block). Since getrandom is not defined by POSIX and cancellation is supported as an extension, the cancellation is handled as 'may occur' instead of 'shall occur' [1], meaning that if vDSO does not block (the expected behavior) getrandom will not act as a cancellation entrypoint. It avoids a pthread_testcancel call on the fast path (different than 'shall occur' functions, like sem_wait()). It is currently enabled for x86_64, which is available in Linux 6.11, and aarch64, powerpc32, powerpc64, loongarch64, and s390x, which are available in Linux 6.12. Link: https://pubs.opengroup.org/onlinepubs/9799919799/nframe.html [1] Co-developed-by: Jason A. Donenfeld <Jason@zx2c4.com> Tested-by: Jason A. Donenfeld <Jason@zx2c4.com> # x86_64 Tested-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> # x86_64, aarch64 Tested-by: Xi Ruoyao <xry111@xry111.site> # x86_64, aarch64, loongarch64 Tested-by: Stefan Liebler <stli@linux.ibm.com> # s390x
2024-11-07elf: avoid jumping over a needed declarationDJ Delorie1-3/+3
The declaration of found_other_class could be jumped over via the goto just above it, but the code jumped to uses found_other_class. Move the declaration up a bit to ensure it's properly declared and initialized.