PengZheng commented on PR #441:
URL: https://github.com/apache/celix/pull/441#issuecomment-1241842269

   > Nice, yes this can work. Around 2011-2013 we did some experiment with 
updating the NEEDED and SONAME flags and in that experiment it did work. But 
updating the NEEDED/SONAME entry is difficult of the string size needs to 
increased, so for the experiment we only updated NEEDED to something small 
(libfoo->ab1, libbar->ab2, etc).
   > If I remember correctly we did not follow up this approach, because we had 
bigger things to tackle. But I agree if we can tackle this we are creating 
something "magical" for the C/C++ word :).
   
   Unlike `chrpath`, `patchelf` has no such limitation. For example:
   
   ```peng@hackerlife:~/Downloads/hello_solib/cmake-build-debug/impl1$ readelf 
-d libhello.so
   
   Dynamic section at offset 0x2e10 contains 25 entries:
     Tag        Type                         Name/Value
    0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
    0x000000000000000e (SONAME)             Library soname: [libhello.so]
   
   peng@hackerlife:~/Downloads/hello_solib/cmake-build-debug/impl1$ patchelf 
--set-soname libhello.so.1.0.0 ./libhello.so
   peng@hackerlife:~/Downloads/hello_solib/cmake-build-debug/impl1$ readelf -d 
libhello.so
   
   Dynamic section at offset 0x2e10 contains 25 entries:
     Tag        Type                         Name/Value
    0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
    0x000000000000000e (SONAME)             Library soname: [libhello.so.1.0.0]
   
   ```
   
   > I also did some experiment with dlmopen, but because this start with a 
completely clean symbol space (so no symbols from the executable) IMO this is 
also not a real solution.
   
   If accessing symbol from the executable is a requirement, there is a 
conflict here: any shared object imported as bundle can not be linked to the 
main executable or any of the executable's link-time dependencies, otherwise it 
will pollute the global link-map list (aka namespace). That means shared 
objects exported by bundles can only be used within the celix framework, once 
it's used, any external use will be forbidden. Given that, why not just export 
its functionality as service at the first place?
   
   On Linux, I think there is another way of doing this without such 
limitations. Use the dark Linux magic `man 7 rtld-audit`: 
   
   ```
      la_symbind*()
   
          The return value of la_symbind32() and la_symbind64() is the address 
to which control should be passed after the function returns.  If the auditing 
library is simply monitoring symbol bindings, then it should return 
sym->st_value.  A different value may be returned  if
          the library wishes to direct control to an alternate location.
   ```
   
   Theoretically, we can get complete control of dynamic symbol resolution, 
bind any symbol reference to wherever we want. But this feature is not 
available on MacOS.


-- 
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: dev-unsubscr...@celix.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to