On Wednesday, 18 December 2013 at 15:39:30 UTC, Johannes Pfau
wrote:
I hope I'm not talking bullshit here as I'm not 100% sure
what's meant
with 'module discovery'.
But if the question is how to get all ModuleInfos in a library,
[…]
Yes, this was the idea.
We can then access the bracket-symbols from a
module-constructor (or a
c-like .ctor constructor) in the library? So we'd have to add
drtbegin.o / drtend.o files to every d library or executable.
That is pretty much how it is done in DMD and LDC as well. The
only difference is that instead of modifying the linker scripts
to accommodate this, we emit the ModuleInfo references to custom
sections. The GNU toolchain (and we are in highly system-specific
territory here anyway) never changes the order of custom
sections, which you can also verify using
__attribute__((section("...))) in GCC. Thus, if you emit your
relevant symbols into three sections like this,
a.o
---
_minfo_beg: moduleInfoBeginTag
_minfo: moduleInfoForA
_minfo_end: moduleInfoEndTag
b.o
---
_minfo_beg: moduleInfoBeginTag
_minfo: moduleInfoForB
_minfo_end: moduleInfoEndTag
the linked result will be
_minfo_beg: moduleInfoBeginTag
_minfo: moduleInfoForA moduleInfoForB
_minfo_end: moduleInfoEndTag
and you can just use [moduleInfoBeginTag, moduleInfoEndTag) to
get a list of all available ModuleInfos.
Of course, once shared libraries come into play, you have to
consider quite a few subtleties regarding symbol visibility and
so on. Also, due to a bug in LLVM, LDC can't emit weak symbols
with custom section names, so we end up with multiple copies of
the begin/end symbols and the C .ctor/.dtor table entries.
But in general, this works quite well, and is certainly much more
portable than requiring changes to the linker script.
David