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]

Reply via email to