summaryrefslogtreecommitdiff
path: root/ldso
AgeCommit message (Collapse)Author
2024-04-21x86: Add vDSO support.Dmitry Chestnykh
Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-04-18aarch64: Apply relocations to use TLS GD access model.Dmitry Chestnykh
In aarch64 when the general dynamic access model is used for tls data the linker emits two dynamic relocs (R_AARCH64_TLS_DTPMOD(64) and R_AARCH64_TLS_DTPREL(64)) that must be applied by ld.so during object loading. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-04-18Add vDSO support for aarch64.Dmitry Chestnykh
Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-04-18Generalize vDSO code.Dmitry Chestnykh
- Add macroses for vDSO functions names because in some architectures these names differ from the default ones. - Add header guards in dl-syscalls.h . Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-04-18Fix vDSO support for all supported architectures.Dmitry Chestnykh
- Cleanup dl-vdso.c code. - Pass `void *` as first arg to `load_vdso()`, using 32-bit type is completely wrong on 64bit architectures. - Split libc code and vDSO-related code. Move arch-specific implementations into separate files. The performance improvement is for example 50-60 times on ARMv7 and about 4 times on x86_64. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-03-20riscv32: sync with riscv64Waldemar Brodkorb
2024-03-19riscv64: sync with glibc, fix all TLS errors in uClibc-ng-testWaldemar Brodkorb
2024-03-03riscv32: add ldso support, enable time64.Waldemar Brodkorb
2024-02-29Add time64 support for sparc.Dmitry Chestnykh
By some reason sparc ld.so cannot work properly with statx() system call, so fallback to regular stat() family in ld.so. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-02-28ldso: Use statx() when time64 is enabled.Dmitry Chestnykh
Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-02-25ldso: Remove unneeded semicolons.Dmitry Chestnykh
We use semicolons in the place of `DL_RELOCATE_RELR()` and `DL_DO_RELOCATE_RELR()` 'calling' so the semicolon in the macro definition leads to semicolon duplication after preprocessing. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-02-20Remove duplicate semicolonsMarcus Haehnel
While they are not a problem per-se they cause issues with some tooling (such as clang coverage) and are confusing to the reader.
2024-02-20ldso: add null-pointer checkFrank Mehnert
There is a check for (*rpnt == NULL) a few lines above but the "else" case performing an allocation does only exist if SHARED is not defined. If SHARED is defined, the allocation is not performed and it may happen (at least in theory) that *rpnt == NULL when executing (*rpnt)->dyn = tpnt; Add the null-pointer check. Signed-off-by: Frank Mehnert <frank.mehnert@kernkonzept.com>
2024-02-20fix c6x toolchain compileWaldemar Brodkorb
2024-02-19Rename `reloc_addr` to suppress `-Wshadow` warning.Dmitry Chestnykh
Here is the warning: ldso/ldso/dl-elf.c: In function '_dl_fixup': ./ldso/include/dl-elf.h:259:37: warning: declaration of 'reloc_addr' shadows a previous local [-Wshadow] 259 | ElfW(Addr) *reloc_addr = 0; \ | ^~~~~~~~~~ ./ldso/include/dl-elf.h:290:33: note: in expansion of macro 'DL_DO_RELOCATE_RELR' 290 | DL_DO_RELOCATE_RELR(dyn->loadaddr, relr_start, relr_end); \ | ^~~~~~~~~~~~~~~~~~~ ldso/ldso/dl-elf.c:1032:9: note: in expansion of macro 'DL_RELOCATE_RELR' 1032 | DL_RELOCATE_RELR(tpnt); | ^~~~~~~~~~~~~~~~ In file included from ldso/ldso/ldso.c:1462: ldso/ldso/dl-elf.c:1012:20: note: shadowed declaration is here 1012 | ElfW(Addr) reloc_addr Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-02-07ld.so: Add support of DT_RELR relocation format.Dmitry Chestnykh
Nowadays modern libcs like Glibc and musl currently support processing of RELATIVE relocations compressed with DT_RELR format. However I have noticed that uClibc-ng doesn't support this feature and if the source will be linked with `-Wl,-z,pack-relative-relos` (bfd) or `-Wl,--pack-dyn-relocs=relr` (lld) then ld.so cannot properly load the produced DSO. This patch is intended to fix this issue and adds applying of DT_RELR relative relocation. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
2024-01-18c6x: fix duplicate includeWaldemar Brodkorb
2023-12-12elf: support ELF binaries in noMMUGreg Ungerer
The Linux kernels ELF-FDPIC binfmt program loader can support loading and running conventional ELF format binaries on noMMU kernels when compiled appropriately. That is when they are constant displacement binaries such as generated using the -pie compile option. Add a configure option to allow selecting ELF binary support in noMMU mode configurations on architectures that support this. The main requirement is to generate the ldso run-time loader to perform relocation at load time. These configurations do not support shared libraries, so there is no need to generate a full shared library, only the static version is required. The use of ELF format binaries does mean a slightly simpler toolchain generation (does not require a -uclinux- for some architectures) and does not require an extra tool like elf2flt. This initial support targets M68K, ARM and RISC-V architectures. No kernel changes are required, the required support for this is already in mainline kernels (certainly as of linux-6.6). Note that for the M68K and ARM architectures that the initialized registers and stack layout at process startup is slightly different for the flat format loader and the ELF/ELF-FDPIC loaders. So we need some changes to the startup code (crt1.S) for them. I have not done extensive testing outside of M68K, ARM and RISC-V. I had to make changes to a couple of the dl-startup.h architecture files to get them to build for this noMMU case. I did not dig down too deep on the reasons, but they still seem ok for the MMU case as well. Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
2023-09-23aarch64: disable lazy relocationsWaldemar Brodkorb
Fixes segfaults in curl with gnutls encryption.
2023-08-14c6x compile fix vdso supportlordrasmus
2023-08-14vdso support missing filelordrasmus
2023-08-14add vsdo supportlordrasmus
2022-12-19add getauxval() implementationramin
2022-09-27arc: add support for ARCv3 32-bit processorsSergey Matyukevich
New ARCv3 ISA includes both 64-bit and 32-bit CPU family. This patch adds support for 32-bit ARCv3 HS5x processors. Signed-off-by: Sergey Matyukevich <sergey.matyukevich@synopsys.com> Signed-off-by: Pavel Kozlov <pavel.kozlov@synopsys.com>
2022-09-27arc: add asm macrosSergey Matyukevich
Add a header file with assembler macros to be able to handle in one place the differences between ARCv2 and ARCv3 ISAs. It is a preparatory step before the introduction of support for ARCv3 CPUs. Signed-off-by: Sergey Matyukevich <sergey.matyukevich@synopsys.com> Signed-off-by: Pavel Kozlov <pavel.kozlov@synopsys.com>
2022-09-27ldso: arc: add compiler option checkSergey Matyukevich
Option '-mno-long-calls' is not supported by all arc gcc compilers. For instance, this option is not supported by GCC for ARCv3 processors. Check if this option is supported before applying it. Signed-off-by: Sergey Matyukevich <sergey.matyukevich@synopsys.com> Signed-off-by: Pavel Kozlov <pavel.kozlov@synopsys.com>
2022-09-21xtensa: add static pie supportMax Filippov
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
2022-09-21xtensa: drop ARCH_NEEDS_BOOTSTRAP_RELOCSMax Filippov
Xtensa does not define PERFORM_BOOTSTRAP_RELOC so it doesn't need ARCH_NEEDS_BOOTSTRAP_RELOCS definition. Remove it. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
2022-09-21xtensa: ldso: make GOT protection adjustment conditionalMax Filippov
Xtensa PERFORM_BOOTSTRAP_GOT macro uses mprotect to make bits of GOT writable, but noMMU linux kernel returns ENOSYS to mprotect syscalls, and syscall wrapper tries to update errno with the error code. This happens well before the relocations are done and results in writes to unrelated locations, memory corruption or protection violations. Only define PERFORM_BOOTSTRAP_GOT when building xtensa configuration with MMU support. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
2022-09-21ldso: clean up PERFORM_BOOTSTRAP_GOT ifdeferryMax Filippov
3 architectures currently define PERFORM_BOOTSTRAP_GOT: avr32, mips and xtensa. A block of code that applies relative relocations in the DL_START is disabled when PERFORM_BOOTSTRAP_GOT is defined, unless it's avr32 or mips, effectively disabling it only for xtensa. This may be simplified by removing the call to elf_machine_relative from the xtensa PERFORM_BOOTSTRAP_GOT and always using common code. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
2022-09-07Added support for creation of Static Position-Independent Executables (PIE) ↵linted
on mips Updated config to allow compilation of rcrt1.o for mips and modified it's crt1.S to perform relocates in __start. The mips architecture performs relocations differently then most other architectures. reloc_static_pie was rewritten, taking code from dl-startup.c, in order to perfrom the additional relocations. Modifications were made to mips' dl-startup.h to allow for the use of contained macros without including _start definition. Signed-off-by: linted <linted@users.noreply.github.com>
2022-03-10dl-elf: Supress adding double '/' in library pathnameDaniel Dorau
When searching for shared libraries, it could happen that redudant '/' were added to the pathname with would later be reported via dladdr() in the dli_fname member. Signed-off-by: Daniel Dorau <d.dorau@avm.de>
2021-12-24Fix -Wundef related warningsYann Sionneau
Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
2021-06-04powerpc: fix PIE/PIC builds with newer gcc/binutils which use secureplt by ↵Yann Sionneau
default This patch fixes segfault of all user space processes (including init, which caused a panic) on recent buildroot powerpc32 builds. The issue has been reported by Romain Naour in this thread: https://mailman.uclibc-ng.org/pipermail/devel/2021-May/002068.html Recent buildroot toolchain enables secure PLT in powerpc gcc. The latter will then supply -msecure-plt to gas invocations by default. Recent buildroot also enables PIE by defaults. For the secure PLT to work in PIC, the r30 register needs to point to the GOT. Old "bss plt" was just a one-instruction-wide PLT slot, pointed-to by a R_PPC_JMP_SLOT relocation, which was written on-the-fly to contain a branch instruction to the correct address. It therefore had to stay writable. New secure PLT only contains read-only code which loads the branch address from the writable GOT. Note: secure PLT without PIC does not need r30 to be set. Because offset between plt stub code and got is known at link-time. In this case the PLT entry looks like: 1009b3e0 <__uClibc_main@plt>: 1009b3e0: 3d 60 10 0e lis r11,4110 1009b3e4: 81 6b 03 74 lwz r11,884(r11) 1009b3e8: 7d 69 03 a6 mtctr r11 1009b3ec: 4e 80 04 20 bctr Whereas secure PLT with PIC - offset between plt and got is unknown at link-time - looks like this: 000af800 <00000000.plt_pic32.__uClibc_main>: af800: 81 7e 03 80 lwz r11,896(r30) af804: 7d 69 03 a6 mtctr r11 af808: 4e 80 04 20 bctr af80c: 60 00 00 00 nop Signed-off-by: Yann Sionneau <yann@sionneau.net>
2021-02-08riscv64: sync ldso relocations with or1k, fixes 5 testsuite errorsWaldemar Brodkorb
2020-10-02kvx: add support for kvx arch to uClibc-ngYann Sionneau
This commit adds support for Kalray VLIW family (kvx) Kalray kv3 core is embedded in Kalray Coolidge SoC. This core which is the third of the KV family has the following features: 32/64 bits execution mode 6-issue VLIW architecture 64 x 64bits general purpose registers SIMD instructions little-endian In order to build a usable toolchain, build scripts are provided at the following address: https://github.com/kalray/build-scripts. Kalray uses FOSS which is available at https://github.com/kalray This includes Linux kernel, uClibc-ng, gcc, binutils, etc. Signed-off-by: Clément Léger <cleger@kalray.eu> Signed-off-by: Guillaume Thouvenin <gthouvenin@kalray.eu> Signed-off-by: Laurent Thevenoux <lthevenoux@kalray.eu> Signed-off-by: Marc Poulhies <mpoulhies@kalray.eu> Signed-off-by: Marius Gligor <mgligor@kalray.eu> Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
2020-09-22Fix unused variable warning in dl-startup.cYann Sionneau
SEND_STDERR_DEBUG does nothing if __SUPPORT_LD_DEBUG_EARLY__ is not defined thus causing a warning. Fixes this: In file included from ldso/ldso/ldso.c:86:0: ldso/ldso/dl-startup.c: In function '_dl_start': ldso/ldso/dl-startup.c:313:13: warning: variable 'strtab' set but not used [-Wunused-but-set-variable] char *strtab; ^~~~~~ Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
2020-08-25ldso: Fix pointer cast warningYann Sionneau
Fixes the following compilation warning for 64-bit arch with TLS support: CC ldso/libdl/libdl.oS ldso/libdl/libdl.c: In function 'do_dlsym': ldso/libdl/libdl.c:739:59: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] ret = _dl_tls_symaddr ((struct link_map *)sym_ref.tpnt, (Elf32_Addr)ret); ^
2020-04-01statx: make include conditional, fixes non-csky arch buildroot buildsWaldemar Brodkorb
2020-04-01or1k: fix some TLS issuesYann Sionneau
Before this commit tst-tls-at-ctor test would segfault. After it passes. testsuite run before: https://pastebin.com/504JgQXa testsuite run after: https://pastebin.com/d2aNciVt Stafford Horne already fixed it in glibc: * https://github.com/openrisc/or1k-glibc/blob/bcd87396ebe78228645c0731b06c934dfd88855a/sysdeps/or1k/dl-machine.h#L298 * https://github.com/openrisc/or1k-glibc/blob/bcd87396ebe78228645c0731b06c934dfd88855a/sysdeps/or1k/dl-machine.h#L99
2020-02-03csky: add statx conditionalsWaldemar Brodkorb
Similar to glibc commit https://sourceware.org/git/?p=glibc.git;a=commit;h=6bbfc5c09fc5b5e3d4a0cddbbd4e2e457767dae7 we need to handle Linux kernel change, which removed stat64 family from default syscall set. Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> Signed-off-by: Waldemar Brodkorb <wbrodkorb@conet.de>
2019-11-08riscv64: implement NPTL/TLSWaldemar Brodkorb
basically from or1k port of uClibc-ng, with fixes for structures in pthreadtypes.h from 64 bit architectures. 18 testsuite failures counted.
2019-11-06riscv64: lazy relocations do not work like sparc/m68kWaldemar Brodkorb
2019-11-01riscv64: add shared library supportWaldemar Brodkorb
2019-04-14Fix build with SUPPORT_LD_DEBUG_EARLY enabledKonstantin Vasin
2018-12-31csky: Add EM_CSKY for ldsoGuo Ren
Support EM_CSKY 252 elf format. Changelog: Increase EM_NUM to 253 Signed-off-by: Guo Ren <ren_guo@c-sky.com> Signed-off-by: Mao Han <han_mao@c-sky.com>
2018-11-01Add support for Thumb-only processors.Christophe Lyon
* ldso/ldso/arm/aeabi_read_tp.S: Add Thumb version. * ldso/ldso/arm/dl-startup.h: Do not force ARM encoding, adjust for Thumb. * ldso/ldso/arm/resolve.S: Force Thumb encoding on Thumb-only processors. * libc/sysdeps/linux/arm/crt1.S: Do not force ARM encoding, adjust for Thumb. Signed-off-by: Mickaël Guêné <mickael.guene@st.com> Signed-off-by: Christophe Lyon <christophe.lyon@st.com>
2018-10-27ARC: Accommodate TLS fix in BinutilsEvgeniy Didin
[1] fixes clash of TLS variables on ARC and since LD now calculates relocations a bit different now we need to update dynamic loader as well otherwise relocs will be calculated improperly. Note this is an ABI change and should go in-line with corresponding ARC tools. That said either arc-2018.09 (to be released in few weeks) or the next version of upstream Binutils (2.32) are required for normal TLS work on ARC. Testcase: ----------------------------------8<------------------------------- #include <stdio.h> int foo3(void); int foo1(void); #ifdef _SHARED int foo1(){ static __thread int val3=1; val3 += 2; return val3; } #elif _SHARED2 int foo3(){ static __thread int val2=0; val2 += 2; return val2; } #else int main(){ printf("foo1 = %d \n", foo1()); printf("foo3 = %d \n", foo3()); return 0; } #endif --------------------------------->8--------------------------------------- The result shoud be: ----8<---- foo1 = 3 foo3 = 2 ---->8---- Commands to build artefacts: ----------------------------------------8<------------------------------- arc-linux-gcc -fPIE -ffunction-sections -fdata-sections -pthread -Os \ -fPIC -o testtls.o -D_SHARED -c tst.c arc-linux-gcc -fPIE -ffunction-sections -fdata-sections -pthread -Os \ -fPIC -o testtls2.o -D_SHARED2 -c tst.c arc-linux-gcc -shared -o libtesttls.so testtls.o testtls2.o -lm -Os arc-linux-gcc tst.c -o tst.out -L./ -ltesttls -Os -fPIE --------------------------------->8--------------------------------------- Add path to libtesttls.so file to LD_LIBRARY_PATH before runnig tst.out application. [1] https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=714e9a954a2e4123dcb26bb8da850e1344de4f5f Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Signed-off-by: Evgeniy Didin <didin@synopsys.com> CC: Cupertino Miranda <cmiranda@synopsys.com> CC: Vineet Gupta <vgupta@synopsys.com> CC: Waldemar Brodkorb <wbx@uclibc-ng.org>
2018-08-10rtld: Avoid crash on R_ARM_NONE relocationChristophe Lyon
R_ARM_NONE contains no data, so avoid dereferencing it. * ldso/ldso/arm/elfinterp.c (_dl_do_reloc): Handle R_ARM_NONE relocation (_dl_do_reloc_lazy): Likewise. Signed-off-by: Mickaël Guêné <mickael.guene@st.com> Signed-off-by: Christophe Lyon <christophe.lyon@st.com>
2018-08-10Fix htab_delete loop counterChristophe Lyon
dlclose can crash or stuck the system: When calling dlclose() then system can crash or freeze, because htab_delete() in ldso/ldso/fdpic/dl-inlines.h uses size_t for i which is a typedef to unsigned int. We exit the loop on negative value of i which can never occur since i is an unsigned int. This leads to random free of various pointers that kill the system. * ldso/include/inline-hashtab.h (htab_delete): Change type of 'i' to int. Signed-off-by: Mickaël Guêné <mickael.guene@st.com> Signed-off-by: Christophe Lyon <christophe.lyon@st.com>