<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126919>126919</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[WebAssembly] Huge symbol name section in debug build
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
stevenwdv
</td>
</tr>
</table>
<pre>
# Problem
I'm getting a huge (**10 GiB**) `name` section containing symbols in our WebAssembly build, and I don't know if this is a bug or not, since with native builds the section is much smaller (323 MiB for the full binary).
# More context
It's so big that `WasmObjectFile` cannot successfully parse it anymore: the section is 10 GiB, which does not fit in a uint32, which causes `LEB is outside Varuint32 range` when reading, which happens in a `llvm-objcopy` command executed at the very last step of linking. This happens with with 32-bit and 64-bit builds.
I first thought this was #58555, but it appears that that is a different issue, my issue happens here:
https://github.com/llvm/llvm-project/blob/560149b5e3c891c64899e9912e29467a69dc3a4c/llvm/lib/Object/WasmObjectFile.cpp#L305-L314
<details>
<summary>Stack trace using Debug build</summary>
```
$ ~/llvm-project/build/bin/llvm-objcopy cpp/pep/cli/pepcli.wasm cpp/pep/cli/pepcli-noproducers.wasm --remove-section=producers
LLVM ERROR: LEB is outside Varuint32 range
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /home/swdv/llvm-project/build/bin/llvm-objcopy cpp/pep/cli/pepcli.wasm cpp/pep/cli/pepcli.wasm --remove-section=producers
#0 0x00007e9a0cc06f31 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/swdv/llvm-project/llvm/lib/Support/Unix/Signals.inc:804:11
#1 0x00007e9a0cc0742b PrintStackTraceSignalHandler(void*) /home/swdv/llvm-project/llvm/lib/Support/Unix/Signals.inc:880:1
#2 0x00007e9a0cc05426 llvm::sys::RunSignalHandlers() /home/swdv/llvm-project/llvm/lib/Support/Signals.cpp:105:5
#3 0x00007e9a0cc07bed SignalHandler(int, siginfo_t*, void*) /home/swdv/llvm-project/llvm/lib/Support/Unix/Signals.inc:418:7
#4 0x00007e9a0c045330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#5 0x00007e9a0c09eb2c pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x9eb2c)
#6 0x00007e9a0c04527e raise (/lib/x86_64-linux-gnu/libc.so.6+0x4527e)
#7 0x00007e9a0c0288ff abort (/lib/x86_64-linux-gnu/libc.so.6+0x288ff)
#8 0x00007e9a0caca9b4 llvm::report_fatal_error(llvm::Twine const&, bool) /home/swdv/llvm-project/llvm/lib/Support/ErrorHandling.cpp:126:5
#9 0x00007e9a0caca822 /home/swdv/llvm-project/llvm/lib/Support/ErrorHandling.cpp:84:3
#10 0x00007e9a0d5b9699 readVaruint32(llvm::object::WasmObjectFile::ReadContext&) /home/swdv/llvm-project/llvm/lib/Object/WasmObjectFile.cpp:160:10
#11 0x00007e9a0d5b6602 readSection(llvm::object::WasmSection&, llvm::object::WasmObjectFile::ReadContext&, llvm::object::WasmSectionOrderChecker&) /home/swdv/llvm-project/llvm/lib/Object/WasmObjectFile.cpp:312:12
#12 0x00007e9a0d5b63d7 llvm::object::WasmObjectFile::WasmObjectFile(llvm::MemoryBufferRef, llvm::Error&) /home/swdv/llvm-project/llvm/lib/Object/WasmObjectFile.cpp:377:10
#13 0x00007e9a0d5c04d2 std::__detail::_MakeUniq<llvm::object::WasmObjectFile>::__single_object std::make_unique<llvm::object::WasmObjectFile, llvm::MemoryBufferRef&, llvm::Error&>(llvm::MemoryBufferRef&, llvm::Error&) /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:1070:34
#14 0x00007e9a0d5b5e2f llvm::object::ObjectFile::createWasmObjectFile(llvm::MemoryBufferRef) /home/swdv/llvm-project/llvm/lib/Object/WasmObjectFile.cpp:69:7
#15 0x00007e9a0d58fcbf llvm::object::ObjectFile::createObjectFile(llvm::MemoryBufferRef, llvm::file_magic, bool) /home/swdv/llvm-project/llvm/lib/Object/ObjectFile.cpp:203:12
#16 0x00007e9a0d5a1f50 llvm::object::SymbolicFile::createSymbolicFile(llvm::MemoryBufferRef, llvm::file_magic, llvm::LLVMContext*, bool) /home/swdv/llvm-project/llvm/lib/Object/SymbolicFile.cpp:71:12
#17 0x00007e9a0d400b65 llvm::object::createBinary(llvm::MemoryBufferRef, llvm::LLVMContext*, bool) /home/swdv/llvm-project/llvm/lib/Object/Binary.cpp:78:12
#18 0x00007e9a0d40106f llvm::object::createBinary(llvm::StringRef, llvm::LLVMContext*, bool) /home/swdv/llvm-project/llvm/lib/Object/Binary.cpp:117:8
#19 0x00005dbea7d09645 executeObjcopy(llvm::objcopy::ConfigManager&) /home/swdv/llvm-project/llvm/tools/llvm-objcopy/llvm-objcopy.cpp:173:10
#20 0x00005dbea7d08ee6 llvm_objcopy_main(int, char**, llvm::ToolContext const&) /home/swdv/llvm-project/llvm/tools/llvm-objcopy/llvm-objcopy.cpp:253:15
#21 0x00005dbea7d0d385 main /home/swdv/llvm-project/build/tools/llvm-objcopy/llvm-objcopy-driver.cpp:17:3
#22 0x00007e9a0c02a1ca (/lib/x86_64-linux-gnu/libc.so.6+0x2a1ca)
#23 0x00007e9a0c02a28b __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28b)
#24 0x00005dbea7cc2845 _start (/home/swdv/llvm-project/build/bin/llvm-objcopy+0x34845)
Aborted (core dumped)
```
</details>
It seems that the reading code is correct, see https://github.com/llvm/llvm-project/issues/58555#issuecomment-2651122107. However, my question is: how did this section get this large in the first place?
I'm compiling with Release versions of the libraries we use, but compiling our own code as Debug. In the `name` section I can see symbol names upwards of 20 MB. (These contain lots of templates and repeated expanded types, also containing type_traits stuff etc. We use [RxCpp](https://github.com/ReactiveX/RxCpp), which uses a lot of nested templates, causing large symbol names, so that contributes to the problem.) I found that a workaround is to use `--strip-all`.
Still, why is this a problem with WebAssembly, and not so much with native builds, which just produce builds of around 323 MiB instead of the 10 GiB we get with WebAssembly?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8WV1z27YS_TXwy440JEBS5IMfZMe6zUwyydhpe980ILiUUJMAC4CW_XJ_-x0AlPWROI3dtB6NTFLA4pyzC2C54NbKjUK8JPkVyd9d8NFttbm0Dh9Q7ZqHi1o3T5eEMvhsdN1hT5Lle0IXPWzQOak2wGE7bhAILQldErpME_iPvIrXhFZAikTxHkmRgEXhpFYgtHJcKt_bPvW17ixIBXo08DvWS2uxr7snqEfZNYReA1cNvIdGK0IXDu6V3oFswW2lBWmBQz1uQBtQ2vnWViqBsJNuC4o7-YDRkAW3xWcE0kI_ii3YnncdGo-eUQYf5RW02oSm7dh1UEvFzROh1ZwkS__xjbTBQAEfnVfDEbqwYDXUcgNuy52n_Du3_af6DxRuJbtAXnCltAM7CoHWeutPMHBjEaQDrp56bZCw5TnMvZzXsNtKsYVGo_VUoZXOq8ZhlMoxemgh-GjRehAfbq68CT06KxuE37iJbcFwtQmgdltUYJA3Um0OFrZ8GFDZaJ4USdc99DNd_yH08BSo6L73TsFHFKPDBrgLsB_QPEHHrQPrcADdQifVvVSbOXzx3trbDc4JX4zO6kC_gSILl9FZk9zvoZXGeuN63Gxd9PmOWyCU5WWe5x5zPbog4TAgNzZ6IHyF4Ghk26JB5W_tiL5D_xSvn_FsMUgfx9w6N1h_R1eErjbSbcd6LnRP6MrrMP2bDUZ77xK6qjtdE7rKiyTNqjpHJsoqFUVWVhVWVUqRVlmx4EXVCMYzcWRH-n4xSghdnYbMXAwDoewDS_LZB5ZmU_yx6wYdl50l7Cbe27HvfYyymzvHxT04wwXCaP3seod-bsSJxK4JXR0aT_aKZPr42M7gf9-gF6fhqpZq_-MUChAgrgb036KT8Vp0cr7jtn_x15nSg9HNKNDY2HI2M9jrB5xNcU_Yu-cWJFl--PDbR7i5vf106-fHXwR1svz84WZ5dwN2rHsfFmF5MDho48BpeLV7Q6hYQlchSqUS3dhgCHdhuN1CzcV90NzHbHRBM_ZDjKdkDuHvs9Ebw3vgZjP2qJxHAISutrpH75Zd8_AvKP9Davu5lUDymCRJssCKJ0IkRctSCPKwJWFL-2TjxWcjlQucv3gFCC0PjQzfrbV1BnlPaOHnnVQubAh_QftkdtyNg_ccoatflXz0D-RG8c7OpRKELcskI2yZphPu9Az3IqM1nIGMBn7hqunQEFo-aNnst6qfiaxMPLIJGD0Dlme0-Jagt6M6wWfDtvpmZHtIPiDYMk1ywpb5BImda1VjA-fiBJf5PXUjVavXLgh1Df-QZllaErZcTACzE4BJljOWxDRjsvZYFusim3VSjY-zjRrjD2Ju9bwg9Cp5DF0IrSaD-anBCmsqYHBbv_-t72XXvc566H-wXpzDpQsEw6XF14KmCzyYXZyapWXZtsBrv5q9ymzoeDBbnpjlgld1dhSQcb1ct9zxbo3GaHMyt7_spAo5kHXT3K617v5GONz4IULY-WxhCldaHIVrdQ64pPRnjlb6hYTFFC89Wf-avK6Kqgpp0vNucyKHjlt4uD5L_OKsRt5cTwmjl-uVMn0vQ2DLtAgLTTJBT8-gF0VCA_S7abX_HvDnNsGnbyf4vb7TGJ9Mg-Z6i-LeLzQ_WxSW0hBBkyj0XBTWLF5B7-zZsYIfsdfm6Wr0SeYttqfUb-LE-enkFotjj7NTciLJGgrWNRHDeh0TxunuI7_HX5X8k7DrH-N_szfjE8oO17HtwX7P73E9KvnniD9q80SjrwQsXtCQ3Xxf-Jf6Re1Ha54zqfn8WeiNEN9ePFO2b3j2NSWAPrMi9Cp8YuNaOp8lRinWgzPzbfDSwk9Plk3Oys4iMUfavhCJ51EoDHKHr4nFnxp1RTXtzZ5GfkqjbEX9OhpvmU6t7HDd840Ub95xnil-RY8m7HjFKE4J8rTNkxcI3oUShhTnFE-ev5Hk4bl_CXpeYpd_X4BjdJMEi_RYgZPEo8mSpC7yFxSIfK-mWsmPMv3ZjOL4ey7lMZfyjEuaFC-F64tc7pyRavPvskhTv9KXE4t9CpQ3NfJFk1RFlu9rMJ-m6szZ7h6ehZtrrVq5-cgV37x2w3Vad_bsDfTsdo93wY52JpqcAS4R41vPeuq27rlfkfevGWLLzb5weKzxF627SeOjpPMfwE_zgD-f8Kdn-BtW5uAh__Cr-w8MPWuMfEDzrOAhDaX0LPfnqeCvzPp9l5j1e4Ps3CAta1ivfZ-1ddy49cTuVUPQsj4MkZ1oJgQtsxyi8cnuG2seYTCWlVkeB1v6dyBsvFGhDYaiCzYTkOOyVih8nVbNkuV7Bxaxfy4X4r4KCkI3CNKC0MYETNe-5d-oG02FShYeCN33qNyMFnmaUpomizn8onf44CdlKE3-OaKdir-ELWGrd9DIJpY-93XhDU610I6bDYJUsWIdaqVDxwUStpp4hlq90P0g_ctOrLreYofchnqtlVpZ0G0w0MnacCPRwg5htLivrh6669GA3qkoErexwDiH9xHAN0r970FwFQSMlX7wDSyMw46bJgxME_h4Nfdu_LJFi_vDAei0i8CwHzru0Ib6m8HBr88N4OPAVYMNuKfBy3wNvLP6-GjB_7B2hktnwbqxbQGdmMPvgRqQ_Or28XoYSP6O0PI73r1FLpx8wP_669CDVodSeSi1cw_WY1VoPbZnyGFR47EWG111rEIILR0j0OM2sh49T6eDmkM8cJn7le49tHpUTWzLYafNPTfhiQztA6Mimc2sM3KY8a4jRTIV0e-c7LqI-Ck034bC-GQ-RsTRucv-xCUcVuh4TPL1acpBgT9GH3SxgLg_atEtTPD2pypSWYe82UdaPNXwYeZD-SsIbHXRXLKmYhW_wMt0wSq2SLMkv9helrQok1KwNmVFmeW0XYgyqRasbaoKWcsu5CVNaJ7QlKZZxmg-b0TZLmglkiqteZklJEuw57Kb-wk712ZzEWbmZUqLKq0uOl5jZ8N5GKUKd_tzA0rydxfmMszyetxYkiWdtM4ezDjpunCQdkwlfwe_jKeOPxzvKGgOFfqL0XSXb19mJvgPl_T_AQAA__9CbdRW">