mirror of
https://github.com/apache/nuttx.git
synced 2026-09-10 02:46:33 +00:00
Running one for the first time turned up two holes in the ET_DYN path. Neither shows up in a build. An undefined symbol is resolved with libelf_findglobal(), which searches only the table of globally registered symbols. The export table that exec() hands its caller went no further than the ET_REL path, so an ET_DYN module could not import anything the caller supplied. Invisible while such modules resolved everything internally; an FDPIC module imports its libc, and every import failed with "Unable to resolve addr of ext ref printf" although the caller had passed a table containing printf. The export table is now threaded into libelf_relocatedyn() and consulted when the global table has no answer, leaving the existing lookup order intact. A relocation naming a symbol defined inside the object was dropped silently. The code handles a relocation with no symbol, and one against an undefined symbol, but a defined symbol fell through both. That was harmless while every dynamic relocation arriving here had symbol index zero, which is the case for R_ARM_RELATIVE. FDPIC brings the first ones that do not: a pointer to a static function is emitted against the *section* symbol, so the value is the section base and the offset within it -- including the Thumb bit -- is carried as the addend. Deriving a value from the word being patched, as the no-symbol case does, would translate that addend as though it were an address. Confirmed against a real module: .text at 0x23c plus an addend of 0x95 gives 0x2d1, which is the function with its Thumb bit. Also stop libelf_symname() reporting a nameless symbol as an error. A section symbol has no name, and libelf_findsymbol() walks the whole table looking for optional entries such as nx_stacksize, so it meets these routinely and checks for -ESRCH itself. At error level it printed ten or more lines per module load and buried the diagnostics that matter. Built and run on lm3s6965-ek with the examples/elf ROMFS. The ET_REL test modules load as before, and an FDPIC module now loads, relocates, resolves printf and puts from the table exec() supplied, and calls through a function descriptor of its own. Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com> |
||
|---|---|---|
| .. | ||
| CMakeLists.txt | ||
| elf.h | ||
| elf_addrenv.c | ||
| elf_bind.c | ||
| elf_depend.c | ||
| elf_gethandle.c | ||
| elf_getsymbol.c | ||
| elf_globals.S | ||
| elf_init.c | ||
| elf_insert.c | ||
| elf_iobuffer.c | ||
| elf_load.c | ||
| elf_loadhdrs.c | ||
| elf_read.c | ||
| elf_registry.c | ||
| elf_remove.c | ||
| elf_sections.c | ||
| elf_symbols.c | ||
| elf_symtab.c | ||
| elf_uninit.c | ||
| elf_unload.c | ||
| elf_verify.c | ||
| gnu-elf.ld.in | ||
| Kconfig | ||
| Make.defs | ||
| Makefile | ||