Getting tls symbols out of the compiler.

Jacob Carlborg doob at me.com
Fri May 31 00:58:20 PDT 2013


On 2013-05-30 11:42, Iain Buclaw wrote:

> It's the same problem with what we currently have.  LD when it gets
> all reference symbols that are to go into the tls section (for Linux,
> at least) has the right to reorder the symbols.  As such, trying to
> push _tlsstart as the first symbol in the compiler has no guarantees
> it will be the first symbol in the object file.

For Mac OS X there's a function to get a section form an image:

getsectbynamefromheader
getsectbynamefromheader_64

Documented here:

https://developer.apple.com/library/mac/#documentation/developertools/Reference/MachOReference/Reference/reference.html

You can get the mach_header (image) using this callback function:

_dyld_register_func_for_add_image

Or using the same approach Martin Nowak used for Linux.

The problem with the above function is that you cannot unregister the 
callback. If you have a dynamic library that registers a callback, i.e. 
druntime. If the dynamic library gets unloaded you will have a crash the 
next type "dlopen" is used.

A solution to that problem would be to either use the same approach 
Martin Nowak used or any of these undocumented functions from the 
dynamic linker:

void dyld_register_image_state_change_handler(dyld_image_states state, 
bool batch, dyld_image_state_change_handler handler)

Works like "_dyld_register_func_for_add_image" but will force the image 
using it to not be unloaded, or something like that.

Or:

void dyld_enumerate_tlv_storage(dyld_tlv_state_change_handler handler)

If I recall correctly, LDC is using "dyld_enumerate_tlv_storage".

-- 
/Jacob Carlborg


More information about the D.gnu mailing list