nuttx/arch/arm/include
Marco Casaroli dcd93b0f67
Some checks are pending
Build Documentation / build-html (push) Waiting to run
MemBrowse Memory Report / changes-filter (push) Waiting to run
MemBrowse Memory Report / load-targets (push) Waiting to run
MemBrowse Memory Report / identical (push) Blocked by required conditions
MemBrowse Memory Report / analyze (push) Blocked by required conditions
libs/libc/elf: Load the libraries a module names in DT_NEEDED.
A module that names a shared library in DT_NEEDED now gets it loaded and
its imports bound against it, rather than being refused.

libelf_insert() does the loading, which is what dlopen() calls anyway: the
library lands in the module registry like anything else, its exports come
back through libelf_getsymbol() -- the same call dlsym() uses -- and a
library named by two modules is loaded once.  A bare name is looked for
along LD_LIBRARY_PATH, where dlopen() looks for it.  Undefined symbols
resolve against the globally registered symbols first, then the modules
this one depends on, then the table exec() supplied.  Nothing here calls
into dlfcn, because this loader is also the kernel's module loader, which
has none.

Each library becomes one of the module's dependencies[], and the dependency
holds it in place of the reference libelf_insert() took.  So a library
loaded only for DT_NEEDED is kept by the modules that depend on it, and
libelf_undepend() unloads it with the last of them; one that dlopen() or
insmod also opened stays until that reference goes too.
CONFIG_LIBC_ELF_MAXDEPEND bounds how many libraries a module may name,
which is what it already meant.

Six things had to be fixed to make it work, none of which a build shows.

reldata was a file-scope global.  Loading a library from inside
libelf_relocatedyn() makes that function reentrant, so the nested load
overwrote the outer one's relocation offsets and the module resumed binding
with the library's DT_REL.  It is now per call.

A cross-object call needs the callee's data base, not the caller's.  A
symbol resolved from an FDPIC library comes back as a descriptor, and
R_ARM_FUNCDESC_VALUE was treating it as a code address and pairing it with
the importing module's GOT.  It now copies both words, so the library runs
with its own.

An object with no imports has no PLT and so no DT_PLTGOT, but it still has
a GOT and still has to be entered with it.  Without the fallback its
descriptors carried a data base of zero and the library read its globals
through a null pointer.

R_ARM_FUNCDESC, a pointer to a descriptor, wrapped a library's descriptor
in a second one.  It now stores the library's descriptor as it is.

The flag that says a resolved value is a descriptor was set only for an
import and never cleared, so the next relocation against a symbol of the
module itself took that symbol for a descriptor too.  It is cleared there.

libelf_symname() was static, and reading a DT_NEEDED name needs it.

A module with DT_NEEDED is refused where CONFIG_LIBC_ELF_MAXDEPEND is zero,
since that is where the dependency logic is compiled out.

A DT_NEEDED library is one shared instance, its data included, because the
loader returns the object already in the registry.  A module started with
exec() is different: that path loads the module afresh each time, so two
running instances have separate data while sharing one copy of the text.

Built for mps3-an547:picostest with CONFIG_FDPIC both ways.  Run on
mps2-an500:xipfs under QEMU: fdpicxip solib loads libcounter.so by name out
of DT_NEEDED, two instances share one pinned copy of its text, and the
library is unloaded, and its pin given back, when the second one exits.  A
library also opened with dlopen() stays loaded after its DT_NEEDED user
exits, and dlclose() unloads it.

