D on Windows Phone
bitwise via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jul 1 16:15:54 PDT 2015
On Wed, 01 Jul 2015 15:04:16 -0400, Jacob Carlborg <doob at me.com> wrote:
> Could you try using C? I know Clang/GCC has a lot of attributes,
> something like __attribute__((section ("<section name<"))) or similar.
I was thinking about this, but it won't work because we have no control
over what linker will be used to link the object files produced by dmd.
One idea is to embed the sections-init function as a string in dmd and
just compile it with gcc. dmd already uses gcc to do linking on OSX. I
don't think it's reasonable though to expect people to know they should
compile the extra "entry.o" they find in their object directory when
building dylibs.
Another idea is to require a D entry point for D DLLs. So when dmd found a
module in which an entry point was defined, it could dump the
sections-init function there, the same way that dmd already does for
application-main. The user would surely expect to have to link the object
file containing the entry point. The problem with this approach, is that
again, we have no control over the linker that will be used. This means
that there is no way to enforce that an entry point be present in D DLLs.
For C/C++, a main entry point is required, and linking an application
without it will cause a linker error. I'm not sure if this is built into
C/C++ linkers in a standard way, or whether the C runtime library has a
reference to the main() symbol, but without fail, a linker error will
occur when linking an application without main(). Now, adding a D
application main function to a module causes dmd to dump a C application
main into the same output file for that module, thus satisfying the
requirement for a main entry point. But, the C/C++ runtime/linker does not
require any kind of entry point for DLLs on OSX. So there would be no way
to enforce that D DLLs have an entry point(that I can think of), and
trying to use a dylib which has not had their runtime/sections initialized
would result in very strange and unpredictable crashes. I really doubt
most coders would be able to figure out that it was because their D DLL
main function was missing.
Finally, Martin's solution is to just put the sections-init function in
_every_ object file, but as COMDAT. This means that the function
definitions will be treated like template definitions, and the linker will
just pick the first one it finds at link-time if there are multiple
definitions. In order to do this, Martin has basically added code to dmd's
backend for linux/freebsd which manually outputs this stuff to every
object file.
So the question is, from the point specified above, how do we get the C
code in there? One way would be have dmd compile the function and spit out
an object file. But then, dmd would have to be able to read that object
file, extract it's contents, and reinject it into the D object files. I'm
not sure this would be any easier than just outputting the function
manually.
I've been thinking about making the function in D and just parsing it like
this:
https://github.com/D-Programming-Language/dmd/blob/master/src/mars.c#L233
Once I had the above AST, I could hack it a bit to make it private/local
COMDAT, then output it to all the object files. At this point though, I'm
not sure the OSX backend for dmd even knows how to put out private/local
symbols.
I'm going to revisit this once I've finished familiarizing myself with
Mach-O format, but if you have any ideas..... :)
Bit
More information about the Digitalmars-d
mailing list