<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57207>57207</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            LLD selects symbol from later dynamic library over earlier archive, for LTO-generated libcall
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          rprichard
      </td>
    </tr>
</table>

<pre>
    On Android, both the builtins archive and libc.so expose `__aeabi_uidiv`. Normally, when generating a shared library, LLD links `__aeabi_uidiv` from the builtins archive because it comes first on the linker command-line. However, when the only reference to `__aeabi_uidiv` results from LTO code generation, then the linker instead prefers the `__aeabi_uidiv` from libc.so. Is this inconsistency by design?

See https://gist.github.com/rprichard/744ec9488cff0a39059bcf2ad3e73cda#file-demo1-sh, or Google-internal issue http://b/241259844. (Weird things also happen if the `__aeabi_uidiv` in the builtins archive is LLVM bitcode. See demo2.sh on the gist.)

```
llvm=/x/clang14

cc="$llvm/bin/clang -target armv7a-linux-androideabi32"
ar=$llvm/bin/llvm-ar
readelf=$llvm/bin/llvm-readelf

cat >mylibc.c <<EOF
  unsigned int __aeabi_uidiv(unsigned int x, unsigned int y) {
    return 42; // approximation
  }
EOF

$cc mylibc.c -fpic -c
rm -f mybuiltins.a && $ar rcs mybuiltins.a mylibc.o
$cc mylibc.o -nostdlib -fpic -shared -fuse-ld=lld -o libmylibc.so

cat >somelib.c <<EOF
  unsigned long long __aeabi_uidiv(unsigned int x, unsigned int y);
  unsigned long long foo(unsigned int x, unsigned int y) {
    #if defined(IMPLICIT)
    return x / y;
    #elif defined(EXPLICIT)
    return __aeabi_uidiv(x, y);
    #else
    #error must define IMPLICIT or EXPLICIT
    #endif
  }
EOF

for src in EXPLICIT IMPLICIT; do
  for lto in "" -flto -flto=thin; do
    echo "### Compile flags: -D$src $lto"
    $cc -O2 -nostdlib -fuse-ld=lld somelib.c -fpic -shared -o libsomelib.so mybuiltins.a libmylibc.so -D$src $lto
    ($readelf -s libsomelib.so | grep __aeabi_uidiv) || true
    echo
  done
done
```

Output:
```
### Compile flags: -DEXPLICIT 
     2: 000011c0    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv
    11: 000011c0    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv

### Compile flags: -DEXPLICIT -flto
     2: 000011bc    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv
    11: 000011bc    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv

### Compile flags: -DEXPLICIT -flto=thin
     2: 000011bc    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv
    11: 000011bc    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv

### Compile flags: -DIMPLICIT 
     2: 000011d0    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv
    11: 000011d0    24 FUNC    GLOBAL DEFAULT     6 __aeabi_uidiv

### Compile flags: -DIMPLICIT -flto
     1: 00000000     0 FUNC    GLOBAL DEFAULT   UND __aeabi_uidiv
     9: 00000000     0 FUNC    GLOBAL DEFAULT   UND __aeabi_uidiv

### Compile flags: -DIMPLICIT -flto=thin
     1: 00000000     0 FUNC    GLOBAL DEFAULT   UND __aeabi_uidiv
     9: 00000000     0 FUNC    GLOBAL DEFAULT   UND __aeabi_uidiv
```

`__aeabi_uidiv` is linked from the archive either when (a) the `__aeabi_uidiv` call is explicit in the source (so LTO notices it early on?), or (b) when LTO is turned off.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVV19zozYQ_zT4ZQcGBDb2gx8SO7lmxnfpTHNt326EELZaIXkkyMXfvisBjvHZ10kmD60HA9KufvtXi7bQ5WH5qOBGlUaLMiArKHSzg2bHoWiFbISyQA3biWcOVJUgRcEiq4G_7LXlEMzib98op4X41opSPOM4gi_a1FTKg0P7vuMKtlxxQxFrCxTsjhrugQw1nmezWeNQ_W0vwUFldH1Zn4Iz2qISogGma26hEsY2oJVnd4jcOEqNioc45BH8or_zZ26OmjlGreQBDK-44YpxaPRFNQy3rWxsp87m6RGBS360TCsH2QyQvWxUtuG0hL1Ht5501cTesxE8OEZhcTXTygqEUOwAxQFKbsVWBel9EK-D-Ka7_8Y57Jpmb4P0JiD3eG1xSbQVza4tIrQeZ8zeCIZux_je51nG2SKbz1lVxTRdxNNFwSpCy5TnKStpQNJKSB6WvNZJaHfOLm3gk9ZbnBWq4UZRCcLathN8lFvgn2QJmS7mWRZBQOZ_cGFKZ4zaYtQkps2O7vfoI1Fd9YVQl4ONDtlsfv8MhWic5yNwhjslSWR3Q8y96QFZnDoIQfvLD6V8roN0jbq-4J9JqrZJdsrPmCeTgGSeFw0TamCFsKFmyxtUq37Oqcuq9iWk3e5xhqTELfVA1HigMYobhEjxHAaTg8vqGttAPlWONhCkd_XBZwvD9xVed499SgC0yuUI7i-MFIydS-Yj4ouL7GgGN-MCgvx2wAJM-qY1CjISpLfQRRkwgka_iLrL-p41yNfd61GV_k4yxuCobljtBd5Zb36NE0gcYh1RlDHDCx8ZNWCYHVN7HH0BW0OotG1KHAxS-kITVlgjQlmil6XEoXY7rV9l9QXnWqwlSP2pd6XGXPC3d_gYnfkTwErr94QK9y3uqpJXWOdwn88fPv-6eVg9PB13w0k8X1wsESMdr0erTxHu_ryOcG611_DMth7T8vGEMVhO6hYLdScKBk1dmTnKHC1Rpaj-LdMqXG0Nc_VjADkiu-wt9YDgOCVWeeT025xgirixv2OWuHo1XgHA2U533Gl3wUrXe6yTUEm6dbUXQreJnQZuLyPQUAY6I1yqho9klKWjvHzNurP09fk6ULGEjnbEaSr_oMGJ-DlO9eUEkc8Qg3wFW8P351F1GbZyxMa0fOyLYVRq1VNe384Kbnd_bJt927hvxUWen7n1GM5XFYA4Uoy_JGGxn8jg_uuXlXv9tHm8vdnA-u7-5uvmybPPzkw7AiXJBwC9xYYuyS4aUrAPMuTdQG83pN8t_197jsXnsg3lRyXXu4HeYsN5ch3lu5-fia_L__plfc0QWHwA0NsN-SG5_lv2XCpzF0-0tusHytdWZjjUcjylY5_gWxEs0tTV3GsHY4YtlcPCzksKhj1Pf1K2ujXYtuByLOWuMVG6EQy7IWTh1GBvo33PgN_m7iiPnIUT5KW6BQjqPuqooK6qqDNkwpfJbBbn82wex5NymZaLdEEnjWgkX7qGzXLJGfZD9lAXWvYtDMXuAMqDojV-wfoODzQ2XF4Tgc_ecqeK-w6j-LDvobqe0Fk5aY1cnvc0J-1Mf1L2Z2Q8i_6FeuDQdyQWX6Y5ifPJbrkgCaeLsqI0m1VVUfFFMsuKKZtRkqfFPJ9IWuDxZBlMb4PpeiKWJCYknifzOIln6SJKKjLPE5aTfJpO-SwNspjXVMjICY602U7M0utQtJjAWSyx-bCvRGr9eY0P-LRtdtosj73YxCu89Nr-A41Vk5s">