shared libs for OSX
Jacob Carlborg via Digitalmars-d
digitalmars-d at puremagic.com
Tue May 26 23:45:57 PDT 2015
On 2015-05-26 18:25, bitwise wrote:
> I think Martin is right. We don't need ctors/dtors or any compiler
> fanciness. All we need is the two callbacks, which can be registered
> when druntime is initialized.
>
> _dyld_register_func_for_add_image
> _dyld_register_func_for_remove_image
>
> At this point, we would only be registering the callbacks once in the
> main image, and not from the shared library. Since all global functions
> and symbols are shared between images anyways, receiving the callback in
> the main image would be fine. So in this case, unregistering the
> callbacks is no longer needed.
What about using a D dynamic library in a C application? The C
application would initialize the runtime which would register the
callback. Then it would be undefined to unload druntime?
> How would loading shared libraries change this? Couldn't TLS, however
> it's implemented now, be applied to shared libraries as well?
I'm not sure. The ___tls_get_addr function [1] is used when accessing a
TLS variable on OS X. In all native implementations, both on OS X and
Linux, the parameter is not just a void* but struct containing the image
header as well.
Looking at SectionGroup [2] and how its data is initialized [3] you can
see that there's only one set of TLS data (__tls_data and __tlscoal_nt)
in SectionGroup. It would be straight forward to change that to an array
but then you would not know which index to access in getTLSBlockAlloc
[4] which is used by ___tls_get_addr.
[1]
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_osx.d#L115
[2]
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_osx.d#L26
[3]
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_osx.d#L227-L239
[4]
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_osx.d#L172
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list