<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">