<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi Folks,</div><div class=""><br class=""></div><div class="">I have a question regarding LLD support for ld64 mach-o linker synthesised symbols. I did a quick search of the LLD source and I can not find support for them so before I start trying to use lld I thought I would ask.</div><div class=""><br class=""></div><div class="">I have found a couple of cases where they are essential. i.e. where there is no other way to get the required information, such as getting the address of the mach-o headers of the current process, with ASLR enabled, if the process is not dyld as exec on macOS only provides the mach header address to dyld (*1). They are used inside of dyld and I am now using them in “x86_64-xnu-musl”.</div><div class=""><br class=""></div><div class="">It’s possible to resolve a mach-o segment offset or a mach-o section offset using these special ld64 linker synthesised symbols. See resolveUndefines:</div><div class=""><br class=""></div><div class="">- <a href="https://opensource.apple.com/source/ld64/ld64-274.2/src/ld/Resolver.cpp.auto.html" class="">https://opensource.apple.com/source/ld64/ld64-274.2/src/ld/Resolver.cpp.auto.html</a></div><div class=""><br class=""></div><div class="">There are 4 special symbol prefixes for the mach-o linker synthesised symbols:</div><div class=""><br class=""></div>- segment$start$__SEGMENT<br class="">- segment$end$__SEGMENT<br class="">- section$start$__SEGMENT$__section<br class=""><div class="">- section$end$__SEGMENT$__section</div><div class=""><br class=""></div><div class="">In asm:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class="">/* get imagebase and slide for static PIE and ASLR support in x86_64-xnu-musl */</div><div class=""><br class=""></div><div class="">.align 3</div><div class="">__image_base:</div><div class="">.quad segment$start$__TEXT</div><div class="">__start_static:</div><div class="">.quad start</div><div class="">.text</div><div class="">.align 3</div><div class="">.global start</div><div class="">start:</div><div class="">       xor %rbp,%rbp</div><div class="">       mov %rsp,%rdi</div><div class="">       andq $-16,%rsp</div><div class="">       movq __image_base(%rip), %rsi</div><div class="">       leaq start(%rip), %rdx</div><div class="">       subq __start_static(%rip), %rdx</div><div class="">       call __start_c</div></blockquote><div class=""><br class=""></div><div class="">In C:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class="">/* run C++ constructors in __libc_start_main for x86_64-xnu-musl */</div><div class=""><br class=""></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class="">typedef void (*__init_fn)(int, char **, char **, char **);<br class="">extern __init_fn  __init_start  __asm("section$start$__DATA$__mod_init_func");<br class="">extern __init_fn  __init_end    __asm("section$end$__DATA$__mod_init_func”);<br class=""><div class=""><br class=""></div><div class="">static void __init_mod(int argc, char **argv, char **envp, char **applep)</div><div class="">{</div><div class="">        for (__init_fn *p = &__init_start; p < &__init_end; ++p) {</div><div class="">                (*p)(argc, argv, envp, applep);</div><div class="">        }</div><div class="">}</div></blockquote><div class=""><br class=""></div><div class="">Michael.</div><div class=""><br class=""></div><div class="">[1] <a href="https://github.com/opensource-apple/xnu/blob/dc0628e187c3148723505cf1f1d35bb948d3195b/bsd/kern/kern_exec.c#L1072-L1111" class="">https://github.com/opensource-apple/xnu/blob/dc0628e187c3148723505cf1f1d35bb948d3195b/bsd/kern/kern_exec.c#L1072-L1111</a></div></body></html>