Another weird LLVM mystery solved!
So, I was porting LDC to FreeBSD/aarch64, wondering why global constructors (you know, the before-main()
code you can make in C using an __attribute__
thingy) arenβt runningβ¦ but only when the executable is linked with LLD. Turns out:
.init_array
is the only supported way to do constructors on AArch64- and everything in general is moving towards
.init_array
β but the default in LLVM is still to emit.ctors
- clang has code to enable
.init_array
when appropriate, ldc did not - and the reason it all worked fine with bfd and gold is that these linkers SILENTLY convert
.ctors
to.init_array
. For PERFORMANCE REASONS.