osx shared libraries.

bitwise via Digitalmars-d digitalmars-d at puremagic.com
Mon Jun 15 20:26:18 PDT 2015


On Sat, 06 Jun 2015 16:04:33 -0400, Walter Bright  
<newshound2 at digitalmars.com> wrote:

> On 6/6/2015 12:09 PM, bitwise wrote:
>> On Sat, 06 Jun 2015 14:52:11 -0400, bitwise <bitwise.pvt at gmail.com>  
>> wrote:
>>> Any ideas on this would be much appreciated.
>>>
>>> Thanks,
>>>    Bit
>>
>> One thought that just occurred to me would be to require that D dynamic
>> libraries contain a main entry point, like DllMain on Windows. This  
>> seems like
>> the only real/reliable option.
>>
>> The coder would have to explicitly give dmd a module in which to place  
>> the
>> constructor/destructor code for images, the same way that dmd adds a  
>> C-main in
>> the file where D-main is found. Enforcing this in the future would be a  
>> breaking
>> change, but not a dangerous one. It would be a simple link-time error  
>> which was
>> easy to fix.
>>
>> Also, requiring all D binaries to have some kind of entry point would  
>> alleviate
>> the need to ever call Runtime.initialize() explicitly.
>>
>>    Bit
>
> Martin Nowak is the author of most of the OSX DLL support, but he seems  
> to not be around lately.
>
> I'd rather have a dynamic library entry point than put a  
> constructor/destructor call into every object file.

Right. I was wondering what he was doing there...Just learned what COMDAT  
is ;)

It's starting to look like reworking druntime was the easy part. I've got  
druntime built as a shared library now, and my main project, which thus  
far is an app/graphics/game engine, is working nicely. Of course, all this  
goes out the window with a C-Host app... unless people knew to link the  
shared druntime with their C host app, which doesn't sound intuitive.

I like the idea of a dll entry point though.

I suppose it could look something like this:

enum Reason {
     processAttach,
     processDetach,
     threadAttach,
     threadDetatch
}

bool main(void *handle, Reason reason) {
     return true;
}

For windows, we could simply hijack DllMain().

As for the OSX, we could use an entry point stub like this, with the rest  
of the code in druntime:

// dladdr(&symbol) gets us the mach_image*
void _osx_image_init(void *symbol);
void _osx_image_term(void *symbol);

__attribute__((visibility("hidden"), constructor))
static void _image_init() {
     _osx_image_init((void*)&_image_init);
}
__attribute__((visibility("hidden"), destructor))
static void _image_term(){
     _osx_image_term((void*)&_image_term);
}

I would like to do the above stub in D, but I haven't found a way to  
specify visibility or section of the function yet.

I would rather not do what Martin has done, outputting the entire thing in  
asm, as that would take me a very long time to get right.

Anyways, onward!

Thanks
   Bit


More information about the Digitalmars-d mailing list