<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140465>140465</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLD is unable to link musl for x32
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld:ELF
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alexrp
</td>
</tr>
</table>
<pre>
Repro:
```console
$ git clone https://git.musl-libc.org/git/musl
$ cd musl
$ ./configure --prefix=$PWD/build/x32 --target=x86_64-linux-muslx32 AR="llvm-ar" CC="clang" RANLIB="llvm-ranlib" CFLAGS="--target=x86_64-linux-muslx32 -fuse-ld=lld"
$ make -j$(nproc)
```
You should see link errors like this:
```
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/exit/atexit.lo
>>> referenced by atexit.c
>>> obj/src/exit/atexit.lo:(__atexit_lockptr)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/linux/membarrier.lo
>>> referenced by membarrier.c
>>> obj/src/linux/membarrier.lo:(.data.rel.ro..L__const.__membarrier.sa+0x0)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/c_locale.lo
>>> referenced by c_locale.c
>>> obj/src/locale/c_locale.lo:(__c_dot_utf8)
ld.lld: error: relocation R_X86_64_32 cannot be used against symbol '__c_dot_utf8'; recompile with -fPIC
>>> defined in obj/src/locale/c_locale.lo
>>> referenced by c_locale.c
>>> obj/src/locale/c_locale.lo:(__c_dot_utf8_locale)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/dcngettext.lo
>>> referenced by dcngettext.c
>>> obj/src/locale/dcngettext.lo:(__gettext_lockptr)
ld.lld: error: relocation R_X86_64_32 cannot be used against symbol '__locale_lock'; recompile with -fPIC
>>> defined in obj/src/locale/locale_map.lo
>>> referenced by locale_map.c
>>> obj/src/locale/locale_map.lo:(__locale_lockptr)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/malloc/lite_malloc.lo
>>> referenced by lite_malloc.c
>>> obj/src/malloc/lite_malloc.lo:(__bump_lockptr)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in obj/src/locale/localeconv.lo
>>> referenced by localeconv.c
>>> obj/src/locale/localeconv.lo:(posix_lconv)
```
In case it's helpful:
```console
❯ llvm-readelf -sr obj/src/locale/localeconv.lo
Relocation section '.rela.text.localeconv' at offset 0x10c contains 1 entries:
Offset Info Type Sym. Value Symbol's Name + Addend
00000002 00000402 R_X86_64_PC32 00000000 .data.rel.ro.posix_lconv - 4
Relocation section '.rela.data.rel.ro.posix_lconv' at offset 0x118 contains 10 entries:
Offset Info Type Sym. Value Symbol's Name + Addend
00000000 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 0
00000004 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000008 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
0000000c 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000010 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000014 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000018 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
0000001c 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000020 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
00000024 0000030a R_X86_64_32 00000000 .rodata.str1.1 + 2
Symbol table '.symtab' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS localeconv.c
2: 00000000 56 OBJECT LOCAL DEFAULT 6 posix_lconv
3: 00000000 0 SECTION LOCAL DEFAULT 5 .rodata.str1.1
4: 00000000 0 SECTION LOCAL DEFAULT 6 .data.rel.ro.posix_lconv
5: 00000000 7 FUNC GLOBAL DEFAULT 3 localeconv
```
I'm labeling this as an LLD bug, but for all I know it could be an LLVM backend bug too; please relabel if needed.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsmV1vozwWxz-Nc3MURAx5u8hFXsqjrrJp1XZmd64iYw6Jp8aObNNJ99OvDLQlbabt7ESrzm4REsSc8_fxzz42wcxasVGIE9Kfkf6iw0q31WbCJO7NrpPq7H5yhTujSTQlYXUOwvrkWlkt0RfRGDbCAZdaIWyd21lvThNCk41wQVFa2ZUi5YE2m7qM0MSXNs48g9avgNCEa5WLTWkQut2dwVzsSbQgNL78x4LQJC2FzAhN9hGFbtcxs0FHosV-NFgP4q4Uqtx3vaB_Pr2qPKmUd0WXGUIpzOd1EZdMbXzB1XS1PJ-17AxTUqSVbbKc_nVdP3qrqm5eWuzKjEQL6eOjTYMKdovQ_U5oTOhI7YzmhI7bKGuy33QJdqtLmYFFBCnULaAx2liQ4hbBbYV92Q0knMos8PVF09rc3xiUmjMntIKr9T-rYNcRBc6U0g5ShNJiBmzDhLIOvK0Ee1-kWpJoBga5LnZCIvwQbgvd_PJ87uuMzuoTMsyFwgyEAp1-JzSxhhOa4L7qWeb8TSD1gY_BHA0qjhmk99DY8AOTw-NVZT--Rut1XbCWmt_unGmwfiAi1QDxgx2LlBkj0LyOpWX3XjTHq6j4BBlzLDAoA6ODYLle-5x1wXrdsrWM0Fm4Dz8gO6-DfjJY17evo3u0eje4Y_rNuOLrTLt16fLR6bjURIDQ4aH-8M-HtH4w-7BjKONqg87h_o15qWX3y4gO62ggNSWnn6Law6kOoarjVOOpkSzY7nVgLbtfBnZYRwOs1ZaPOaUfRs-1unsPocruPyT0UEdFaKet2K-lL_uE8wnnfwVOwaTU9fuM81OC__UGnZbhe_H8rJZm7knLYvc58_yR4-cTziecTzifcP6_4Rx-UTpXwJlFEI7QoYUtyl1eylc_5Z1RMl6QaQL1dzBkGcocuta8s-Hh9OqpKyzy6kroMDAoWdD8N3rwIXQIzIHOc4sOwn0v5MC1cr6XoAeonBHYfPOCi9rKH-cq1_56c7_DZ-jg-r4I4CuTJVb3vod921esQCB0BtMsQ5WRcBrWBwWornFIn4bO5TyiT5KNZQgAB19UWvihC_Hbzf-J8wsMvVELQ_jf4RA27YxCdpBCcJyD0VVjrDO9oFcJhk9a8e9q0Set0Qm1-Om0er_Nq6V1Ql69E_LqnZAXPSEvehJeJJzWeQGOpRKrLLX3hWOpz8fH_Bs8Sz-AVVn4JQfgMb3Ev_AxB2dCZf6RsE0kq2xfZV3tDBB651Z4ACGsLm6-XZ4BLC_m0yXA4iyZflneAMCX1eLBr3fELzlfVmvHC7_p7Pr5YlO50Oci_QFczP52Nr85IgIwgPY01WhERwK5PpvfnF-sjmn0n3XAg0z8azKDn869D4L9F4JDSL6s5v7ur-XFbLo8EIxagI4snYQOC5AsRSnUptp7AWaBKVguF5CWG0LnkJYOcm2ASQnncKv0DxAOeLWFk2Jt_PXvkDJ-iyrzXuC09m8cO4l-YfarQooSRA4KMcMs6GSTKBtHY9bBSW8YD_vjXhyPOtvJGMecD8Ihj0PkGe_TmPJRxvuDfh6lrJ93xISGtB_2e6PeKIzDUTCOx3ka0zBGmvJeOCJxiAUTMvBLe6DNpiOsLXHSi8N40O9UkdhqH5DS-v3qbJkQSkl_0TGT6n0gLTeWxKEU1tknGSecxInnIiyUqsomp-sNrKK0smK0j2inNHLyYntwW6YB14V_mZB3D5fuzujvyB2hSRWkJTRp4ryb0H8HAAD__xiwodg">