Shared Libraries [was Re: D 1.076 and 2.061 release]

deadalnix deadalnix at gmail.com
Wed Jan 9 02:00:06 PST 2013


On Wednesday, 9 January 2013 at 07:57:12 UTC, Jacob Carlborg 
wrote:
> On 2013-01-07 09:04, Walter Bright wrote:
>
>> Please nail down what is necessary first. (BTW, I don't know 
>> how the
>> compiler can tell what image an address comes from. Remember, 
>> shared
>> libraries are loaded at runtime, not compile time.)
>
> I've done some investigation. Currently DMD inserts a call to 
> the __tls_get_addr function when accessing a TLS variable. This 
> is implemented in druntime.
>
> In Mac OS X 10.7 it works similar but instead of inserting a 
> call to __tls_get_addr there's a struct looking like this 
> (written in D) :
>
> struct TLVDescriptor
> {
>     void* function (TLVDescriptor*) thunk;
>     size_t key;
>     size_t offset;
> }
>
> The dynamic linker will iterate all loaded images and extract 
> the section containing the TLS data. I guess this section 
> consists of a list of TLVDescriptor*. The dynamic linker will 
> set the "thunk" to a function "tlv_get_addrs", implemented in 
> assembly in the dynamic linker. It will set the key to a key 
> created by "pthread_key_create". It will also map the image 
> with this key. This key is same for all TLVDescriptor of a 
> given image.
>
> Instead of calling "__tls_get_addr" I think that the compiler 
> will need to call the thunk passing in the TLVDescriptor itself 
> to the thunk.
>
> The "tlv_get_addrs" function will then extract the key and from 
> that key it can get the image the address belongs to.
>
> Does that make any sens? Is that something the DMD could do, 
> that is call the thunk instead of "__tls_get_addr".?

Isn't it horrible performancewise ?


More information about the Digitalmars-d-announce mailing list