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

    <tr>
        <th>Summary</th>
        <td>
            BOLT triggers assert with mold's synthetic $plt symbol
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    We're trying out BOLT compatibility at https://github.com/rui314/mold/issues/789. During testing we discovered the following assert:
```
llvm-bolt: /home/ishitatsuyuki/llvm-project/bolt/lib/Core/BinaryContext.cpp:753: llvm::bolt::BinaryFunction *llvm::bolt::BinaryContext::createBinaryFunction(const std::string &, llvm::bolt::BinarySection &, uint64_t, uint64_t, uint64_t, uint16_t): Assertion `Result.second == true && "unexpected duplicate function"' failed.
 #0 0x000055839b75737a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/ishitatsuyuki/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x000055839b75752b PrintStackTraceSignalHandler(void*) /home/ishitatsuyuki/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x000055839b755b76 llvm::sys::RunSignalHandlers() /home/ishitatsuyuki/llvm-project/llvm/lib/Support/Signals.cpp:104:5
 #3 0x000055839b757c55 SignalHandler(int) /home/ishitatsuyuki/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007fded65a2520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #5 0x00007fded65f6a7c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007fded65f6a7c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #7 0x00007fded65f6a7c pthread_kill ./nptl/pthread_kill.c:89:10
 #8 0x00007fded65a2476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #9 0x00007fded65887f3 abort ./stdlib/abort.c:81:7
#10 0x00007fded658871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007fded6599e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#12 0x000055839d0e9105 llvm::bolt::BinaryContext::createBinaryFunction(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, llvm::bolt::BinarySection&, unsigned long, unsigned long, unsigned long, unsigned short) /home/ishitatsuyuki/llvm-project/bolt/lib/Core/BinaryContext.cpp:754:32
#13 0x000055839b872746 llvm::bolt::RewriteInstance::createPLTBinaryFunction(unsigned long, unsigned long, unsigned long) /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:1268:6
#14 0x000055839b873002 llvm::bolt::RewriteInstance::disassemblePLTSectionX86(llvm::bolt::BinarySection&, unsigned long) /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:1386:3
#15 0x000055839b873220 llvm::bolt::RewriteInstance::disassemblePLT()::$_9::operator()(llvm::bolt::BinarySection&, unsigned long) const /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:1394:3
#16 0x000055839b871838 llvm::bolt::RewriteInstance::disassemblePLT() /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:1401:5
#17 0x000055839b86c4dc llvm::bolt::RewriteInstance::discoverFileObjects() /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:1173:3
#18 0x000055839b868952 llvm::bolt::RewriteInstance::run() /home/ishitatsuyuki/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:720:3
#19 0x000055839ac9b76b main /home/ishitatsuyuki/llvm-project/bolt/tools/driver/llvm-bolt.cpp:244:17
#20 0x00007fded6589d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#21 0x00007fded6589e40 call_init ./csu/../csu/libc-start.c:128:20
#22 0x00007fded6589e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#23 0x000055839ac9a6d5 _start (./build/bin/llvm-bolt+0x2326d5)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ./build/bin/llvm-bolt -instrument /home/ishitatsuyuki/rust/obj/build/x86_64-unknown-linux-gnu/llvm/build/lib/libLLVM-15-rust-1.66.0-nightly.so -o /tmp/out.so
```

It looks like BOLT apparently doesn't like the synthetic PLT symbols mold creates (https://github.com/rui314/mold/commit/a7f1e20594ac6f86982ae22979e58f8fcf810900 for implementation). The symbols are synthesized to ease looking at the disassembly, and looks like this:
```
    29: 0000000000001540     0 FUNC    LOCAL  DEFAULT   15 puts$plt
    30: 0000000000001550     0 FUNC    LOCAL  DEFAULT   16 __cxa_finalize$pltgot
    31: 0000000000002890     0 OBJECT  LOCAL  DEFAULT   23 __gmon_start__$got
    32: 0000000000002898     0 OBJECT  LOCAL  DEFAULT   23 _ITM_deregisterTMCloneTable$got
    33: 00000000000028a0     0 OBJECT  LOCAL  DEFAULT   23 _ITM_registerTMCloneTable$got
    34: 00000000000028a8     0 OBJECT  LOCAL  DEFAULT   23 __cxa_finalize$got
    35: 00000000000028b0     0 OBJECT  LOCAL  DEFAULT   23 __libc_start_main$got
