digitalmars.D.learn - The module 'foo' is already defined in 'libmylib.so'
- Timothee Cour via Digitalmars-d-learn (9/9) Dec 01 2016 I want to update a library with new symbols (ie partial recompilation):
- Nicholas Wilson (4/14) Dec 01 2016 Have a look at what `trace -E d_executable args` and `trace -E
- timotheecour (2/5) Dec 09 2016 do you mean strace?
- timotheecour (22/27) Dec 09 2016 Looking at the code for $checkModuleCollisions in druntime
I want to update a library with new symbols (ie partial recompilation): libmylib.so : compiled from bar.d and foo.d now update the file foo.d dmd -c -fPIC foo.d -offoo.o clang++ -o libmylib_update.so foo.o -shared -Wl,-lmylib When trying to dlopen libmylib_update.so from C++ it fails with: The module 'foo' is already defined in 'libmylib.so' (it somehow works when the dlopen is called from D) How would I achieve that?
Dec 01 2016
On Thursday, 1 December 2016 at 22:05:06 UTC, Timothee Cour wrote:I want to update a library with new symbols (ie partial recompilation): libmylib.so : compiled from bar.d and foo.d now update the file foo.d dmd -c -fPIC foo.d -offoo.o clang++ -o libmylib_update.so foo.o -shared -Wl,-lmylib When trying to dlopen libmylib_update.so from C++ it fails with: The module 'foo' is already defined in 'libmylib.so' (it somehow works when the dlopen is called from D) How would I achieve that?Have a look at what `trace -E d_executable args` and `trace -E c++_executable args` print on startup and grep for dlopen calls and the like.
Dec 01 2016
Have a look at what `trace -E d_executable args` and `trace -E c++_executable args` print on startup and grep for dlopen calls and the like.do you mean strace? I have trace on OSX but I'm asking for linux.
Dec 09 2016
On Saturday, 10 December 2016 at 02:39:33 UTC, timotheecour wrote:Looking at the code for $checkModuleCollisions in druntime [src/rt/sections_elf_shared.d:859]: ``` * Check for module collisions. A module in a shared library collides * with an existing module if it's ModuleInfo is interposed (search * symbol interposition) by another DSO. Therefor two modules with the * same name do not collide if their DSOs are in separate symbol resolution * chains. ``` Not exactly sure what that means nor how to fix my issue: ``` void some_fun(){ handle=dlopen2("path/liblib.so", RTLD_LAZY | RTLD_LOCAL); // error: The module 'foo' is already defined in 'libmylib.so' } ``` How would I modify the code to avoid this?Have a look at what `trace -E d_executable args` and `trace -E c++_executable args` print on startup and grep for dlopen calls and the like.do you mean strace? I have trace on OSX but I'm asking for linux.
Dec 09 2016