casaroli opened a new pull request, #19639: URL: https://github.com/apache/nuttx/pull/19639
## Summary `dlopen()` of a library that is already loaded fails. `libelf_insert()` rejects a name already in the module registry with `EEXIST` and `dlinsert()` passes that straight out, so the second caller gets `NULL`. POSIX says `dlopen()` shall return a handle to the object, and today there is no way for two modules to hold the same library at once — which is what a shared library is for. `dlopen()` now takes another reference on a library that is already loaded, and `dlclose()` tears it down only when the last handle goes. The count lives in the `dlfcn` layer rather than in `libelf_insert()`, so `insmod` keeps its own behaviour: a second `insmod` of the same name still fails with `EEXIST`, which is right for a kernel module. ## Module names in a PROTECTED build The module name is what makes any of this possible, and a PROTECTED build did not have one. Names were defined for `CONFIG_BUILD_FLAT` or the kernel side of a split build, on the reasoning that only the kernel needed them. That predates `dlopen()` being usable from user space. Without a name the user-space copy of libelf cannot recognise a second open, cannot count opens, and cannot make `dlclose()` mean anything — two `dlopen()`s there produce two independent copies of the library and lose track of the first. Names are therefore defined wherever `CONFIG_LIBC_DLFCN` is, which costs `NAME_MAX` per loaded module in that configuration and nothing otherwise. ## Impact No change for a configuration without `CONFIG_LIBC_DLFCN`. `insmod`/`rmmod` are unaffected. `BUILD_KERNEL` is deliberately untouched: `dlopen()` returns `NULL` there unconditionally, because `dlinsert()` is a stub. Sharing a library between processes with separate address spaces needs the text in a shared region and each process's data at a matching virtual address, which is a different problem from this one. ## Testing Built `mps3-an547:picostest` with and without `CONFIG_LIBC_DLFCN`. Built `stm32f4discovery:kostest`, a `CONFIG_BUILD_PROTECTED=y` configuration, with `CONFIG_LIBC_DLFCN` enabled — this is the case the name change is for. `tools/checkpatch.sh -c -u -m -g` passes. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
