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

    <tr>
        <th>Summary</th>
        <td>
            [Wasm] wasm-ld crashed when using `--emit-relocs`
        </td>
    </tr>

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

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

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

<pre>
    When compiling a C file that calls `malloc`, if `-Wl,-emit-relocs` is added, wasm-ld will report an error:

#0 0x000055f608fd22e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (.../bin/wasm-ld+0xf052e8)
 #1 0x000055f608fcfbfe llvm::sys::RunSignalHandlers() (.../bin/wasm-ld+0xf02bfe)
 #2 0x000055f608fd2ef5 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007fa79ec89420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x000055f6093e6d67 lld::wasm::LinkingSection::writeBody() (.../bin/wasm-ld+0x1319d67)
 #5 0x000055f6093d50ea lld::wasm::SyntheticSection::finalizeContents() Writer.cpp:0:0
 #6 0x000055f6093d0141 lld::wasm::(anonymous namespace)::Writer::run() Writer.cpp:0:0
 #7 0x000055f6093c11c1 lld::wasm::writeResult() (.../bin/wasm-ld+0x12f41c1)
 #8 0x000055f609399d1f lld::wasm::(anonymous namespace)::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>) Driver.cpp:0:0
 #9 0x000055f609395acf lld::wasm::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) (.../bin/wasm-ld+0x12c8acf)
#10 0x000055f608fd4d7f lld::unsafeLldMain(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, llvm::ArrayRef<lld::DriverDef>, bool) (.../bin/wasm-ld+0xf07d7f)

It appears that `createOptionalSymbols()` created `WasmSym::heapBase` and `WasmSym::heapEnd` with the `DefinedData` type, and leaves their `segment` fields as `nullptr`. However, `LinkingSection::writeBody()` does not check their `segment` fields before dereferencing them in `getOutputSegmentIndex()`, causing wasm-ld to crash.

Is this a bug or an expected behavior?


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVktv2zoT_TX0hrBBUe-FF4ldowVatKg_IMtgRI4sfqVIgaRi-_76C0pOGgdGk9uFHuAM55w5fMyA9-pgENckvyf5dgFj6KxbfwMn7A-r7Q-Fi8bK8_qhQ0OF7QellTlQoBvaKo00dBCoAK09JQXrQWsrSMEI31DVxqHlgyZ8s8RehaVDbYUnBaPKU5ASZfQ7gu-XWtKj0po6HKwLFAxF56wj6R1hW8Ke3zxllJ0YYyzP24JVreQcK6r1Ux9d0zt_9vPPD6dM2AcQv_7nQCDh1W8nB8dH64ND6AkvJq4mEF5TwqvVakX4rlGG8N2FGeH37NSynGNFeD0zoYSnyTUV0TYt3qLyczR7dTCgP4ORGp0nvHoXjTctXqHxt4ljm9OruIRXlzzmYb8Sw0DSOzY9L4HSS6CyhbJGUdUZZ_Tx0aEP1uGjC3Tit9OqIXx3qorHIltqZcbT8mDG2TCEziHIlbcrNhFOsoyzK77Za751ioUsSqq1nDWJyc5_X5X5pcxhjyIoay5WpwLeW3l-X6kkTWpZlFfQ-TW0zBnCLej92YQOgxJX4K0yoNU_uLEmoAnPq_UQObnbkhZvAFmSJbcACa_AWHPu7eipgR79MO3NejbPEJc9OpoPAJfXwCJJxE3gSdCf6EcdPiApb7NEJFeSVtdAdS2T9i8yjIuNbuvU03Oeehr5BpHFqyN65xycf2JL0o3owFFhjQ-E35H0U2Q_R7itSf2Gag7iJtWI_HHMDf3T_fEnW2Ot_v19R3lRgWhflI-XzNsLL5Plq3RG46HFr1r-NwX_PpubAC905nXZxsFPH8y5ZaUsX6U8vb8ECsOA4PxcYUjBhEMI-H2IBxX0_tw3Vl_OZqwos1lGzwfw_f58YdkhDPfgMfqAuW3_ZGQ0H1XoaOgw-myxVQblFgJEUzgPGPOJETTCE0ZeqFx09Xjo0YTo1irU0lOYiqEZtR6CIwVb0c_2iHHL8020fODKi9GkRU-NDVR0KH79CbDB1jqkEh226NCIWKNDhz1VJs44YPg-hmEM-3nqFyPx9AIUWQkYfZz0XIyDpcKB71ZXqxKzjqWbNuOBWjeV6dOAIgrfYAdPKpbs3es5C7lOZZ3WsMB1UtR5WpZlXSy6dYqybLKC1QyyDKu6EmmWZkWLVZNDmdQLteaMp6zmPGFJkRarGhNZ5E2aVJjxrGhIxrAHpVdxT66sOyyU9yOuizJJkoWGBrWfGhvODR7pZCScxz7HreOcZTMePMmYVj7431GCCnrqiOJGIfn2RZRJEZT0GJuhWa_Y4bxpbhaj0-suhGEq_3xH-O6gQjc2K2H7WD7jCZo_y8HZ_6MIhO8mdp7w3cT-3wAAAP__bGvf0Q">