digitalmars.D - Dynamic Library Support for D
- Jeroen Bollen (17/17) Jan 02 2014 Currently D has a very poor support for creating and loading
- ponce (5/22) Jan 02 2014 There is one such format, it's called DDL
- Martin Nowak (6/21) Jan 02 2014 There are plans to make it much simpler.
- Dicebot (25/25) Jan 02 2014 It looks actually pretty capable with current 2.064.2 to me:
- Adam D. Ruppe (8/9) Jan 02 2014 I believe it also works if you don't put a default lib on the .so
- Jeroen Bollen (2/29) Jan 02 2014 That's not cross-platform though.
- Benjamin Thaut (8/23) Jan 02 2014 See http://wiki.dlang.org/DIP45
- Jakob Ovrum (4/11) Jan 02 2014 If you're also interested in runtime loading, it would be nice to
- Benjamin Thaut (7/19) Jan 02 2014 In my opinion such pull requests should wait until propper
- Jakob Ovrum (3/8) Jan 02 2014 Thanks!
- Martin Nowak (2/5) Jan 02 2014 What changes would affect the design?
Currently D has a very poor support for creating and loading dynamic libraries. It requires a bunch of code while other languages like C just allow you to create it as you would create a static library. A problem here seems to be that D wants to integrate as much as possible with other languages, resulting in very poor support for integrating with it's own language. I understand that the problem here is that the libraries get saved as .so or .dll, which should also linkable with other, non-D, applications, meaning the runtime cannot initialize on it's own. Why isn't there a D-specific format for dynamic libraries, that just shares the garbage collector with the main application, and thus only allow you to link it with D programs, and that way make it way easier to write a dynamic library in D. I guess the only reason this doesn't exist is because it'll take a lot of work?
Jan 02 2014
On Thursday, 2 January 2014 at 18:22:46 UTC, Jeroen Bollen wrote:Currently D has a very poor support for creating and loading dynamic libraries. It requires a bunch of code while other languages like C just allow you to create it as you would create a static library. A problem here seems to be that D wants to integrate as much as possible with other languages, resulting in very poor support for integrating with it's own language. I understand that the problem here is that the libraries get saved as .so or .dll, which should also linkable with other, non-D, applications, meaning the runtime cannot initialize on it's own. Why isn't there a D-specific format for dynamic libraries, that just shares the garbage collector with the main application, and thus only allow you to link it with D programs, and that way make it way easier to write a dynamic library in D. I guess the only reason this doesn't exist is because it'll take a lot of work?There is one such format, it's called DDL (http://dsource.org/projects/ddl) and it dates back from the ancient D1 civilization. It just seems nobody has ported it to D2 yet.
Jan 02 2014
On 01/02/2014 07:22 PM, Jeroen Bollen wrote:Currently D has a very poor support for creating and loading dynamic libraries. It requires a bunch of code while other languages like C just allow you to create it as you would create a static library. A problem here seems to be that D wants to integrate as much as possible with other languages, resulting in very poor support for integrating with it's own language.There are plans to make it much simpler. http://dconf.org/2013/talks/nowak.htmlI understand that the problem here is that the libraries get saved as .so or .dll, which should also linkable with other, non-D, applications, meaning the runtime cannot initialize on it's own.The runtime just needs to become a .so or .dll itself.Why isn't there a D-specific format for dynamic libraries, that just shares the garbage collector with the main application, and thus only allow you to link it with D programs, and that way make it way easier to write a dynamic library in D.It's a good idea to integrate with existing technologies and it's rather less effort than creating our own infrastructure.I guess the only reason this doesn't exist is because it'll take a lot of work?
Jan 02 2014
It looks actually pretty capable with current 2.064.2 to me: [dicebot fog ~]$ cat lib.d void foo(int x) { import std.stdio; writefln("got %s in shared lib", x); } [dicebot fog ~]$ cat test.d import lib : foo; import core.runtime : Runtime; import core.sys.posix.dlfcn : dlsym; import std.exception : enforce; void main() { auto handler = Runtime.loadLibrary("./lib.so"); scope(exit) Runtime.unloadLibrary(handler); enforce(handler); auto func = cast(void function(int)) dlsym(handler, foo.mangleof.ptr); enforce(func); func(42); } [dicebot fog ~]$ dmd -shared -fPIC -defaultlib=libphobos2.so lib.d [dicebot fog ~]$ dmd -L-ldl -defaultlib=libphobos2.so -run test.d got 42 in shared lib
Jan 02 2014
On Thursday, 2 January 2014 at 19:33:38 UTC, Dicebot wrote:[dicebot fog ~]$ dmd -shared -fPIC -defaultlib=libphobos2.soI believe it also works if you don't put a default lib on the .so at all iff loaded by D - it finds the symbols it needs in the main program. But it is also a bit of a pain to use on Windows, mainly because you have to do your own DllMain. I think this should be automated, or at least in a mixin template for easy use. With a windows dll, I'm not sure if the gcs are shared but they work.
Jan 02 2014
On Thursday, 2 January 2014 at 19:33:38 UTC, Dicebot wrote:It looks actually pretty capable with current 2.064.2 to me: [dicebot fog ~]$ cat lib.d void foo(int x) { import std.stdio; writefln("got %s in shared lib", x); } [dicebot fog ~]$ cat test.d import lib : foo; import core.runtime : Runtime; import core.sys.posix.dlfcn : dlsym; import std.exception : enforce; void main() { auto handler = Runtime.loadLibrary("./lib.so"); scope(exit) Runtime.unloadLibrary(handler); enforce(handler); auto func = cast(void function(int)) dlsym(handler, foo.mangleof.ptr); enforce(func); func(42); } [dicebot fog ~]$ dmd -shared -fPIC -defaultlib=libphobos2.so lib.d [dicebot fog ~]$ dmd -L-ldl -defaultlib=libphobos2.so -run test.d got 42 in shared libThat's not cross-platform though.
Jan 02 2014
Am 02.01.2014 19:22, schrieb Jeroen Bollen:Currently D has a very poor support for creating and loading dynamic libraries. It requires a bunch of code while other languages like C just allow you to create it as you would create a static library. A problem here seems to be that D wants to integrate as much as possible with other languages, resulting in very poor support for integrating with it's own language. I understand that the problem here is that the libraries get saved as .so or .dll, which should also linkable with other, non-D, applications, meaning the runtime cannot initialize on it's own. Why isn't there a D-specific format for dynamic libraries, that just shares the garbage collector with the main application, and thus only allow you to link it with D programs, and that way make it way easier to write a dynamic library in D. I guess the only reason this doesn't exist is because it'll take a lot of work?See http://wiki.dlang.org/DIP45 I've been pushing for propper DLL support for a while. But it has not been important enough to be put on the roadmap yet. After the last thing I heard DLL support (and therefor shared library support) will be put on the roadmap of 2.066. Kind Regards Benjamin Thaut
Jan 02 2014
On Thursday, 2 January 2014 at 20:49:32 UTC, Benjamin Thaut wrote:See http://wiki.dlang.org/DIP45 I've been pushing for propper DLL support for a while. But it has not been important enough to be put on the roadmap yet. After the last thing I heard DLL support (and therefor shared library support) will be put on the roadmap of 2.066. Kind Regards Benjamin ThautIf you're also interested in runtime loading, it would be nice to have more feedback to this pull request: https://github.com/D-Programming-Language/druntime/pull/617
Jan 02 2014
Am 02.01.2014 21:54, schrieb Jakob Ovrum:On Thursday, 2 January 2014 at 20:49:32 UTC, Benjamin Thaut wrote:In my opinion such pull requests should wait until propper dll-export/dll-import semantics are implemented. Because they may infer a language change that makes bigger changes to the pull request neccessary. But I will look into that pull request in detail on the weekend. Kind Regards Benjamin ThautSee http://wiki.dlang.org/DIP45 I've been pushing for propper DLL support for a while. But it has not been important enough to be put on the roadmap yet. After the last thing I heard DLL support (and therefor shared library support) will be put on the roadmap of 2.066. Kind Regards Benjamin ThautIf you're also interested in runtime loading, it would be nice to have more feedback to this pull request: https://github.com/D-Programming-Language/druntime/pull/617
Jan 02 2014
On Thursday, 2 January 2014 at 21:07:43 UTC, Benjamin Thaut wrote:In my opinion such pull requests should wait until propper dll-export/dll-import semantics are implemented. Because they may infer a language change that makes bigger changes to the pull request neccessary.That's a good point.But I will look into that pull request in detail on the weekend.Thanks!
Jan 02 2014
On 01/02/2014 10:07 PM, Benjamin Thaut wrote:In my opinion such pull requests should wait until propper dll-export/dll-import semantics are implemented. Because they may infer a language change that makes bigger changes to the pull request neccessary.What changes would affect the design?
Jan 02 2014