digitalmars.D - Using dlopen/dlsym
- Andrei Alexandrescu (24/24) Dec 26 2016 Consider this code:
- Nicholas Wilson (4/14) Dec 26 2016 Does auto p = dlsym(hndl, fun.mangleof.ptr);
- Andrei Alexandrescu (2/16) Dec 26 2016 No, same result. -- Andrei
- Benjiro (3/28) Dec 26 2016 Odd ... Works perfect on Debian ( DMD64 D Compiler v2.071.2 ).
- Adam D. Ruppe (7/8) Dec 26 2016 Do dmd -v for verbose output and see what linker flags it is
- Mike Wey (5/12) Dec 27 2016 dmd will need to pass "--export-dynamic" to the linker, so that the
- Martin Nowak (2/4) Dec 31 2016 Thanks, at least one useful answer out of nine!
- Jacob Carlborg (5/27) Dec 27 2016 I tried on Mint 18 and Ubuntu 16.10 with DMD 2.072.2-b1, it worked for m...
- Chris Wright (2/3) Dec 27 2016 What DMD version are you using?
- Jacob Carlborg (11/33) Dec 27 2016 Although I don't think this is the problem, the correct way to check if
- unDEFER (2/2) Dec 27 2016 It works on my Ubuntu 16.04 and dmd v2.071.1
- Martin Nowak (13/16) Dec 31 2016 Importing symbols from your executable requires to tell the
Consider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr); if (!p) { import core.stdc.stdio; printf("%s\n", dlerror()); } } =========== It works (i.e. outputs nothing) on http://dpaste.dzfl.pl and on Vladimir's machine. On my Mint and Ubuntu machines it outputs: ./test: undefined symbol: fun I'm building with no flags using dmd. What could be the problem here? Thanks, Adnrei
Dec 26 2016
On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:Consider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr);Does auto p = dlsym(hndl, fun.mangleof.ptr); work any better?
Dec 26 2016
On 12/26/2016 07:35 PM, Nicholas Wilson wrote:On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:No, same result. -- AndreiConsider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr);Does auto p = dlsym(hndl, fun.mangleof.ptr); work any better?
Dec 26 2016
On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:Consider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr); if (!p) { import core.stdc.stdio; printf("%s\n", dlerror()); } } =========== It works (i.e. outputs nothing) on http://dpaste.dzfl.pl and on Vladimir's machine. On my Mint and Ubuntu machines it outputs: ./test: undefined symbol: fun I'm building with no flags using dmd. What could be the problem here? Thanks, AdnreiOdd ... Works perfect on Debian ( DMD64 D Compiler v2.071.2 ).
Dec 26 2016
On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:I'm building with no flags using dmd.Do dmd -v for verbose output and see what linker flags it is doing. Perhaps you have a configuration difference that is causing it not to export the symbol (`fun` isn't marked `export`... I don't think that matters on linux but it might on some versions or with some configurations).
Dec 26 2016
On 12/27/2016 06:02 AM, Adam D. Ruppe wrote:On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:dmd will need to pass "--export-dynamic" to the linker, so that the symbol is actually exported. -- Mike WeyI'm building with no flags using dmd.Do dmd -v for verbose output and see what linker flags it is doing. Perhaps you have a configuration difference that is causing it not to export the symbol (`fun` isn't marked `export`... I don't think that matters on linux but it might on some versions or with some configurations).
Dec 27 2016
On Tuesday, 27 December 2016 at 18:12:42 UTC, Mike Wey wrote:dmd will need to pass "--export-dynamic" to the linker, so that the symbol is actually exported.Thanks, at least one useful answer out of nine!
Dec 31 2016
On 2016-12-27 01:05, Andrei Alexandrescu wrote:Consider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr); if (!p) { import core.stdc.stdio; printf("%s\n", dlerror()); } } =========== It works (i.e. outputs nothing) on http://dpaste.dzfl.pl and on Vladimir's machine. On my Mint and Ubuntu machines it outputs: ./test: undefined symbol: fun I'm building with no flags using dmd. What could be the problem here?I tried on Mint 18 and Ubuntu 16.10 with DMD 2.072.2-b1, it worked for me. Which versions of Mint, Ubuntu, dmd, gcc, ldd etc. are you using? -- /Jacob Carlborg
Dec 27 2016
On Mon, 26 Dec 2016 19:05:39 -0500, Andrei Alexandrescu wrote:I'm building with no flags using dmd. What could be the problem here?What DMD version are you using?
Dec 27 2016
On 2016-12-27 01:05, Andrei Alexandrescu wrote:Consider this code: =========== import core.sys.posix.dlfcn; extern(C) void fun() {} void main() { fun(); void *hndl = dlopen(null, RTLD_LAZY); if (!hndl) assert(0); auto p = dlsym(hndl, "fun".ptr); if (!p) { import core.stdc.stdio; printf("%s\n", dlerror()); } } =========== It works (i.e. outputs nothing) on http://dpaste.dzfl.pl and on Vladimir's machine. On my Mint and Ubuntu machines it outputs: ./test: undefined symbol: fun I'm building with no flags using dmd. What could be the problem here?Although I don't think this is the problem, the correct way to check if dlsym was successful is to call dlerror, not check if the result from dlsym was null. From the man page: "Since the value of the symbol could actually be NULL (so that a NULL return from dlsym() need not indicate an error), the correct way to test for an error is to call dlerror(3) to clear any old error conditions, then call dlsym(), and then call dlerror(3) again, saving its return value into a variable, and check whether this saved value is not NULL" -- /Jacob Carlborg
Dec 27 2016
It works on my Ubuntu 16.04 and dmd v2.071.1 But it wants to call dlopen() as core.sys.posix.dlfcn.dlopen().
Dec 27 2016
On Tuesday, 27 December 2016 at 00:05:39 UTC, Andrei Alexandrescu wrote:./test: undefined symbol: fun I'm building with no flags using dmd. What could be the problem here?Importing symbols from your executable requires to tell the linker to create a dynamic symbol table, i.e. using --export-dynamic for ld. We also add that flag by default on many platforms because our exception backtraces still rely on the dynamic symbol tables, instead of exclusively using dedicated DWARF information. Combining both effects might lead to confusing behavior. Also see: [Issue 11870 – replace dynamic symbol table (--export-dynamic) for backtraces](https://issues.dlang.org/show_bug.cgi?id=11870) https://dlang.org/changelog/2.069.0.html#curl-dynamic-loading
Dec 31 2016