With CONFIG_ARCH_ADDRENV the program runs in its own address space, which
a library libelf_insert() loads cannot reach, so DT_NEEDED is refused
there as before.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
2026-10-06 17:48:49 -03:00
..
a1x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
am67 arch/arm/am67: Add I2C0/WKUP_I2C0 master driver. 2026-09-17 13:49:35 +08:00
am335x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
arm !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv6-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv7-a arch/arm: Build fork() children from the caller's syscall frame on armv7-a. 2026-08-10 08:57:30 -03:00
armv7-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv7-r !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv8-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv8-r !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
at32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
c5471 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
csk6 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
cxd32xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
cxd56xx !boards: Remove NSH_ARCHINIT and board_app_initialize 2026-05-02 18:36:46 +08:00
dm320 style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
efm32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
eoss3 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
fvp-v8r-aarch32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
gd32f4 style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
goldfish arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
ht32f491x3 ht32f491x3/esk32: add docs and flash helpers 2026-03-30 09:48:16 +08:00
imx1 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
imx6 arm/imx6: Fix IMX_IRQ definitions 2026-04-10 10:28:39 +08:00
imx9 imx9: imx95 fix uSDHC IRQ naming to match NuttX USDHC convention 2026-03-24 15:39:07 +08:00
imxrt arch/arm/imxrt: Add missing imxrt118x IRQ 238/239 definitions 2026-09-23 11:24:44 +08:00
kinetis style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
kl arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lc823450 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc17xx_40xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc31xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc43xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc54xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc214x arch/lpc214x: Fix LPC214x to work again 2026-07-01 03:00:43 +08:00
lpc2378 arch/arm: Fix LPC2378 to work again 2026-06-30 03:28:12 +08:00
max326xx arch/arm/max326xx: add max32690 global control bit definitions 2025-02-11 12:27:10 -03:00
mcx-nxxx arch/mcx-nxxx: Add support for NXP MCX-N236 CPU 2025-02-22 16:12:06 -03:00
moxart arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
mps arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
mx8mp style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
n32h7 arch/arm/n32h7: Add N32H762IIL7 BSP 2026-09-17 09:39:41 -03:00
nrf52 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nrf53 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nrf54l arm/nrf54l: add initial nrf54l support 2026-09-24 11:10:46 +08:00
nrf91 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nuc1xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
phy62xx !arch/stm32f0l0g0: move stm32c0 and finalize the directory split 2026-06-24 14:54:44 -03:00
qemu arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
ra4 arch/ra4: Add support for Renesas RA4M1 MCU 2025-02-25 13:14:48 -03:00
ra8m1 arch/arm/ra8m1: Add GPT timer support 2026-10-01 23:12:10 +08:00
rp23xx arch/arm/rp23xx: fix irq priority levels 2025-04-22 20:59:42 -03:00
rp2040 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
rtl8720f arch/arm: add Realtek RTL8721Dx and RTL8720F (Ameba WHC) support 2026-07-01 09:18:06 -03:00
rtl8721dx arch/arm: add Realtek RTL8721Dx and RTL8720F (Ameba WHC) support 2026-07-01 09:18:06 -03:00
rtl8721f arch/arm/rtl8721f: bring up minimal NSH (P1) 2026-07-30 17:04:14 +08:00
rtl8730e arch/arm/rtl8730e: add UART character driver support 2026-09-24 21:24:35 +08:00
s32k1xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
s32k3xx style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
sam34 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
sama5 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samd2l2 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samd5e5 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samv7 arch/arm/samv7: enable USART peripherals for SAMx7xJ series 2025-09-18 11:05:56 +02:00
stm32c0 !arch/stm32f0l0g0: move stm32c0 and finalize the directory split 2026-06-24 14:54:44 -03:00
stm32c5 arch/arm/stm32c5: Add STM32C562 architecture support 2026-08-27 01:07:10 +08:00
stm32f0 !arch/stm32f0l0g0: move stm32f0 to its own directory 2026-06-24 14:54:44 -03:00
stm32f1 !arch/stm32: move stm32f1 to its own directory 2026-06-24 14:54:44 -03:00
stm32f2 !arch/stm32: move stm32f2 to its own directory 2026-06-24 14:54:44 -03:00
stm32f3 !arch/stm32: move stm32f3 to its own directory 2026-06-24 14:54:44 -03:00
stm32f4 arch/arm/stm32f4: add STM32F412CG chip selection 2026-09-01 17:40:30 +08:00
stm32f7 arch/arm/stm32f7: use common Kconfig symbols 2026-08-18 09:34:58 +08:00
stm32g0 arm/stm32g0: Add USB device controller support 2026-08-22 11:09:08 +08:00
stm32g4 !arch/stm32: move stm32g4 to its own directory 2026-06-24 14:54:44 -03:00
stm32h5 arch/arm: define SecureFault for STM32H5/L5/U5 2026-08-27 01:06:44 +08:00
stm32h7 arch/arm: add initial STM32H7R/S family support 2026-08-23 11:03:16 +08:00
stm32l0 !arch/stm32f0l0g0: move stm32l0 to its own directory 2026-06-24 14:54:44 -03:00
stm32l1 !arch/stm32: move stm32l1 and finalize the directory split 2026-06-24 14:54:44 -03:00
stm32l4 !arch/stm32l4: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32l5 arch/arm/stm32l5: Use common Cortex-M33 core support 2026-09-22 09:21:35 -03:00
stm32n6 !arch/stm32n6: unify non-standard hardware definition prefixes 2026-06-11 22:51:35 -03:00
stm32u0 arch/arm: add stm32u0 support 2026-08-18 15:00:15 +02:00
stm32u3 arch/arm/stm32u3: Add STM32U3C5 architecture support 2026-08-23 11:03:03 +08:00
stm32u5 arch/arm/stm32: Generalize Cortex-M33 heap support 2026-08-27 01:07:10 +08:00
stm32wb !arch/stm32wb: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32wl5 !arch/stm32wl5: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
str71x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
tiva arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
tlsr82 !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
tms570 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
xmc4 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
.gitignore
arch.h binfmt, arch/arm: Add the CONFIG_FDPIC option and the ABI header. 2026-09-08 16:31:16 -03:00
barriers.h arch/arm:use UP_DSB, UP_DMB, UP_ISB as barrier standard API 2025-01-20 20:13:07 +08:00
elf.h libs/libc/elf: Load the libraries a module names in DT_NEEDED. 2026-10-06 17:48:49 -03:00
inttypes.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
irq.h arch: rename STACK_ALIGNMENT to STACKFRAME_ALIGN across all architectures 2026-01-22 15:37:24 +08:00
limits.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
setjmp.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
stdarg.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
syscall.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
types.h armv7/8m: fix regresion from https://github.com/apache/nuttx/pull/14881 2024-12-09 12:20:13 +08:00