```

To my understanding the mere existence of these local symbols should not prevent BOLT from functioning correctly, so we would like to get this fixed on BOLT side. However, if there's a legitimate reason that these symbols might affect BOLT's operation, we would be more than happy to consider other options to work around this in mold.

(cc @rui314)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1WNuS4ygS_RrXC2GFhO4PfqhrTG9Ub3d0V-_OmwJJyGZKEg5AbXu_fjLBN7k8NXbPlsNhIwSHk5nkBUpZb2b_5ROaKk6M2oh-TuRgyN2X5xdSyW7JjChFK8yGMEMWxiz1JLyd0Cf4zoVZDKUHo-BBDSIMImh0sq3hT2g9cA2NNMs98jAoRDZcG_xfcVILXcmfXPGamAUnjWxbucJ3TGuuDC7iP0z820nib7_2sW1_dtNStjiAAPpCdtyuthCGGT1shlcBz3bYUsk_eGXg0U6AXlHC771UOOVO9Ext7mVv-Np41XIJiGkcIi7ORgLh7XYl-LrhT0NfGSF7WPr2r0dtQV1XpTgzfDx9QrNK9toQbWo3ShuroAlNJvT-HQLf-W59O3AQvUmiwvxdO0iwnaNwt1a_FiPxv3E9tMbTHOjUZBI-wBe2wcDdAgn80aHn6yUsC5aqh2UrKhCHNHtJKOwd0jDR8tpzNoJJoU_8tQ-fOM7CvEzjNEzZkVh6o13jK4htvhtWvb4oVoFdssMgxVaFBMVw1m3FhbEgxeV2t1g7u38flkupsPtHL9bYIeY9a7Un-gpWixNUTxAcZAhOZYhpSU4IO4zfWF-3XAH7n1LA7r_9MJZJmCDLA0l6QjIu0-Scor8N_YgruGb2_2C5o-ccKPAjVOWBXniqwyqOyanSPtKskZ-OFRZtGaVNzeskZjSmPrHK2AKus6RIomkr-mE9nfeDe1F5WnqwCe_8dYRT0Jv2mPEYs0lYWpGiWJoFbN66eBVtW4hu2fKO9yAXOp8HsP3StPB3PMyznFGJaXLATy7Bh5ijQPB3kdPMGumAnJ5DPp72LlyWn8Blp8qNYDfOtbWIRXJNaHj2aaNrvsQssZTaGk8xobnFpmi3Ix3kY-gsS5uQsBJM74BN7cxnuxy7ACXephFwZ_8NQlCSom-LVoJQteyYcHYBVSJF7O70HOKdhQuCFCnlB8BgDJjnPE-u20ohTtlvJcQc-XPt8zzw43fywSWpZp9kiqJar4Ngi8S0qAqXdybhfbVgCkPsfjB2FAbsYfTudfg4GsEgZYNypDp6Hz4Sm9kuTWS7PNbjxoAM00pgc12HXlj3vyJ-XF4OoCOG9GCdcTjLUppGyVkhv_GVEoZ_AlWwHvLakX2-Pr-8MdHV8v-qtFteh9aO4S6A0yQ7-B2KHJ2IHPo-vVxkKPOwoOvKFuXeGv33LBkl-qv2xodJHmaYWsOD5PGp5BQyxS9K7rKtezOhUbFtyiVX1oPc63-gFFdPfpRq8mismuRENUEGof8fqeajqEd-cKhIkHo6pp5UUV1dRd0eW56g3v1SIqOrC6nr-AdpOFZ9dsI_y-Mr_FEN_YfyTaEyGtHNj-myCmrApCQ2015LwEjZYqlQK_ETy8an_Vlwuza1dVNwyPj0NOPnde5D3YQ5GDIfU6aoIIkV-8Rf6eFtabItfs5N8ha4t2xNdYiYNDhdlUc-sXNEL8zpQq6J6FOL7moNiqDUP4DSc6AjUc5JcRY8TPORS9DwxEYsqWPiULGcQaByEPZYX4r-WPO2iAEEmLCvYr4-P95-fyR6KDuQlpFymBPFsUYnRr53hbAr68fW318kEDgvwAmwaoea2zuDSjG9ICUcxQwexbanT3s2g5Nqh1vCdfkesZ-vSs4V6whT8wErceRB3pGOTAXsbmXHvrNd1YD1zpMs_ziC2pZ-Q__ay1U_LgGdnLuRzrHg9_n5P5-nQTxFvGngJYnnT3sxX5h2AxUjmUrkYEAuWGuAQ7s8e0Pifj8ZyAzyVZNWvHJ3m8OWS6ZAknZDask1SJoa9xqVqTc9_BlREQjJ8NSBAjTByxziyhaNW-GKCyDoBftjQZ42Aad-nEesSposyTPKOKV5mvM4a7KmarLAz32fNFKR8SkJ9pRHXiw7xwcE2DLV4n94dSQJZ5pbWe3lkbHCHBLMBpMlbpwjbZiF0Pu9caI93CbunsQ_-gQxOBt-fPL049_32Hr-cn_7TMjD49PtD1AYIVAuLAfMBtES_GIPFvpvweK_B0sIFuusaCD3tyCqg53LY-TgFJlm-Q75y92_Hu9fziCDsxfFvJP9NmoUgDyGpWdgs0tgP718Lmqu-FxoOIq-fL6H2oS_MMjyb9YI367BLqKOa1y0QnRmhYukOFX7GDZ-C1tepvOTSH2MfNaDXyTpNlDngUYxw9b2_hT2dgcaJnyNGoC0S2SDvdYFIMXsHQUORQO4bi8NWSr-EwOYDQKNkt3-8g4hK6kUBFrnKBBlVpys7FTnKpLMubEeQxqxBo-TvQPSouYe-U2uuE3G90RYIniWSsFPSQtGMqLDu0IIHxqmmYXzTn1w5w6jG2FNAwwsrJ3simLr_vcHPiWILvGSesF6soBgtkF2WPYCE0UkLg5TcZ7GNyupXiFeSNCg4w_ZEUOTd6xkvIityCTyd9Erv-GzIEkSOAbFSX5Tz8I6h5x4Y4Rp-cxKDifm-RyMsr2pJiuIgsQFPSB_iKPOZbey3gyqnf167ouzKM9uFrMgSFjZRFGY535S8SatqyROEujNk5BRdtOykrd6NonvJpT2fEUsBN7Sxg83YkZ9SgOf-gGlNMq9LGuipMpqP6qi3K9CUASHzdl6yMOTan6jZi4bDnMNL1vYdfrwEhSAhxBulwN8Nhg4i89G-fHGEphZAf4EdGGLLA">