summaryrefslogtreecommitdiff
path: root/elf/Makefile
AgeCommit message (Collapse)Author
2026-03-16elf: factor out ld.conf parsingDJ Delorie
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> Reviewed-by: Yury Khrustalev <yury.khrustalev@arm.com>
2026-03-15resolv: Move libanl symbols to libc on hurd tooSamuel Thibault
2026-03-15elf: Drop librt.so from localplt-built-dsoSamuel Thibault
It's always empty now.
2026-03-12Support loading libunwind instead of libgcc_sAdhemerval Zanella
The 'unwind-link' facility allows glibc to support thread cancellation and exit (pthread_cancel, pthread_exiti, backtrace) by dynamically loading the unwind library at runtime, preventing a hard dependency on libgcc_s within libc.so. When building with libunwind (for clang/LLVM toolchains [1]), two assumptions in the existing code break: 1. The runtime library is libunwind.so instead of libgcc_s.so. 2. libgcc relies on __gcc_personality_v0 to handle unwinding mechanics. libunwind exposes the standard '_Unwind_*' accessors directly. This patch adapts `unwind-link` to handle both environments based on the HAVE_CC_WITH_LIBUNWIND configuration: * The UNWIND_SONAME macro now selects between LIBGCC_S_SO and LIBUNWIND_SO. * For libgcc, it continues to resolve `__gcc_personality_v0`. * For libunwind, it instead resolves the standard _Unwind_GetLanguageSpecificData, _Unwind_SetGR, _Unwind_SetIP, and _Unwind_GetRegionStart helpers. * unwind-resume.c is updated to implement wrappers for these accessors that forward calls to the dynamically loaded function pointers, effectively shimming the unwinder. Tests and Makefiles are updated to link against `$(libunwind)` where appropriate. Reviewed-by: Sam James <sam@gentoo.org> [1] https://github.com/libunwind/libunwind
2026-03-12configure: Parametrize runtime libraries to support compiler-rtAdhemerval Zanella
Historically, the build system has hardcoded references to `-lgcc` and `-lgcc_eh`, explicitly assuming the use of the GCC runtime. This prevents building glibc with alternative toolchains, specifically clang configured with `--rtlib=compiler-rt`, where these libraries are replaced by `libclang_rt.builtins`. This patch introduces a mechanism to dynamically detect the compiler's underlying runtime library. The logic works as follows: 1. It queries the compiler using `-print-libgcc-file-name`. 2. It parses the output path to determine if `libgcc` or `compiler-rt` is in use. 3. Based on this detection, it parametrizes the build variables for the static runtime and exception handling libraries (replacing hardcoded `-lgcc` and `-lgcc_eh`). This ensures that the build system correctly links against the active compiler runtime—whether it is the traditional libgcc or LLVM's compiler-rt—without requiring manual overrides. Reviewed-by: Sam James <sam@gentoo.org>
2026-03-10feat(rtld): Allow LD_DEBUG category exclusionFrédéric Bérat
Adds support for excluding specific categories from `LD_DEBUG` output. The `LD_DEBUG` environment variable now accepts category names prefixed with a dash (`-`) to disable their debugging output. This allows users to enable broad categories (e.g., `all`) while suppressing verbose or irrelevant information from specific sub-categories (e.g., `-tls`). The `process_dl_debug` function in `rtld.c` has been updated to parse these exclusion options and unset the corresponding bits in `GLRO(dl_debug_mask)`. The `LD_DEBUG=help` output has also been updated to document this new functionality. A new test `tst-dl-debug-exclude.sh` is added to verify the correct behavior of category exclusion. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2026-03-10elf(tls): Add debug logging for TLS operationsFrédéric Bérat
This commit introduces extensive debug logging for thread-local storage (TLS) operations within the dynamic linker. When `LD_DEBUG=tls` is enabled, messages are printed for: - TLS module assignment and release. - DTV (Dynamic Thread Vector) resizing events. - TLS block allocations and deallocations. - `__tls_get_addr` slow path events (DTV updates, lazy allocations, and static TLS usage). The log format is standardized to use a "tls: " prefix and identifies modules using the "modid %lu" convention. To aid in debugging multithreaded applications, thread-specific logs include the Thread Control Block (TCB) address to identify the context of the operation. A new test module `tst-tls-debug-mod.c` and a corresponding shell script `tst-tls-debug-recursive.sh` have been added. Additionally, the existing `tst-dl-debug-tid` NPTL test has been updated to verify these TLS debug messages in a multithreaded context. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2026-02-18elf: Use dl-symbol-redir-ifunc.h instead _dl_strlenAdhemerval Zanella
Also replace the loop with strlen And remove -fno-tree-loop-distribute-patterns usage. It requires redirect the strlen to the baseline implementation for x86_64, aarch64, and loongarch64. Checked on x86_64-linux-gnu{-v2,v3} and aarch64-linux-gnu with both gcc-15 and clang-21. Reviewed-by: DJ Delorie <dj@redhat.com>
2026-02-04elf: Build tst-gnu2-tls2 iff compiler supports TLS descriptorAdhemerval Zanella
The test modules are built with -mtls-dialect=$(have-test-mtls-descriptor), similar to tst-gnu2-tls1. Checked on x86_64-linux-gnu.
2026-02-02elf: Add test case for LD_PROFILE/LD_PROFILE_OUTPUT interactionFlorian Weimer
This verifies that LD_PROFILE is correctly ignored if LD_PROFILE_OUTPUT is not set. The test was initially auto-generated, then heavily edited and re-edited for brevity and clarity. The test uses glibc-specific interfaces (including one that did not exist at all a couple of hours ago), so this should be unproblematic.
2026-01-01Update copyright dates with scripts/update-copyrightsPaul Eggert
2025-11-21Enable --enable-fortify-source with clangAdhemerval Zanella
clang generates internal calls for some _chk symbol, so add internal aliases for them, and stub some with rtld-stubbed-symbols to avoid ld.so linker issues. Reviewed-by: Sam James <sam@gentoo.org>
2025-11-10Filter out internal abort during ld.so buildAdhemerval Zanella
clang might generate an abort call when cleanup functions (set by __attribute__ ((cleanup)) calls functions not marked as nothrow. The hurd already provides abort for the loader at sysdeps/mach/hurd/dl-sysdep.c, and adding it rtld-stubbed-symbols triggers duplicate symbols. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
2025-11-08Add missing $(rpath-link) to elf/ld.so --library-pathSamuel Thibault
This is notably needed for GNU/Hurd's libmachuser.so and libhurduser.so.
2025-08-27elf: early conversion of elf p_flags to mprotect flagsCupertino Miranda
This patch replaces _dl_stack_flags global variable by _dl_stack_prot_flags. The advantage is that any convertion from p_flags to final used mprotect flags occurs at loading of p_flags. It avoids repeated spurious convertions of _dl_stack_flags, for example in allocate_thread_stack. This modification was suggested in: https://sourceware.org/pipermail/libc-alpha/2025-March/165537.html Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-08-01elf: Handle ld.so with LOAD segment gaps in _dl_find_object (bug 31943)Florian Weimer
Detect if ld.so not contiguous and handle that case in _dl_find_object. Set l_find_object_processed even for initially loaded link maps, otherwise dlopen of an initially loaded object adds it to _dlfo_loaded_mappings (where maps are expected to be contiguous), in addition to _dlfo_nodelete_mappings. Test elf/tst-link-map-contiguous-ldso iterates over the loader image, reading every word to make sure memory is actually mapped. It only does that if the l_contiguous flag is set for the link map. Otherwise, it finds gaps with mmap and checks that _dl_find_object does not return the ld.so mapping for them. The test elf/tst-link-map-contiguous-main does the same thing for the libc.so shared object. This only works if the kernel loaded the main program because the glibc dynamic loader may fill the gaps with PROT_NONE mappings in some cases, making it contiguous, but accesses to individual words may still fault. Test elf/tst-link-map-contiguous-libc is again slightly different because the dynamic loader always fills the gaps with PROT_NONE mappings, so a different form of probing has to be used. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-07-28elf: Compile _dl_debug_state separately (bug 33224)Florian Weimer
This ensures that the compiler will not inline it, so that debuggers which do not use the Systemtap probes can reliably set a breakpoint on it. Reviewed-by: Andreas K. Huettel <dilfridge@gentoo.org> Tested-by: Andreas K. Huettel <dilfridge@gentoo.org>
2025-07-05elf: Restore support for _r_debug interpositions and copy relocationsFlorian Weimer
The changes in commit a93d9e03a31ec14405cb3a09aa95413b67067380 ("Extend struct r_debug to support multiple namespaces [BZ #15971]") break the dyninst dynamic instrumentation tool. It brings its own definition of _r_debug (rather than a declaration). Furthermore, it turns out it is rather hard to use the proposed handshake for accessing _r_debug via DT_DEBUG. If applications want to access _r_debug, they can do so directly if the relevant code has been built as PIC. To protect against harm from accidental copy relocations due to linker relaxations, this commit restores copy relocation support by adjusting both copies if interposition or copy relocations are in play. Therefore, it is possible to use a hidden reference in ld.so to access _r_debug. Only perform the copy relocation initialization if libc has been loaded. Otherwise, the ld.so search scope can be empty, and the lookup of the _r_debug symbol mail fail. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
2025-06-26elf: Add missing DSO dependencies for tst-rtld-no-malloc-{audit,preload}Florian Weimer
Fixes commit c1560f3f75c0e892b5522c16f91b4e303f677094 ("elf: Switch to main malloc after final ld.so self-relocation"). Reviewed-by: Frédéric Bérat <fberat@redhat.com>
2025-06-19i386: Update ___tls_get_addr to preserve vector registersH.J. Lu
Compiler generates the following instruction sequence for dynamic TLS access: leal tls_var@tlsgd(,%ebx,1), %eax call ___tls_get_addr@PLT CALL instruction is transparent to compiler which assumes all registers, except for EFLAGS, AX, CX, and DX, are unchanged after CALL. But ___tls_get_addr is a normal function which doesn't preserve any vector registers. 1. Rename the generic __tls_get_addr function to ___tls_get_addr_internal. 2. Change ___tls_get_addr to a wrapper function with implementations for FNSAVE, FXSAVE, XSAVE and XSAVEC to save and restore all vector registers. 3. dl-tlsdesc-dynamic.h has: _dl_tlsdesc_dynamic: /* Like all TLS resolvers, preserve call-clobbered registers. We need two scratch regs anyway. */ subl $32, %esp cfi_adjust_cfa_offset (32) It is wrong to use movl %ebx, -28(%esp) movl %esp, %ebx cfi_def_cfa_register(%ebx) ... mov %ebx, %esp cfi_def_cfa_register(%esp) movl -28(%esp), %ebx to preserve EBX on stack. Fix it with: movl %ebx, 28(%esp) movl %esp, %ebx cfi_def_cfa_register(%ebx) ... mov %ebx, %esp cfi_def_cfa_register(%esp) movl 28(%esp), %ebx 4. Update _dl_tlsdesc_dynamic to call ___tls_get_addr_internal directly. 5. Add have-test-mtls-traditional to compile tst-tls23-mod.c with traditional TLS variant to verify the fix. 6. Define DL_RUNTIME_RESOLVE_REALIGN_STACK in sysdeps/x86/sysdep.h. This fixes BZ #32996. Co-Authored-By: Adhemerval Zanella <adhemerval.zanella@linaro.org> Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-06-04Makefile: Avoid $(objpfx)/ in makefilesFlorian Weimer
If paths with both $(objpfx)/ and $(objpfx) (which already includes a trailing slash) appear during the build, this can trigger unexpected rebuilds, or incorrect concurrent rebuilds.
2025-05-20elf: Test case for bug 32976 (CVE-2025-4802)Florian Weimer
Check that LD_LIBRARY_PATH is ignored for AT_SECURE statically linked binaries, using support_capture_subprogram_self_sgid. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2025-05-05S390: Add new s390 platform z17.Stefan Liebler
The glibc-hwcaps subdirectories are extended by "z17". Libraries are loaded if the z17 facility bits are active: - Miscellaneous-instruction-extensions facility 4 - Vector-enhancements-facility 3 - Vector-Packed-Decimal-Enhancement Facility 3 - CPU: Concurrent-Functions Facility tst-glibc-hwcaps.c is extended in order to test z17 via new marker6. In case of running on a z17 with a kernel not recognizing z17 yet, AT_PLATFORM will be z900 but vector-bit in AT_HWCAP is set. This situation is now recognized and this testcase does not fail. A fatal glibc error is dumped if glibc was build with architecture level set for z17, but run on an older machine (See dl-hwcap-check.h). Note, you might get an SIGILL before this check if you don't use: configure --with-rtld-early-cflags=-march=<older-machine> ld.so --list-diagnostics now also dumps information about s390.cpu_features. Independent from z17, the s390x kernel won't introduce new HWCAP-Bits if there is no special handling needed in kernel itself. For z17, we don't have new HWCAP flags, but have to check the facility bits retrieved by stfle-instruction. Instead of storing all the stfle-bits (currently four 64bit values) in the cpu_features struct, we now only store those bits, which are needed within glibc itself. Note that we have this list twice, one with original values and the other one which can be filtered with GLIBC_TUNABLES=glibc.cpu.hwcaps. Those new fields are stored in so far reserved space in cpu_features struct. Thus processes started in between the update of glibc package and we e.g. have a new ld.so and an old libc.so, won't crash. The glibc internal ifunc-resolvers would not select the best optimized variant. The users of stfle-bits are also updated: - parsing of GLIBC_TUNABLES=glibc.cpu.hwcaps - glibc internal ifunc-resolvers - __libc_ifunc_impl_list - sysconf
2025-04-08elf: Extend glibc.rtld.execstack tunable to force executable stack (BZ 32653)Adhemerval Zanella
From the bug report [1], multiple programs still require to dlopen shared libraries with either missing PT_GNU_STACK or with the executable bit set. Although, in some cases, it seems to be a hard-craft assembly source without the required .note.GNU-stack marking (so the static linker is forced to set the stack executable if the ABI requires it), other cases seem that the library uses trampolines [2]. Unfortunately, READ_IMPLIES_EXEC is not an option since on some ABIs (x86_64), the kernel clears the bit, making it unsupported. To avoid reinstating the broken code that changes stack permission on dlopen (0ca8785a28), this patch extends the glibc.rtld.execstack tunable to allow an option to force an executable stack at the program startup. The tunable is a security issue because it defeats the PT_GNU_STACK hardening. It has the slight advantage of making it explicit by the caller, and, as for other tunables, this is disabled for setuid binaries. A tunable also allows us to eventually remove it, but from previous experiences, it would require some time. Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. [1] https://sourceware.org/bugzilla/show_bug.cgi?id=32653 [2] https://github.com/conda-forge/ctng-compiler-activation-feedstock/issues/143 Reviewed-by: Sam James <sam@gentoo.org>
2025-03-31elf: Fix tst-origin build when toolchain defaults to --as-needed (BZ 32823)John David Anglin
Checked on aarch64-linux-gnu. Reviewed-by: Florian Weimer <fweimer@redhat.com>
2025-03-21elf: Use +nolink-deps to add make-only dependency for tst-originFlorian Weimer
The tst-origin test must link against liborigin-mod.so. Correct build order depends on a makefile rule dependency on $(objpfx)liborigin-mod.so. Use +nolink-deps to remvoe this dependency from the linker command line. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-03-21debug: Improve '%n' fortify detection (BZ 30932)Adhemerval Zanella
The 7bb8045ec0 path made the '%n' fortify check ignore EMFILE errors while trying to open /proc/self/maps, and this added a security issue where EMFILE can be attacker-controlled thus making it ineffective for some cases. The EMFILE failure is reinstated but with a different error message. Also, to improve the false positive of the hardening for the cases where no new files can be opened, the _dl_readonly_area now uses _dl_find_object to check if the memory area is within a writable ELF segment. The procfs method is still used as fallback. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Arjun Shankar <arjun@redhat.com>
2025-03-18elf: Fix tst-origin make rulesAdhemerval Zanella
The tst-origin build can fail with: /usr/bin/ld: [...]libc.so: undefined reference to `__tunable_is_initialized@GLIBC_PRIVATE' Since the custom link invocation links against system glibc instead of the built one. The only requirement is to avoid liborigin.so linked with a full path, which is the default for --enable-hardcoded-path-in-tests. There is no need to use a custom rule. Checked on x86_64-linux-gnu.
2025-03-17elf: Fix tst-origin make rulesAdhemerval Zanella
Add tests-special before include Rules and compile liborigin.os with MODULE_NAME set to testsuite instead of libc.
2025-03-13elf: Canonicalize $ORIGIN in an explicit ld.so invocation [BZ 25263]Adhemerval Zanella
When an executable is invoked directly, we calculate $ORIGIN by calling readlink on /proc/self/exe, which the Linux kernel resolves to the target of any symlinks. However, if an executable is run through ld.so, we cannot use /proc/self/exe and instead use the path given as an argument. This leads to a different calculation of $ORIGIN, which is most notable in that it causes ldd to behave differently (e.g., by not finding a library) from directly running the program. To make the behavior consistent, take advantage of the fact that the kernel also resolves /proc/self/fd/ symlinks to the target of any symlinks in the same manner, so once we have opened the main executable in order to load it, replace the user-provided path with the result of calling readlink("/proc/self/fd/N"). (On non-Linux platforms this resolution does not happen and so no behavior change is needed.) The __fd_to_filename requires _fitoa_word and _itoa_word, which for 32-bits pulls a lot of definitions from _itoa.c (due _ITOA_NEEDED being defined). To simplify the build move the required function to a new file, _fitoa_word.c. Checked on x86_64-linux-gnu and i686-linux-gnu. Co-authored-by: Geoffrey Thomas <geofft@ldpreload.com> Reviewed-by: Geoffrey Thomas <geofft@ldpreload.com> Tested-by: Geoffrey Thomas <geofft@ldpreload.com>
2025-03-11elf: Test dlopen (NULL, RTLD_LAZY) from an ELF constructorFlorian Weimer
This call must not complete initialization of all shared objects in the global scope because the ELF constructor which makes the call likely has not finished initialization. Calling more constructors at this point would expose those to a partially constructed dependency. This completes the revert of commit 9897ced8e78db5d813166a7ccccfd5a ("elf: Run constructors on cyclic recursive dlopen (bug 31986)").
2025-03-07elf: Fix handling of symbol versions which hash to zero (bug 29190)Florian Weimer
This was found through code inspection. No application impact is known. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-03-07elf: Check if __attribute__ ((aligned (65536))) is supportedH.J. Lu
The BZ #32763 tests fail to build for MicroBlaze (which defines MAX_OFILE_ALIGNMENT to (32768*8) in GCC, so __attribute__ ((aligned (65536))) is unsupported). Add a configure-time check to enable BZ #32763 tests only if __attribute__ ((aligned (65536))) is supported. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2025-03-06static-pie: Skip the empty PT_LOAD segment at offset 0 [BZ #32763]H.J. Lu
As shown in https://sourceware.org/bugzilla/show_bug.cgi?id=25237 linker may generate an empty PT_LOAD segments at offset 0: Elf file type is EXEC (Executable file) Entry point 0x4000e8 There are 3 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000 0x00000000000000f0 0x00000000000000f0 R E 0x1000 LOAD 0x0000000000000000 0x0000000000410000 0x0000000000410000 0x0000000000000000 0x0000000000b5dce8 RW 0x10000 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 0x10 Section to Segment mapping: Segment Sections... 00 .text 01 .bss 02 Skip the empty PT_LOAD segment at offset 0 to support such binaries. This fixes BZ #32763. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
2025-03-04Pass -Wl,--no-error-execstack for tests where -Wl,-z,execstack is used [PR32717]Sam James
When GNU Binutils is configured with --enable-error-execstack=yes, a handful of our tests which rely on -Wl,-z,execstack fail. Pass --Wl,--no-error-execstack to override the behaviour and get a warning instead. Bug: https://sourceware.org/PR32717 Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-02-13elf: Keep using minimal malloc after early DTV resize (bug 32412)Florian Weimer
If an auditor loads many TLS-using modules during startup, it is possible to trigger DTV resizing. Previously, the DTV was marked as allocated by the main malloc afterwards, even if the minimal malloc was still in use. With this change, _dl_resize_dtv marks the resized DTV as allocated with the minimal malloc. The new test reuses TLS-using modules from other auditing tests. Reviewed-by: DJ Delorie <dj@redhat.com>
2025-02-01elf: Do not add a copy of _dl_find_object to libc.soFlorian Weimer
This reduces code size and dependencies on ld.so internals from libc.so. Fixes commit f4c142bb9fe6b02c0af8cfca8a920091e2dba44b ("arm: Use _dl_find_object on __gnu_Unwind_Find_exidx (BZ 31405)"). Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-01-09elf: Always define TLS_TP_OFFSETFlorian Weimer
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 Weimer
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 Weimer
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. Lu
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-01Update copyright dates with scripts/update-copyrightsPaul Eggert
2024-12-31elf: Add glibc.rtld.execstackAdhemerval Zanella
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 Zanella
Similar to tst-execstack-prog, check if executable stacks works for statically linked programs. Reviewed-by: Florian Weimer <fweimer@redhat.com>
2024-12-22elf: Enable tst-dlopen-nodelete-reloc if TEST_CXX supports STB_GNU_UNIQUEH.J. Lu
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. Lu
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. Lu
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-19Add further DSO dependency sorting testsJoseph Myers
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-05Fix typo in elf/Makefile:postclean-generatedJoseph Myers
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 Myers
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.