<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Thanks for the replies.</div><div><br></div><div>Rui, with your command I get</div><div><br></div><div><font face="monospace">ld.lld: error: unknown emulation: elf_x86-64</font></div><div><font face="monospace">ld.lld: error: unable to find library -lc</font></div><div><font face="monospace">ld.lld: error: cannot open /linuxroot/usr/lib/x86_64-linux-gnu/crtn.o: No such file or directory</font></div><div><font face="monospace"><br></font></div><div><br>> For your case, you need a linker script located under /linuxroot/, which INPUT or GROUP an absolute path.<font face="monospace"><br></font></div><div><br></div><div>Do you have an example of such linker script? I have no idea how this works.</div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 14, 2020 at 8:06 AM Fangrui Song <<a href="mailto:maskray@google.com">maskray@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2020-05-14, Rui Ueyama via llvm-dev wrote:<br>
>On Thu, May 14, 2020 at 11:04 AM Ivan Medoedov via llvm-dev <<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
>> Hello,<br>
>><br>
>> I'm trying to compile a Linux hello world executable on macOS.<br>
>><br>
>> The first step is simple:<br>
>><br>
>> clang -c -target x86_64-linux-gnu -c -o hello.o hello.c<br>
>><br>
>> But linking results in an error:<br>
>><br>
>> ld.lld --sysroot=/linuxroot/ -o hello -m elf_x86_64 \<br>
>>   -dynamic-linker /lib64/ld-linux-x86-64.so.2 \<br>
>>   /lib/crt1.o \<br>
>>   /usr/lib/x86_64-linux-gnu/crti.o ../hello.o \<br>
>>   /usr/lib/x86_64-linux-gnu/libc.so \<br>
>>   /usr/lib/x86_64-linux-gnu/crtn.o<br>
>><br>
>> ld.lld: error: cannot open /lib/crt1.o: No such file or directory<br>
>> ld.lld: error: cannot open /usr/lib/x86_64-linux-gnu/crti.o: No such file<br>
>> or directory<br>
>><br>
<br>
You misunderstand GNU ld's --sysroot rule, which is applicable in these two cases:<br>
<br>
* when a path begins with "=" or "$SYSROOT"<br>
* <a href="https://www.sourceware.org/binutils/docs/ld/File-Commands.html" rel="noreferrer" target="_blank">https://www.sourceware.org/binutils/docs/ld/File-Commands.html</a><br>
   "In case a sysroot prefix is configured, and the filename starts with<br>
   the ‘/’ character, and the script being processed was located inside<br>
   the sysroot prefix, the filename will be looked for in the sysroot<br>
   prefix."<br>
<br>
For your case, you need a linker script located under /linuxroot/, which<br>
INPUT or GROUP an absolute path.<br>
<br>
>--sysroot affects some library search paths, but it doesn't affect paths<br>
>directly given to the linker. In the above command line, you are directly<br>
>specifying object file and so file paths without -l, so the linker looks at<br>
>the only given locations. This is an expected behavior.<br>
><br>
>I think, unlike some other linkers, --sysroot option isn't very useful for<br>
>lld, because lld doesn't have a notion of built-in default search paths.<br>
>You always have to specify library search paths by -L option to lld. So why<br>
>don't you specify library directories with -L, like this?<br>
><br>
>$ ld.lld -o hello -m elf_x86-64 -dynamic-linker /lib64/ld-linux-x86-64.so.2<br>
>-L /linuxroot/usr/lib -lc /linuxroot/usr/lib/x86_64-linux-gnu/crtn.o<br>
><br>
><br>
>> /linuxroot/ contains all the necessary files copied from a Linux machine:<br>
>> /linuxroot/lib/crt1.o, /linuxroot/usr/lib/x86_64-linux-gnu/crti.o, etc<br>
>><br>
>> It works if I use a full path for each file (-dynamic-linker<br>
>> /linuxroot/lib64/ld-linux-x86-64.so.2 ...), but the resulting binary<br>
>> doesn't work on Linux, because it's dynamically linked to /linuxroot/...<br>
>> which is missing on the Linux box.<br>
>><br>
>> file hi<br>
>> hi: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically<br>
>> linked, interpreter /linuxroot/lib64/ld-linux-x86-64.so.2, for GNU/Linux<br>
>> 3.2.0, not stripped<br>
>><br>
>> The only way I can make it work is to have actual<br>
>> /usr/lib/x86_64-linux-gnu/crti.o etc on my macOS box, which --sysroot is<br>
>> supposed to help avoid.<br>
>><br>
>> I'm sure I'm missing something simple here. I've been following the docs,<br>
>> but couldn't figure it out on my own.<br>
>><br>
>> Thanks!<br>
>><br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
>> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>><br>
<br>
>_______________________________________________<br>
>LLVM Developers mailing list<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br>
</blockquote></div>