Thread overview | ||||||
---|---|---|---|---|---|---|
|
December 01, 2016 The module 'foo' is already defined in 'libmylib.so' | ||||
---|---|---|---|---|
| ||||
Attachments:
| 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? |
December 01, 2016 Re: The module 'foo' is already defined in 'libmylib.so' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timothee Cour | 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.
|
December 10, 2016 Re: The module 'foo' is already defined in 'libmylib.so' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | > 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.
|
December 10, 2016 Re: The module 'foo' is already defined in 'libmylib.so' | ||||
---|---|---|---|---|
| ||||
Posted in reply to timotheecour | On Saturday, 10 December 2016 at 02:39:33 UTC, timotheecour wrote: >> 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. 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? |
Copyright © 1999-2021 by the D Language Foundation