<div dir="ltr">Hi Michael,<div><br></div><div>The Mach-O version of LLD is not being developed actively, and if some feature is missing, it is likely that it's just not implemented. What is your motivation to use LLD instead of ld64?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 6, 2017 at 4:08 PM, Michael Clark via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Hi Folks,</div><div><br></div><div>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><br></div><div>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><br></div><div>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><br></div><div>- <a href="https://opensource.apple.com/source/ld64/ld64-274.2/src/ld/Resolver.cpp.auto.html" target="_blank">https://opensource.apple.<wbr>com/source/ld64/ld64-274.2/<wbr>src/ld/Resolver.cpp.auto.html</a></div><div><br></div><div>There are 4 special symbol prefixes for the mach-o linker synthesised symbols:</div><div><br></div>- segment$start$__SEGMENT<br>- segment$end$__SEGMENT<br>- section$start$__SEGMENT$__<wbr>section<br><div>- section$end$__SEGMENT$__<wbr>section</div><div><br></div><div>In asm:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>/* get imagebase and slide for static PIE and ASLR support in x86_64-xnu-musl */</div><div><br></div><div>.align 3</div><div>__image_base:</div><div>.quad segment$start$__TEXT</div><div>__start_static:</div><div>.quad start</div><div>.text</div><div>.align 3</div><div>.global start</div><div>start:</div><div>       xor %rbp,%rbp</div><div>       mov %rsp,%rdi</div><div>       andq $-16,%rsp</div><div>       movq __image_base(%rip), %rsi</div><div>       leaq start(%rip), %rdx</div><div>       subq __start_static(%rip), %rdx</div><div>       call __start_c</div></blockquote><div><br></div><div>In C:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>/* run C++ constructors in __libc_start_main for x86_64-xnu-musl */</div><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">typedef void (*__init_fn)(int, char **, char **, char **);<br>extern __init_fn  __init_start  __<wbr>asm("section$start$__DATA$__<wbr>mod_init_func");<br>extern __init_fn  __init_end    __asm("section$end$__DATA$__<wbr>mod_init_func”);<br><div><br></div><div>static void __init_mod(int argc, char **argv, char **envp, char **applep)</div><div>{</div><div>        for (__init_fn *p = &__init_start; p < &__init_end; ++p) {</div><div>                (*p)(argc, argv, envp, applep);</div><div>        }</div><div>}</div></blockquote><div><br></div><div>Michael.</div><div><br></div><div>[1] <a href="https://github.com/opensource-apple/xnu/blob/dc0628e187c3148723505cf1f1d35bb948d3195b/bsd/kern/kern_exec.c#L1072-L1111" target="_blank">https://github.com/<wbr>opensource-apple/xnu/blob/<wbr>dc0628e187c3148723505cf1f1d35b<wbr>b948d3195b/bsd/kern/kern_exec.<wbr>c#L1072-L1111</a></div></div><br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>