[llvm-dev] LLD support for ld64 mach-o linker synthesised symbols
Michael Clark via llvm-dev
llvm-dev at lists.llvm.org
Wed Jun 7 17:55:00 PDT 2017
It seems I can find the static offset of the Mach-O header pre-initialisation in the crt without using the special dynamic linker synthesised symbols, rather a statically synthesised symbol that I was previously unaware of “ __mh_execute_header". I later add the slide to find the dynamic offset of the Mach-O headers.
.align 3
__image_base:
.quad __mh_execute_header
I find the slide by subtracting a static pointer to a well known symbol from an RIP-relative access to the same symbol.
__start_static:
.quad start
leaq start(%rip), %rdx
subq __start_static(%rip), %rdx
The crt then gets the stack pointer, static image base and slide, so it can relocate the image and call constructors.
void _start_c(long *p, uintptr_t image_base, uintptr_t slide)
I’m not sure about the second use case for the start and end of the “__mod_init_func” section, which would likely be required for linking dyld.
> On 7 Jun 2017, at 11:08 AM, Michael Clark <michaeljclark at mac.com> wrote:
>
> In asm:
>
> /* get imagebase and slide for static PIE and ASLR support in x86_64-xnu-musl */
>
> .align 3
> __image_base:
> .quad segment$start$__TEXT
> __start_static:
> .quad start
> .text
> .align 3
> .global start
> start:
> xor %rbp,%rbp
> mov %rsp,%rdi
> andq $-16,%rsp
> movq __image_base(%rip), %rsi
> leaq start(%rip), %rdx
> subq __start_static(%rip), %rdx
> call __start_c
>
> In C:
>
> /* run C++ constructors in __libc_start_main for x86_64-xnu-musl */
>
> typedef void (*__init_fn)(int, char **, char **, char **);
> extern __init_fn __init_start __asm("section$start$__DATA$__mod_init_func");
> extern __init_fn __init_end __asm("section$end$__DATA$__mod_init_func”);
>
> static void __init_mod(int argc, char **argv, char **envp, char **applep)
> {
> for (__init_fn *p = &__init_start; p < &__init_end; ++p) {
> (*p)(argc, argv, envp, applep);
> }
> }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170608/6346691b/attachment.html>
More information about the llvm-dev
mailing list