On 9/27/18 8:16 AM, Atila Neves wrote:
On Tuesday, 25 September 2018 at 14:13:50 UTC, Jacob Carlborg wrote:
On Tuesday, 25 September 2018 at 12:05:21 UTC, Jonathan M Davis wrote:
If you use -betterC, then it's trivial, because your D program is
restricted to extern(C) functions and features which don't require
druntime. It can also be done without -betterC (and thus with
druntime), but it gets to be _way_ more of a pain, because it
requires that you manually initialize druntime - either by forcing
whatever is using your "C" library to call a specific function to
initialize druntime before using any of its normal functions or by
having every function in the library check whether druntime has been
initialized yet and initialize it if it hasn't been before it does
whatever it's supposed to do.
Shouldn't it be possible to use a C initialization function, i.e.
pragma(crt_constructor) to initialize druntime? Then it only needs to
be initialized once and it's not required to check if it's initialized
all the time.
--
/Jacob Carlborg
Even easier, compile this C file and add the resulting object file to
your (now mostly) D static library:
-----------------------
extern int rt_init(void);
extern int rt_term(void);
__attribute__((__constructor__)) void dinit(void) {
rt_init();
}
__attribute__((__destructor__)) void dterm(void) {
rt_term();
}
-----------------------
The C runtime will initialise the D runtime for you.
I will point out that this is EXACTLY what pragma(crt_constructor) does.
And my comments still aren't answered -- I'm not sure whether this works
correctly or not, as we don't test initializing druntime before C main runs.
-Steve