<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60949>60949</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
14.0.6 llvm-ranlib: crash when called on emscripten .a file produced by GHC's new JS backend
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
sternenseemann
</td>
</tr>
</table>
<pre>
When compiling just about any Haskell library using GHC's new JS backend which involves creating an `ar` file, `llvm-ranlib` is called (via emscripten's `emranlib`), triggering the following crash:
```
LLVM ERROR: malformed uleb128, extends past end
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib test.a
#0 0x00007f808df7afe4 PrintStackTraceSignalHandler(void*) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0xeaefe4)
#1 0x00007f808df7866b SignalHandler(int) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0xeac66b)
#2 0x00007f808cbe0bf0 __restore_rt (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x3dbf0)
#3 0x00007f808cc2dbc7 __pthread_kill_implementation (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x8abc7)
#4 0x00007f808cbe0b46 gsignal (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x3db46)
#5 0x00007f808cbcb4b5 abort (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x284b5)
#6 0x00007f808de80314 llvm::report_fatal_error(llvm::Twine const&, bool) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0xdb4314)
#7 0x00007f808de8046a (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0xdb446a)
#8 0x00007f808fc1ffd1 readULEB128(llvm::object::WasmObjectFile::ReadContext&) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2b53fd1)
#9 0x00007f808fc2efd7 llvm::object::WasmObjectFile::WasmObjectFile(llvm::MemoryBufferRef, llvm::Error&) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2b62fd7)
#10 0x00007f808fc2f442 llvm::object::ObjectFile::createWasmObjectFile(llvm::MemoryBufferRef) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2b63442)
#11 0x00007f808fc13fbe llvm::object::ObjectFile::createObjectFile(llvm::MemoryBufferRef, llvm::file_magic, bool) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2b47fbe)
#12 0x00007f808fc17879 llvm::object::SymbolicFile::createSymbolicFile(llvm::MemoryBufferRef, llvm::file_magic, llvm::LLVMContext*, bool) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2b4b879)
#13 0x00007f808fb79066 llvm::writeArchiveToStream(llvm::raw_ostream&, llvm::ArrayRef<llvm::NewArchiveMember>, bool, llvm::object::Archive::Kind, bool, bool) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2aad066)
#14 0x00007f808fb7b29f llvm::writeArchive(llvm::StringRef, llvm::ArrayRef<llvm::NewArchiveMember>, bool, llvm::object::Archive::Kind, bool, bool, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >) (/nix/store/338k2wvhmwgkw3ipqd8f9rrym4sg1ipj-llvm-14.0.6-lib/lib/libLLVM-14.so+0x2aaf29f)
#15 0x000000000040c1bc performWriteOperation(ArchiveOperation, llvm::object::Archive*, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, std::vector<llvm::NewArchiveMember, std::allocator<llvm::NewArchiveMember> >*) (/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib+0x40c1bc)
#16 0x000000000040e96d performOperation(ArchiveOperation, llvm::object::Archive*, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, std::vector<llvm::NewArchiveMember, std::allocator<llvm::NewArchiveMember> >*) (/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib+0x40e96d)
#17 0x000000000040eb13 performOperation(ArchiveOperation, std::vector<llvm::NewArchiveMember, std::allocator<llvm::NewArchiveMember> >*) (/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib+0x40eb13)
#18 0x0000000000406a5c main (/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib+0x406a5c)
#19 0x00007f808cbcc24e __libc_start_call_main (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x2924e)
#20 0x00007f808cbcc309 __libc_start_main@GLIBC_2.2.5 (/nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6+0x29309)
#21 0x0000000000407d75 _start (/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib+0x407d75)
```
`emranlib` is just a wrapper around `llvm-ranlib` that transparently passes through all arguments to `llvm-ranlib`. `/nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib` is just a symlink to normal `llvm-ranlib` 14.0.6:
```console
> realpath /nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib
/nix/store/p8wpdbr2m12ydclalh33sf8mlygxgh11-llvm-14.0.6/bin/llvm-ar
> /nix/store/b4z1yykly634q6ric5d3w6162slxzrbf-emscripten-llvm-3.1.24/bin/llvm-ranlib --version
LLVM (http://llvm.org/):
LLVM version 14.0.6
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: skylake
```
It should be easy to reproduce the crash by running on `llvm-ranlib` on the [archive file produced by GHC](https://sterni.lv/tmp/repro-ranlib-crash.a.tar.gz) (had to upload externally due to GitHub's file size limit) by just executing `llvm-ranlib repro-ranlib-crash.a`.
<details>
<summary>Reproducing this using just GHC</summary>
1. You need to build GHC as a cross-compiler for `javascript-unknown-ghcjs` (for older revisions `js-unknown-ghcjs`) – using LLVM 14.0.6 of course. [Build instructions are available upstream](https://gitlab.haskell.org/ghc/ghc/-/wikis/javascript-backend). I used GHC revision `a203ad854ffee802e6bf0aca26e6c9a99bec3865`.
If you want to use Nix, you can checkout `e23efa222d1d7af7fa4380a392afd359f9e5116c` of [my nixpkgs fork](https://github.com/sternenseemann/nixpkgs/tree/e23efa222d1d7af7fa4380a392afd359f9e5116c) and build `nix-build -A pkgsCross.ghcjs.buildPackages.haskell.compiler.ghcHEAD`.
2. Create the following `Test.hs`:
module Test (test) where
test x = x + 41
3. Run `javascript-unknown-ghcjs-ghc -outputdir build/ -v -o repro-ranlib-crash.a --make -staticlib Test.hs`. You should see the crash already.
4. You can reproduce the crash again by running `llvm-ranlib repro-ranlib-crash.a`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWV9v27iy_zTKy8CCRMmy9JCHxI3b3tvdFkn3Lu6TQVEjiTFFqiRlx_30B6Sc2HKT3e5ikwMcHKNQI2pI_uY3f_hnqDG8kYiXwfw6mL-7oINtlb40FrVEaRA7KuVFqar95e8tSmCq67ngsoH7wVigpRosULmHD9RsUAgQvNRU72EwTuj9h2VAFgYk7uB_7qCkbIOygl3LWQtcbpXYogGmkVonTiUEWUR1kEVQc4EBWboGIbbdTFMpeOm-cAOMCoEVBCTfcgrYGaZ5b1H6yYIswu5JPCCFG8Zq3jSo3Sy2RaiVEGrn3pimpg2SqyB6F0SPzyw6_POvnz793y9wc3v7-TZIrqCjola6wwoGgWVMcjc8PliUlYGeGgsoq7Hjl083V3c3YIay4xYolEMDGnulLVgFrbW9cTOTVUBWDbftUIZMdQFZOY0P_816re6R2YCsuDEDmoCsgMoKuGRiqNCr45Xw9FpNGYbj9HeWsg1UQ9c_6ReFQVR80arRtAOqm6FDaR0ICMhK8oeArIxVGgOyKtPv8X6_EfssSb9lmrN5leyyOCNGPHzXZT070j7zQJMwDknqenL5CH40A1g0NqQjBAhIEkH0EEVRtKjzKK_qBa0xhS-aS-sxf3VK3PFGUvGBykqgdpZWvArIVUAKZ_cf4CZJviG7bdvtms0u4f23Kq8LrfddapqY9_cjxjgNozCbOdcgq6enM7D7ZFRArqMHpFhj6hznCXB8BjjPshLOEXJp3wQdy7Jygo6comMlRmUdwXqt0U-_1vZZTOLb96ztqjzb8l2e1MU3IQjv88V9Wy76mLazRvCSzUiYzGfEG_YJEguNCjMPJ6nKOpqgSSZoGKlKtoD1uretRlqtN1yINe96gc73qOVKviK8nJZsMYGX_kBWmkFjvC1fl6c0mwCZT4GwMi3nLqO-qrlInpbzCYxs4tqYR0mcgk9AyVWQXI35al1TS8UatVbO04-fv-64RGBKGhuQzKXCUinxBmFQlWkST4N0ca5JmtE3gJFmdAIjP4VRs7iuqxic6__26ebarxcn_KnSJ3f_9-_UdJ_9-8otfr7tFmm1VNLiw8jvq_NKynlSV_FEo2KqEcG6WsDP63DWdqr-L9gpvb8e6hr1LdbOf44fb0ZvexutM1JXx0ThUn50pnWdpuQFrc819jsa_Ct6v4WGSZqSiYbxmacmdYl_ScO_Y1W3sVt3tOHsDbMFKdNFXeJEe3Km_SJfFC9of7fvSiU4O9d_0v43GTi2O8xPsX71tuyU-aKYsDNZxetyUURZdoJ1p7nFK81avsWv6s5qpN2EAU13a2UO7dlU0Sut6d7RkiyPjb_i7jDeL9iVqIPk5kjB8gXDHHqML__LZXXa5a3Yo7SKsmzCXnrGXkmK-gX2JqzdWXdE-cFj3pSwJRhbjQKD5N8GXPdWT2Y-9e6JfIU1HYRdVyjQ4st9khvwaN_CNjUp6oltHvdd4y-NWFwy6FG7U93vzjCfe9R-XxqQ_MDXSdOfMTtG7ptReNJ1i8wq_cc-cipPhVCM_mmXx5lePHr9gydFb7TRJBObZWc2wyKrHm32X3P9u83lrDEx1-LcXGWc_Ky5_hP5KeNkwk9-xk9G5ww6yp8_Cf_zgNx8E0DF2VmUkRRhvXZnx7WxVNs1o0KsX4T4Dx1OC5JO9mgkOseVRMUUl4MUpNH7Tx-vl2sSknD-qgCTaLJNIvGZJRfVYg4jtDeypZvxCGl6c_nUeHIhCtwcLm9hp2nfowaq1SCrZ65abUstWE2l6alGacUeemoMGrCtVkPTAhXieI8IVv04SAj-FvYVeZjoZPad4HLjoEilOyqeUWvcOrx06cuUNErgoTW5cWd30VPbvuod6aNLnc3Q57u-KjXpYrKvmKCiTRJT553YNw9NG8ene6HpsFQfNXjVy93ZbIvauOx9vC0PSN5a2z_dbjv5UOnGvxVPzAN46UP_R7scPn3uLe_4d6ygHLiowsf2d-OSC5bqBt1qDg95ts7S2SA3Uu3kTHA5PMwaOTz2-KCMheWX35ys2ewF3eAfhMtHC6ZVg6igREBq9s6XNPZaVQOb3LfvQQ9SctmAks-4mZJeOJhf03EF8kUNOAxUuf7vPyyD-bsDW8digK-_8FBsA7KyXR-QlZ__MPbMTx_S0FIdNt8P61hLKwd06IWilS9IaEmF2EM1oPvwntsPQ-krJB6G4d8RBO-4v7Qu92MA4QOywRdjpvrAcwBcdE9CKFlWaCkXxq2w0w9m6Dqq90Fyc3ugcqzFcHOoFfnpHR_J0jHwJH46ThzC_6sBJKLX1fuF6wPUAAWmlTGzsUSFGmqlnRL3dEtHX35ykKZl98ZZKCC5k1KiQg0at9y5oa8g3ZsfpD3PNyTIo6BIDqC9-45uC6oGpgZtMHQmv_bYuDRWD8z6YalGoFvKBS0FwtAfTsfP2L_hVtAybMei2iFwmpY9PWcBWe34hpuArE4UPBTYAlKE8BEGgyM7j5r56hqJElrl87SuEfOIYFbWEWWUZJixghZFiSzJs7nP3PAYQR9r2KsBdlT60tVgEH51CWXpmxmVwFpkGzVYX34jCdaUEFLF1YLWi5qmSR7RpCC0rpJ5URc4j-OM-SCpHVvdHiR_6DeNcWbbvMDJsUA2LVCO6c31dvGi0WW4n8ZACl9OG30pyCLJH2bjy-wK3JhL51ah94LQf_hC2YY2aJ7s8-hyTujDzdW7Y1yQEJb-puis6hhk0Vc0Nmy9Yx3Tof9NXjpVDQLBSTt3tWh8vO5a1PhyLycGDxAk79yTXEMan8ZREsLtIP8oOtwTZmqw_WArrkd6ArKC2RZm6tlsALNZRzcIM2Op5cwljaOOY-Ae8qrB0zRKhUZa7Q-MpaOkc6nnci5t3Bb0JPP-ZJq6qC6TqkgKeoGXcbZYxFkUFdlFe1nkmGKRxVExx5ilRV2miOmiiAmtaF7nF_ySRCSJCEniJM3jLFwkFaN1TViULuqasSCNsKNchI-L3IUv1F5mUZEWF4KWKIyvrxMicQf-Y0BIMH93oS899nJoTJBGghtrjqNYbgVeHpLL6dKSXB3I2PmS_FgLV_KkDg4hfX6t-bEYfzFocfn3S9FeyX8FAAD__5mAEM4">