[llvm-dev] JIT and static constructors/destructors.

Alex Denisov via llvm-dev llvm-dev at lists.llvm.org
Tue Jun 26 02:36:16 PDT 2018

Hello everyone,

The question is related to the recent "runStaticConstructorsDestructors() causes
 crash on exit" thread [1].

I was curious if the constructors/destructors thing can be done directly via
inspecting object files. Below is what I've found so far.

On macOS, I was able to get symbols for constructors by looking at relocations
at _mod_init_func. Then, I used the symbol names to retrieve addresses of actual
constructors (after relocations were applied) and calling them.
It worked well in this very case.

On Linux, same relocations are located inside of .rela.ctors or .rela.init_array.
I tried the same approach as with MachO, but not all symbols have names.
I.e., there are just references to some code (e.g. .text.startup+0x280).
So I cannot retrieve the address based on the symbol name.

I assume there can be an API within RuntimeDyld that can give the address of
a RelocationRef corresponding to a particular constructor relocation.
In that case, it will work both for Linux and macOS. Probably on Windows as well.

The question is: in what case this approach will not work?
Note: I am only interested in a non-lazy JIT of a native code.

Thank you,

[1] http://lists.llvm.org/pipermail/llvm-dev/2018-June/124031.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180626/5ab5fe6c/attachment-0001.sig>

More information about the llvm-dev mailing list