Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLD segfault in SymbolTableSection<ELFT>::writeTo #79944

Closed
kxxt opened this issue Jan 30, 2024 · 10 comments
Closed

LLD segfault in SymbolTableSection<ELFT>::writeTo #79944

kxxt opened this issue Jan 30, 2024 · 10 comments
Labels
crash Prefer [crash-on-valid] or [crash-on-invalid] lld:ELF

Comments

@kxxt
Copy link

kxxt commented Jan 30, 2024

Hi, I encountered a segfault in lld when cross-compiling chromium from x86_64 host to riscv64.

Initially I used clang version 18.0.0git (https://chromium.googlesource.com/external/github.com/llvm/llvm-project c4146121e940b6b853148c780568dee38b97382f).

Later I tried clang version 18.1.0rc (https://github.com/llvm/llvm-project.git bab01aead7d7a34436bc8e1639b90227374f079e).

The failing command is

"python3" "../../build/toolchain/gcc_link_wrapper.py" --output="./chrome" --  ~/Workspaces/llvm/llvm-project/build-debug/bin/clang++ -Wl,--version-script=../../build/linux/chrome.map -Werror -fuse-ld=lld -Wl,--fatal-warnings -Wl,--build-id=sha1 -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--icf=all -Wl,--color-diagnostics -Wl,-mllvm,-instcombine-lower-dbg-declare=0 -Wl,-mllvm,-split-threshold-for-reg-with-hint=0 -Wl,--thinlto-cache-dir=thinlto-cache -Wl,--thinlto-cache-policy=cache_size=10\%:cache_size_bytes=40g:cache_size_files=100000 -flto=thin -Wl,--thinlto-jobs=all -Wl,-mllvm,-import-instr-limit=30 -Wl,-mllvm,-disable-auto-upgrade-debug-info -fwhole-program-vtables -Wl,--undefined-version -Wl,--no-call-graph-profile-sort --target=riscv64-linux-gnu -no-canonical-prefixes -Wl,-O2 -Wl,--gc-sections -Wl,--gdb-index -Wl,-z,defs -Wl,--as-needed -nostdlib++ --sysroot=../../build/linux/debian_sid_riscv64-sysroot -rdynamic -pie -Wl,--disable-new-dtags -Wl,--lto-O2 -L../../build/linux/debian_sid_riscv64-sysroot/usr/lib/riscv64-linux-gnu -o "./chrome" -Wl,--start-group @"./chrome.rsp"  -Wl,--end-group  ../../third_party/llvm-build/Release+Asserts/lib/clang/18/lib/riscv64-unknown-linux-gnu/libclang_rt.builtins.a -ldl -lpthread -lrt -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lnss3 -lnssutil3 -lsmime3 -lplds4 -lplc4 -lnspr4 -ldbus-1 -latk-1.0 -latk-bridge-2.0 -lcups -lgio-2.0 -latspi -lresolv -lexpat -luuid -lX11 -lXcomposite -lXdamage -lXext -lXfixes -lXrender -lXrandr -lXtst -lgbm -lEGL -ldrm -lxcb -lxkbcommon -lXi -lpci -lffi_pic -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lcairo -lasound -lm -lz -lxshmfence -lstdc++ obj/third_party/rust/cxx/v1/lib/libcxx_lib.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libstd_std.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liballoc_alloc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcompiler_builtins_compiler_builtins.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_core_rustc_std_workspace_core.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcore_core.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libprofiler_builtins_profiler_builtins.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcfg_if_cfg_if.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libhashbrown_hashbrown.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_alloc_rustc_std_workspace_alloc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liblibc_libc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libpanic_abort_panic_abort.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libpanic_unwind_panic_unwind.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libunwind_unwind.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_demangle_rustc_demangle.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libstd_detect_std_detect.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libaddr2line_addr2line.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libgimli_gimli.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libminiz_oxide_miniz_oxide.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libadler_adler.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libobject_object.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libmemchr_memchr.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libgetopts_getopts.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_std_rustc_std_workspace_std.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libunicode_width_unicode_width.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libtest_test.rlib obj/skia/libskia_cbridge_urust_uside.rlib obj/third_party/rust/font_types/v0_4/lib/libfont_types_lib.rlib obj/third_party/rust/read_fonts/v0_15/lib/libread_fonts_lib.rlib obj/third_party/rust/skrifa/v0_15/lib/libskrifa_lib.rlib obj/build/rust/chromium_prelude/libchromium.rlib obj/third_party/blink/common/rust_crash/libthird_uparty_sblink_scommon_srust_ucrash_crs.rlib obj/components/qr_code_generator/libcomponents_sqr_ucode_ugenerator_cqr_ucode_ugenerator_uffi_uglue.rlib obj/third_party/rust/qr_code/v2/lib/libqr_code_lib.rlib -Wl,--threads=1

Backtrace

(gdb) bt full
#0  0x00005e038d28cf99 in llvm::support::endian::write<unsigned int, 1ul> (memory=0x753da8106000, value=0, endian=llvm::endianness::little) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:93
No locals.
#1  0x00005e038d28d0e6 in llvm::support::endian::write<unsigned int, (llvm::endianness)1, 1ul> (memory=0x753da8106000, value=0) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:102
No locals.
#2  0x00005e038d28d0be in llvm::support::detail::packed_endian_specific_integral<unsigned int, (llvm::endianness)1, 1ul, 1ul>::operator= (this=0x753da8106000, newValue=0)
    at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:216
No locals.
#3  0x00005e038d5ddd82 in lld::elf::SymbolTableSection<llvm::object::ELFType<(llvm::endianness)1, true> >::writeTo (this=0x5e043405bdb0, buf=0x753d62030170 "\001")
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/SyntheticSections.cpp:2230
        sym = 0x5e05b30872d0
        isDefinedHere = true
        ent = @0x753dd6cc7470: {sym = 0x5e05b30872d0, strTabOffset = 0}
        __for_range = @0x5e043405be58: {<llvm::SmallVectorImpl<lld::elf::SymbolTableEntry>> = {<llvm::SmallVectorTemplateBase<lld::elf::SymbolTableEntry, true>> = {<llvm::SmallVectorTemplateCommon<lld::elf::SymbolTableEntry, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x753da818e010, Size = 223895855, Capacity = 268435455}, <No data fields>}, 
              static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<lld::elf::SymbolTableEntry, 0>> = {<No data fields>}, <No data fields>}
        __for_begin = 0x753dd6cc7470
        __for_end = 0x753e7d9ef300
        eSym = 0x753da8106000
#4  0x00005e038d56dcd1 in lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda(unsigned long, unsigned long)#1}::operator()(unsigned long, unsigned long) const (__closure=0x5e0942f41c70, begin=0, end=1) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:497
        s = 0x5e043405bdb0
        isec = 0x5e043405bdb8
        i = 0
        numSections = 1
        filler = {_M_elems = "\000\000\000"}
        nonZeroFiller = false
        this = 0x5e043040b148
        buf = 0x753d62030158 ""
        sections = {Data = 0x5e0468d04240, Length = 1}
        __PRETTY_FUNCTION__ = "lld::elf::OutputSection::writeTo<llvm::object::ELFType<llvm::endianness::little, true> >(uint8_t*, llvm::parallel::TaskGroup&)::<lambda(size_t, size_t)>"
#5  0x00005e038d56defb in lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}::operator()() const (__closure=0x5e0942f41c70)
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:547
        i = 1
        begin = 0
        fn = {__sections = {Data = 0x5e0468d04240, Length = 1}, __buf = 0x753d62030158 "", __this = 0x5e043040b148, __nonZeroFiller = false, __filler = {_M_elems = "\000\000\000"}}
#6  0x00005e038d576d16 in std::__invoke_impl<void, lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}&>(std::__invoke_other, lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}&) (__f=...) at /usr/include/c++/13.2.1/bits/invoke.h:61
No locals.
#7  0x00005e038d57444e in std::__invoke_r<void, lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}&>(lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}&) (__fn=...) at /usr/include/c++/13.2.1/bits/invoke.h:111
No locals.
#8  0x00005e038d5729d5 in std::_Function_handler<void (), lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> >(unsigned char*, llvm::parallel::TaskGroup&)::{lambda()#1}>::_M_invoke(std::_Any_data const&)
    (__functor=...) at /usr/include/c++/13.2.1/bits/std_function.h:290
No locals.
#9  0x00005e038d29eba8 in std::function<void ()>::operator()() const (this=0x7ffde3a5fdc0) at /usr/include/c++/13.2.1/bits/std_function.h:591
No locals.
#10 0x00005e0392ffa47d in llvm::parallel::TaskGroup::spawn(std::function<void ()>, bool) (this=0x7ffde3a5ff10, F=..., Sequential=false) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/lib/Support/Parallel.cpp:221
No locals.
#11 0x00005e038d569179 in lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::endianness)1, true> > (this=0x5e043040b148, buf=0x753d62030158 "", tg=...)
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:547
        done = true
        begin = 0
        i = 1
        taskSize = 1078533248
--Type <RET> for more, q to quit, c to continue without paging--c
        timeScope = {<No data fields>}
        sections = {Data = 0x5e0468d04240, Length = 1}
        filler = {_M_elems = "\000\000\000"}
        nonZeroFiller = false
        fn = {__sections = {Data = 0x5e0468d04240, Length = 1}, __buf = 0x753d62030158 "", __this = 0x5e043040b148, __nonZeroFiller = false, __filler = {_M_elems = "\000\000\000"}}
        written = false
        numSections = 1
        taskSizeLimit = 4194304
#12 0x00005e038d669595 in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::endianness)1, true> >::writeSections (this=0x7ffde3a60150) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:3031
        sec = 0x5e043040b148
        __for_range = @0x5e0399805c60: {<llvm::SmallVectorImpl<lld::elf::OutputSection*>> = {<llvm::SmallVectorTemplateBase<lld::elf::OutputSection*, true>> = {<llvm::SmallVectorTemplateCommon<lld::elf::OutputSection*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x5e046412f640, Size = 48, Capacity = 63}, <No data fields>}, 
              static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<lld::elf::OutputSection*, 0>> = {<No data fields>}, <No data fields>}
        __for_begin = 0x5e046412f7a8
        __for_end = 0x5e046412f7c0
        tg = {L = {Count = 0, Mutex = {<std::__mutex_base> = {_M_mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, 
                  __size = '\000' <repeats 39 times>, __align = 0}}, <No data fields>}, Cond = {_M_cond = {_M_cond = {__data = {__wseq = {__value64 = 0, __value32 = {__low = 0, __high = 0}}, __g1_start = {__value64 = 0, __value32 = {
                        __low = 0, __high = 0}}, __g_refs = {0, 0}, __g_size = {0, 0}, __g1_orig_size = 0, __wrefs = 0, __g_signals = {0, 0}}, __size = '\000' <repeats 47 times>, __align = 0}}}}, Parallel = false}
        timeScope = {<No data fields>}
#13 0x00005e038d65abf9 in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::endianness)1, true> >::run (this=0x7ffde3a60150) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:653
        timeScope = {<No data fields>}
#14 0x00005e038d695871 in lld::elf::writeResult<llvm::object::ELFType<(llvm::endianness)1, true> > () at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:99
No locals.
#15 0x00005e038d42c905 in lld::elf::LinkerDriver::link (this=0x5e03998057e0 <lld::elf::ctx>, args=...) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:3051
        timeScope = {<No data fields>}
        wrapped = std::vector of length 0, capacity 0
        skipLinkedOutput = false
        numObjsBeforeLTO = 158
        newObjectFiles = {Data = 0x5e04e34d0690, Length = 34623}
#16 0x00005e038d41b635 in lld::elf::LinkerDriver::linkerMain (this=0x5e03998057e0 <lld::elf::ctx>, argsArr=...) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:652
        timeScope = {<No data fields>}
        parser = {<llvm::opt::GenericOptTable> = {<llvm::opt::OptTable> = {_vptr.OptTable = 0x5e0399363780 <vtable for lld::elf::ELFOptTable+16>, OptionInfos = {Data = 0x5e03993638e0 <optInfo>, Length = 404}, IgnoreCase = false, 
              GroupedShortOptions = false, DashDashParsing = false, EnvVar = 0x0, InputOptionID = 1, UnknownOptionID = 2, FirstSearchableIndex = 2, 
              PrefixChars = {<llvm::SmallVector<char, 8>> = {<llvm::SmallVectorImpl<char>> = {<llvm::SmallVectorTemplateBase<char, true>> = {<llvm::SmallVectorTemplateCommon<char, void>> = {<llvm::SmallVectorBase<unsigned long>> = {
                          BeginX = 0x7ffde3a60650, Size = 1, Capacity = 8}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<char, 8>> = {
                    InlineElts = "-\006\246\343\375\177\000"}, <No data fields>}, <No data fields>}}, 
            PrefixesUnionBuffer = {<llvm::SmallVectorImpl<llvm::StringLiteral>> = {<llvm::SmallVectorTemplateBase<llvm::StringLiteral, true>> = {<llvm::SmallVectorTemplateCommon<llvm::StringLiteral, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x7ffde3a60668, Size = 2, Capacity = 3}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<llvm::StringLiteral, 3>> = {
                InlineElts = "y\217\022\223\003^\000\000\001\000\000\000\000\000\000\000{\217\022\223\003^\000\000\002", '\000' <repeats 15 times>, "\320\006\246\343\375\177\000"}, <No data fields>}}, <No data fields>}
        args = {<llvm::opt::ArgList> = {_vptr.ArgList = 0x5e0399380140 <vtable for llvm::opt::InputArgList+16>, 
            Args = {<llvm::SmallVectorImpl<llvm::opt::Arg*>> = {<llvm::SmallVectorTemplateBase<llvm::opt::Arg*, true>> = {<llvm::SmallVectorTemplateCommon<llvm::opt::Arg*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {
                      BeginX = 0x754d62260010, Size = 14274, Capacity = 17407}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<llvm::opt::Arg*, 16>> = {
                InlineElts = "\300]\023\233\003^\000\000\000\000\000\000\000\000\000\000\360\006\246\343\375\177\000\000\000\a\246\343\375\177\000\000\367&F\215\003^\000\000@_\200\231\003^\000\000p\304\023\233\003^", '\000' <repeats 18 times>, "@\a\246\343\375\177", '\000' <repeats 18 times>, "@_\200\231\003^\000\000@\a\246\343\375\177\000\000\324\031F\215\003^\000\000@_\200\231\003^\000"}, <No data fields>}, 
            OptRanges = {<llvm::DenseMapBase<llvm::DenseMap<unsigned int, std::pair<unsigned int, unsigned int>, llvm::DenseMapInfo<unsigned int, void>, llvm::detail::DenseMapPair<unsigned int, std::pair<unsigned int, unsigned int> > >, unsigned int, std::pair<unsigned int, unsigned int>, llvm::DenseMapInfo<unsigned int, void>, llvm::detail::DenseMapPair<unsigned int, std::pair<unsigned int, unsigned int> > >> = {<llvm::DebugEpochBase> = {
                  Epoch = 2}, <No data fields>}, Buckets = 0x5e039b13bc50, NumEntries = 35, NumTombstones = 0, NumBuckets = 64}}, 
          ArgStrings = {<llvm::SmallVectorImpl<char const*>> = {<llvm::SmallVectorTemplateBase<char const*, true>> = {<llvm::SmallVectorTemplateCommon<char const*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {
                    BeginX = 0x754d61ac9010, Size = 14293, Capacity = 28571}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<char const*, 16>> = {
              InlineElts = "\274%\246\343\375\177\000\000\260\a\246\343\375\177\000\000,CE\215\003^\000\000\001\000\000\000\000\000\000\000\330\a\246\343\375\177\000\000\260\303\023\233\003^\000\000\260\303\023\233\003^\000\000\260\303\023\233\003^\000\000\340\a\246\343\375\177\000\000\360\a\246\343\375\177\000\000ҔD\215\003^\000\000\000\000\000\000\000\000\000\000@_\200\231\003^\000\000@_\200\231\003^\000\000p\304\023\233\003^\000\000\260\303\023\233\003^\000"}, <No data fields>}, SynthesizedStrings = std::__cxx11::list = {[0] = "--sysroot", [1] = "--hash-style", [2] = "--discard-locals", [3] = "--version-script", [4] = "--color-diagnostics=", [5] = "--thinlto-cache-policy", 
            [6] = "--call-graph-profile-sort=", [7] = "--threads"}, NumInputArgStrings = 14285}
#17 0x00005e038d417493 in lld::elf::link (args=..., stdoutOS=..., stderrOS=..., exitEarly=true, disableOutput=false) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:162
        ctx = 0x5e039b135e20
#18 0x00005e038d29af55 in lld::unsafeLldMain (args=..., stdoutOS=..., stderrOS=..., drivers=..., exitEarly=true) at /home/kxxt/Workspaces/llvm/llvm-project/lld/Common/DriverDispatcher.cpp:163
        argsV = {<llvm::SmallVectorImpl<char const*>> = {<llvm::SmallVectorTemplateBase<char const*, true>> = {<llvm::SmallVectorTemplateCommon<char const*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x7ffde3a60f00, 
                  Size = 2, Capacity = 256}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<char const*, 256>> = {
            InlineElts = "}%\246\343\375\177\000\000\274%\246\343\375\177\000\0000\223\352aMu\000\000X\223\352aMu", '\000' <repeats 130 times>, "_\205s\227\003^\000\000\a\000\000\000\000\000\000\000g\205s\227\003^\000\000\016\000\000\000\000\000\000\000\000\000\000\361\000\000\000\000"...}, <No data fields>}
        d = 0x5e038d417209 <lld::elf::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool)>
        r = 0
#19 0x00005e038d17871c in lld_main (argc=2, argv=0x7ffde3a61a38) at /home/kxxt/Workspaces/llvm/llvm-project/lld/tools/lld/lld.cpp:90
        r = 0
        args = {Data = 0x7ffde3a61a38, Length = 2}
        mainRet = std::optional = {[contained value] = -475653576}
#20 0x00005e038d17b730 in main (argc=2, argv=0x7ffde3a61a38) at /home/kxxt/Workspaces/llvm/llvm-project/build-debug/tools/lld/tools/lld/lld-driver.cpp:17
        X = {
          Alloc = {<llvm::AllocatorBase<llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096, 4096, 128> >> = {<No data fields>}, <llvm::detail::AllocatorHolder<llvm::MallocAllocator>> = {<llvm::MallocAllocator> = {<llvm::AllocatorBase<llvm::MallocAllocator>> = {<No data fields>}, <No data fields>}, <No data fields>}, CurPtr = 0x0, End = 0x0, 
            Slabs = {<llvm::SmallVectorImpl<void*>> = {<llvm::SmallVectorTemplateBase<void*, true>> = {<llvm::SmallVectorTemplateCommon<void*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x7ffde3a61890, Size = 0, 
                      Capacity = 4}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<void*, 4>> = {
                InlineElts = "\340b\242\231\003^\000\000\260\322\r\233\003^\000\000\220\030\246\343\375\177\000\000\260\322\r\233\003^\000"}, <No data fields>}, 
            CustomSizedSlabs = {<llvm::SmallVectorImpl<std::pair<void*, unsigned long> >> = {<llvm::SmallVectorTemplateBase<std::pair<void*, unsigned long>, true>> = {<llvm::SmallVectorTemplateCommon<std::pair<void*, unsigned long>, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x7ffde3a618c0, Size = 0, Capacity = 0}, <No data fields>}, 
                  static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<std::pair<void*, unsigned long>, 0>> = {<No data fields>}, <No data fields>}, BytesAllocated = 0, RedZoneSize = 1}, 
          Args = {<llvm::SmallVectorImpl<char const*>> = {<llvm::SmallVectorTemplateBase<char const*, true>> = {<llvm::SmallVectorTemplateCommon<char const*, void>> = {<llvm::SmallVectorBase<unsigned int>> = {BeginX = 0x7ffde3a618e0, 
                    Size = 0, Capacity = 0}, <No data fields>}, static TakesParamByValue = true}, <No data fields>}, <llvm::SmallVectorStorage<char const*, 0>> = {<No data fields>}, <No data fields>}, StackPrinter = std::optional = {
            [contained value] = {<llvm::PrettyStackTraceEntry> = {_vptr.PrettyStackTraceEntry = 0x5e039935c010 <vtable for llvm::PrettyStackTraceProgram+16>, NextEntry = 0x0}, ArgC = 2, ArgV = 0x7ffde3a61a38}}}
(gdb) p buf
$19 = (uint8_t *) 0x753d62030170 "\001"
(gdb) p eSym
$20 = (llvm::object::Elf_Sym_Impl<llvm::object::ELFType<(llvm::endianness)1, true> > *) 0x753da8106000
(gdb) p *eSym
Cannot access memory at address 0x753da8106000

I understand that it can't be easily reproduced as cross-compiling chromium to riscv64 requries lots of patches and building chromium takes a lot of time. So please ask me for more information if the above backtrace is not sufficient for tracing down the bug.

@github-actions github-actions bot added the lld label Jan 30, 2024
@EugeneZelenko EugeneZelenko added lld:ELF crash Prefer [crash-on-valid] or [crash-on-invalid] and removed lld labels Jan 30, 2024
@llvmbot
Copy link
Member

llvmbot commented Jan 30, 2024

@llvm/issue-subscribers-lld-elf

Author: Levi Zim (kxxt)

Hi, I encountered a segfault in lld when cross-compiling chromium from x86_64 host to riscv64.

Initially I used clang version 18.0.0git (https://chromium.googlesource.com/external/github.com/llvm/llvm-project c4146121e940b6b853148c780568dee38b97382f).

Later I tried clang version 18.1.0rc (https://github.com/llvm/llvm-project.git bab01aead7d7a34436bc8e1639b90227374f079e).

The failing command is

"python3" "../../build/toolchain/gcc_link_wrapper.py" --output="./chrome" --  ~/Workspaces/llvm/llvm-project/build-debug/bin/clang++ -Wl,--version-script=../../build/linux/chrome.map -Werror -fuse-ld=lld -Wl,--fatal-warnings -Wl,--build-id=sha1 -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--icf=all -Wl,--color-diagnostics -Wl,-mllvm,-instcombine-lower-dbg-declare=0 -Wl,-mllvm,-split-threshold-for-reg-with-hint=0 -Wl,--thinlto-cache-dir=thinlto-cache -Wl,--thinlto-cache-policy=cache_size=10\%:cache_size_bytes=40g:cache_size_files=100000 -flto=thin -Wl,--thinlto-jobs=all -Wl,-mllvm,-import-instr-limit=30 -Wl,-mllvm,-disable-auto-upgrade-debug-info -fwhole-program-vtables -Wl,--undefined-version -Wl,--no-call-graph-profile-sort --target=riscv64-linux-gnu -no-canonical-prefixes -Wl,-O2 -Wl,--gc-sections -Wl,--gdb-index -Wl,-z,defs -Wl,--as-needed -nostdlib++ --sysroot=../../build/linux/debian_sid_riscv64-sysroot -rdynamic -pie -Wl,--disable-new-dtags -Wl,--lto-O2 -L../../build/linux/debian_sid_riscv64-sysroot/usr/lib/riscv64-linux-gnu -o "./chrome" -Wl,--start-group @"./chrome.rsp"  -Wl,--end-group  ../../third_party/llvm-build/Release+Asserts/lib/clang/18/lib/riscv64-unknown-linux-gnu/libclang_rt.builtins.a -ldl -lpthread -lrt -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lnss3 -lnssutil3 -lsmime3 -lplds4 -lplc4 -lnspr4 -ldbus-1 -latk-1.0 -latk-bridge-2.0 -lcups -lgio-2.0 -latspi -lresolv -lexpat -luuid -lX11 -lXcomposite -lXdamage -lXext -lXfixes -lXrender -lXrandr -lXtst -lgbm -lEGL -ldrm -lxcb -lxkbcommon -lXi -lpci -lffi_pic -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lcairo -lasound -lm -lz -lxshmfence -lstdc++ obj/third_party/rust/cxx/v1/lib/libcxx_lib.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libstd_std.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liballoc_alloc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcompiler_builtins_compiler_builtins.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_core_rustc_std_workspace_core.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcore_core.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libprofiler_builtins_profiler_builtins.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcfg_if_cfg_if.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libhashbrown_hashbrown.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_alloc_rustc_std_workspace_alloc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liblibc_libc.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libpanic_abort_panic_abort.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libpanic_unwind_panic_unwind.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libunwind_unwind.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_demangle_rustc_demangle.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libstd_detect_std_detect.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libaddr2line_addr2line.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libgimli_gimli.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libminiz_oxide_miniz_oxide.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libadler_adler.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libobject_object.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libmemchr_memchr.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libgetopts_getopts.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_std_rustc_std_workspace_std.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libunicode_width_unicode_width.rlib local_rustc_sysroot/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libtest_test.rlib obj/skia/libskia_cbridge_urust_uside.rlib obj/third_party/rust/font_types/v0_4/lib/libfont_types_lib.rlib obj/third_party/rust/read_fonts/v0_15/lib/libread_fonts_lib.rlib obj/third_party/rust/skrifa/v0_15/lib/libskrifa_lib.rlib obj/build/rust/chromium_prelude/libchromium.rlib obj/third_party/blink/common/rust_crash/libthird_uparty_sblink_scommon_srust_ucrash_crs.rlib obj/components/qr_code_generator/libcomponents_sqr_ucode_ugenerator_cqr_ucode_ugenerator_uffi_uglue.rlib obj/third_party/rust/qr_code/v2/lib/libqr_code_lib.rlib -Wl,--threads=1

Backtrace

(gdb) bt full
#<!-- -->0  0x00005e038d28cf99 in llvm::support::endian::write&lt;unsigned int, 1ul&gt; (memory=0x753da8106000, value=0, endian=llvm::endianness::little) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:93
No locals.
#<!-- -->1  0x00005e038d28d0e6 in llvm::support::endian::write&lt;unsigned int, (llvm::endianness)1, 1ul&gt; (memory=0x753da8106000, value=0) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:102
No locals.
#<!-- -->2  0x00005e038d28d0be in llvm::support::detail::packed_endian_specific_integral&lt;unsigned int, (llvm::endianness)1, 1ul, 1ul&gt;::operator= (this=0x753da8106000, newValue=0)
    at /home/kxxt/Workspaces/llvm/llvm-project/llvm/include/llvm/Support/Endian.h:216
No locals.
#<!-- -->3  0x00005e038d5ddd82 in lld::elf::SymbolTableSection&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;::writeTo (this=0x5e043405bdb0, buf=0x753d62030170 "\001")
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/SyntheticSections.cpp:2230
        sym = 0x5e05b30872d0
        isDefinedHere = true
        ent = @<!-- -->0x753dd6cc7470: {sym = 0x5e05b30872d0, strTabOffset = 0}
        __for_range = @<!-- -->0x5e043405be58: {&lt;llvm::SmallVectorImpl&lt;lld::elf::SymbolTableEntry&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;lld::elf::SymbolTableEntry, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;lld::elf::SymbolTableEntry, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x753da818e010, Size = 223895855, Capacity = 268435455}, &lt;No data fields&gt;}, 
              static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;lld::elf::SymbolTableEntry, 0&gt;&gt; = {&lt;No data fields&gt;}, &lt;No data fields&gt;}
        __for_begin = 0x753dd6cc7470
        __for_end = 0x753e7d9ef300
        eSym = 0x753da8106000
#<!-- -->4  0x00005e038d56dcd1 in lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda(unsigned long, unsigned long)#<!-- -->1}::operator()(unsigned long, unsigned long) const (__closure=0x5e0942f41c70, begin=0, end=1) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:497
        s = 0x5e043405bdb0
        isec = 0x5e043405bdb8
        i = 0
        numSections = 1
        filler = {_M_elems = "\000\000\000"}
        nonZeroFiller = false
        this = 0x5e043040b148
        buf = 0x753d62030158 ""
        sections = {Data = 0x5e0468d04240, Length = 1}
        __PRETTY_FUNCTION__ = "lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;llvm::endianness::little, true&gt; &gt;(uint8_t*, llvm::parallel::TaskGroup&amp;)::&lt;lambda(size_t, size_t)&gt;"
#<!-- -->5  0x00005e038d56defb in lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}::operator()() const (__closure=0x5e0942f41c70)
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:547
        i = 1
        begin = 0
        fn = {__sections = {Data = 0x5e0468d04240, Length = 1}, __buf = 0x753d62030158 "", __this = 0x5e043040b148, __nonZeroFiller = false, __filler = {_M_elems = "\000\000\000"}}
#<!-- -->6  0x00005e038d576d16 in std::__invoke_impl&lt;void, lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}&amp;&gt;(std::__invoke_other, lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}&amp;) (__f=...) at /usr/include/c++/13.2.1/bits/invoke.h:61
No locals.
#<!-- -->7  0x00005e038d57444e in std::__invoke_r&lt;void, lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}&amp;&gt;(lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}&amp;) (__fn=...) at /usr/include/c++/13.2.1/bits/invoke.h:111
No locals.
#<!-- -->8  0x00005e038d5729d5 in std::_Function_handler&lt;void (), lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;(unsigned char*, llvm::parallel::TaskGroup&amp;)::{lambda()#<!-- -->1}&gt;::_M_invoke(std::_Any_data const&amp;)
    (__functor=...) at /usr/include/c++/13.2.1/bits/std_function.h:290
No locals.
#<!-- -->9  0x00005e038d29eba8 in std::function&lt;void ()&gt;::operator()() const (this=0x7ffde3a5fdc0) at /usr/include/c++/13.2.1/bits/std_function.h:591
No locals.
#<!-- -->10 0x00005e0392ffa47d in llvm::parallel::TaskGroup::spawn(std::function&lt;void ()&gt;, bool) (this=0x7ffde3a5ff10, F=..., Sequential=false) at /home/kxxt/Workspaces/llvm/llvm-project/llvm/lib/Support/Parallel.cpp:221
No locals.
#<!-- -->11 0x00005e038d569179 in lld::elf::OutputSection::writeTo&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt; (this=0x5e043040b148, buf=0x753d62030158 "", tg=...)
    at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/OutputSections.cpp:547
        done = true
        begin = 0
        i = 1
        taskSize = 1078533248
--Type &lt;RET&gt; for more, q to quit, c to continue without paging--c
        timeScope = {&lt;No data fields&gt;}
        sections = {Data = 0x5e0468d04240, Length = 1}
        filler = {_M_elems = "\000\000\000"}
        nonZeroFiller = false
        fn = {__sections = {Data = 0x5e0468d04240, Length = 1}, __buf = 0x753d62030158 "", __this = 0x5e043040b148, __nonZeroFiller = false, __filler = {_M_elems = "\000\000\000"}}
        written = false
        numSections = 1
        taskSizeLimit = 4194304
#<!-- -->12 0x00005e038d669595 in (anonymous namespace)::Writer&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;::writeSections (this=0x7ffde3a60150) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:3031
        sec = 0x5e043040b148
        __for_range = @<!-- -->0x5e0399805c60: {&lt;llvm::SmallVectorImpl&lt;lld::elf::OutputSection*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;lld::elf::OutputSection*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;lld::elf::OutputSection*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x5e046412f640, Size = 48, Capacity = 63}, &lt;No data fields&gt;}, 
              static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;lld::elf::OutputSection*, 0&gt;&gt; = {&lt;No data fields&gt;}, &lt;No data fields&gt;}
        __for_begin = 0x5e046412f7a8
        __for_end = 0x5e046412f7c0
        tg = {L = {Count = 0, Mutex = {&lt;std::__mutex_base&gt; = {_M_mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, 
                  __size = '\000' &lt;repeats 39 times&gt;, __align = 0}}, &lt;No data fields&gt;}, Cond = {_M_cond = {_M_cond = {__data = {__wseq = {__value64 = 0, __value32 = {__low = 0, __high = 0}}, __g1_start = {__value64 = 0, __value32 = {
                        __low = 0, __high = 0}}, __g_refs = {0, 0}, __g_size = {0, 0}, __g1_orig_size = 0, __wrefs = 0, __g_signals = {0, 0}}, __size = '\000' &lt;repeats 47 times&gt;, __align = 0}}}}, Parallel = false}
        timeScope = {&lt;No data fields&gt;}
#<!-- -->13 0x00005e038d65abf9 in (anonymous namespace)::Writer&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt;::run (this=0x7ffde3a60150) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:653
        timeScope = {&lt;No data fields&gt;}
#<!-- -->14 0x00005e038d695871 in lld::elf::writeResult&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt; () at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Writer.cpp:99
No locals.
#<!-- -->15 0x00005e038d42c905 in lld::elf::LinkerDriver::link (this=0x5e03998057e0 &lt;lld::elf::ctx&gt;, args=...) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:3051
        timeScope = {&lt;No data fields&gt;}
        wrapped = std::vector of length 0, capacity 0
        skipLinkedOutput = false
        numObjsBeforeLTO = 158
        newObjectFiles = {Data = 0x5e04e34d0690, Length = 34623}
#<!-- -->16 0x00005e038d41b635 in lld::elf::LinkerDriver::linkerMain (this=0x5e03998057e0 &lt;lld::elf::ctx&gt;, argsArr=...) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:652
        timeScope = {&lt;No data fields&gt;}
        parser = {&lt;llvm::opt::GenericOptTable&gt; = {&lt;llvm::opt::OptTable&gt; = {_vptr.OptTable = 0x5e0399363780 &lt;vtable for lld::elf::ELFOptTable+16&gt;, OptionInfos = {Data = 0x5e03993638e0 &lt;optInfo&gt;, Length = 404}, IgnoreCase = false, 
              GroupedShortOptions = false, DashDashParsing = false, EnvVar = 0x0, InputOptionID = 1, UnknownOptionID = 2, FirstSearchableIndex = 2, 
              PrefixChars = {&lt;llvm::SmallVector&lt;char, 8&gt;&gt; = {&lt;llvm::SmallVectorImpl&lt;char&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;char, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;char, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned long&gt;&gt; = {
                          BeginX = 0x7ffde3a60650, Size = 1, Capacity = 8}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;char, 8&gt;&gt; = {
                    InlineElts = "-\006\246\343\375\177\000"}, &lt;No data fields&gt;}, &lt;No data fields&gt;}}, 
            PrefixesUnionBuffer = {&lt;llvm::SmallVectorImpl&lt;llvm::StringLiteral&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;llvm::StringLiteral, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;llvm::StringLiteral, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x7ffde3a60668, Size = 2, Capacity = 3}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;llvm::StringLiteral, 3&gt;&gt; = {
                InlineElts = "y\217\022\223\003^\000\000\001\000\000\000\000\000\000\000{\217\022\223\003^\000\000\002", '\000' &lt;repeats 15 times&gt;, "\320\006\246\343\375\177\000"}, &lt;No data fields&gt;}}, &lt;No data fields&gt;}
        args = {&lt;llvm::opt::ArgList&gt; = {_vptr.ArgList = 0x5e0399380140 &lt;vtable for llvm::opt::InputArgList+16&gt;, 
            Args = {&lt;llvm::SmallVectorImpl&lt;llvm::opt::Arg*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;llvm::opt::Arg*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;llvm::opt::Arg*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {
                      BeginX = 0x754d62260010, Size = 14274, Capacity = 17407}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;llvm::opt::Arg*, 16&gt;&gt; = {
                InlineElts = "\300]\023\233\003^\000\000\000\000\000\000\000\000\000\000\360\006\246\343\375\177\000\000\000\a\246\343\375\177\000\000\367&amp;F\215\003^\000\000@<!-- -->_\200\231\003^\000\000p\304\023\233\003^", '\000' &lt;repeats 18 times&gt;, "@\a\246\343\375\177", '\000' &lt;repeats 18 times&gt;, "@<!-- -->_\200\231\003^\000\000@\a\246\343\375\177\000\000\324\031F\215\003^\000\000@<!-- -->_\200\231\003^\000"}, &lt;No data fields&gt;}, 
            OptRanges = {&lt;llvm::DenseMapBase&lt;llvm::DenseMap&lt;unsigned int, std::pair&lt;unsigned int, unsigned int&gt;, llvm::DenseMapInfo&lt;unsigned int, void&gt;, llvm::detail::DenseMapPair&lt;unsigned int, std::pair&lt;unsigned int, unsigned int&gt; &gt; &gt;, unsigned int, std::pair&lt;unsigned int, unsigned int&gt;, llvm::DenseMapInfo&lt;unsigned int, void&gt;, llvm::detail::DenseMapPair&lt;unsigned int, std::pair&lt;unsigned int, unsigned int&gt; &gt; &gt;&gt; = {&lt;llvm::DebugEpochBase&gt; = {
                  Epoch = 2}, &lt;No data fields&gt;}, Buckets = 0x5e039b13bc50, NumEntries = 35, NumTombstones = 0, NumBuckets = 64}}, 
          ArgStrings = {&lt;llvm::SmallVectorImpl&lt;char const*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;char const*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;char const*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {
                    BeginX = 0x754d61ac9010, Size = 14293, Capacity = 28571}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;char const*, 16&gt;&gt; = {
              InlineElts = "\274%\246\343\375\177\000\000\260\a\246\343\375\177\000\000,CE\215\003^\000\000\001\000\000\000\000\000\000\000\330\a\246\343\375\177\000\000\260\303\023\233\003^\000\000\260\303\023\233\003^\000\000\260\303\023\233\003^\000\000\340\a\246\343\375\177\000\000\360\a\246\343\375\177\000\000ҔD\215\003^\000\000\000\000\000\000\000\000\000\000@<!-- -->_\200\231\003^\000\000@<!-- -->_\200\231\003^\000\000p\304\023\233\003^\000\000\260\303\023\233\003^\000"}, &lt;No data fields&gt;}, SynthesizedStrings = std::__cxx11::list = {[0] = "--sysroot", [1] = "--hash-style", [2] = "--discard-locals", [3] = "--version-script", [4] = "--color-diagnostics=", [5] = "--thinlto-cache-policy", 
            [6] = "--call-graph-profile-sort=", [7] = "--threads"}, NumInputArgStrings = 14285}
#<!-- -->17 0x00005e038d417493 in lld::elf::link (args=..., stdoutOS=..., stderrOS=..., exitEarly=true, disableOutput=false) at /home/kxxt/Workspaces/llvm/llvm-project/lld/ELF/Driver.cpp:162
        ctx = 0x5e039b135e20
#<!-- -->18 0x00005e038d29af55 in lld::unsafeLldMain (args=..., stdoutOS=..., stderrOS=..., drivers=..., exitEarly=true) at /home/kxxt/Workspaces/llvm/llvm-project/lld/Common/DriverDispatcher.cpp:163
        argsV = {&lt;llvm::SmallVectorImpl&lt;char const*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;char const*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;char const*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x7ffde3a60f00, 
                  Size = 2, Capacity = 256}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;char const*, 256&gt;&gt; = {
            InlineElts = "}%\246\343\375\177\000\000\274%\246\343\375\177\000\0000\223\352aMu\000\000X\223\352aMu", '\000' &lt;repeats 130 times&gt;, "_\205s\227\003^\000\000\a\000\000\000\000\000\000\000g\205s\227\003^\000\000\016\000\000\000\000\000\000\000\000\000\000\361\000\000\000\000"...}, &lt;No data fields&gt;}
        d = 0x5e038d417209 &lt;lld::elf::link(llvm::ArrayRef&lt;char const*&gt;, llvm::raw_ostream&amp;, llvm::raw_ostream&amp;, bool, bool)&gt;
        r = 0
#<!-- -->19 0x00005e038d17871c in lld_main (argc=2, argv=0x7ffde3a61a38) at /home/kxxt/Workspaces/llvm/llvm-project/lld/tools/lld/lld.cpp:90
        r = 0
        args = {Data = 0x7ffde3a61a38, Length = 2}
        mainRet = std::optional = {[contained value] = -475653576}
#<!-- -->20 0x00005e038d17b730 in main (argc=2, argv=0x7ffde3a61a38) at /home/kxxt/Workspaces/llvm/llvm-project/build-debug/tools/lld/tools/lld/lld-driver.cpp:17
        X = {
          Alloc = {&lt;llvm::AllocatorBase&lt;llvm::BumpPtrAllocatorImpl&lt;llvm::MallocAllocator, 4096, 4096, 128&gt; &gt;&gt; = {&lt;No data fields&gt;}, &lt;llvm::detail::AllocatorHolder&lt;llvm::MallocAllocator&gt;&gt; = {&lt;llvm::MallocAllocator&gt; = {&lt;llvm::AllocatorBase&lt;llvm::MallocAllocator&gt;&gt; = {&lt;No data fields&gt;}, &lt;No data fields&gt;}, &lt;No data fields&gt;}, CurPtr = 0x0, End = 0x0, 
            Slabs = {&lt;llvm::SmallVectorImpl&lt;void*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;void*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;void*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x7ffde3a61890, Size = 0, 
                      Capacity = 4}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;void*, 4&gt;&gt; = {
                InlineElts = "\340b\242\231\003^\000\000\260\322\r\233\003^\000\000\220\030\246\343\375\177\000\000\260\322\r\233\003^\000"}, &lt;No data fields&gt;}, 
            CustomSizedSlabs = {&lt;llvm::SmallVectorImpl&lt;std::pair&lt;void*, unsigned long&gt; &gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;std::pair&lt;void*, unsigned long&gt;, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;std::pair&lt;void*, unsigned long&gt;, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x7ffde3a618c0, Size = 0, Capacity = 0}, &lt;No data fields&gt;}, 
                  static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;std::pair&lt;void*, unsigned long&gt;, 0&gt;&gt; = {&lt;No data fields&gt;}, &lt;No data fields&gt;}, BytesAllocated = 0, RedZoneSize = 1}, 
          Args = {&lt;llvm::SmallVectorImpl&lt;char const*&gt;&gt; = {&lt;llvm::SmallVectorTemplateBase&lt;char const*, true&gt;&gt; = {&lt;llvm::SmallVectorTemplateCommon&lt;char const*, void&gt;&gt; = {&lt;llvm::SmallVectorBase&lt;unsigned int&gt;&gt; = {BeginX = 0x7ffde3a618e0, 
                    Size = 0, Capacity = 0}, &lt;No data fields&gt;}, static TakesParamByValue = true}, &lt;No data fields&gt;}, &lt;llvm::SmallVectorStorage&lt;char const*, 0&gt;&gt; = {&lt;No data fields&gt;}, &lt;No data fields&gt;}, StackPrinter = std::optional = {
            [contained value] = {&lt;llvm::PrettyStackTraceEntry&gt; = {_vptr.PrettyStackTraceEntry = 0x5e039935c010 &lt;vtable for llvm::PrettyStackTraceProgram+16&gt;, NextEntry = 0x0}, ArgC = 2, ArgV = 0x7ffde3a61a38}}}
(gdb) p buf
$19 = (uint8_t *) 0x753d62030170 "\001"
(gdb) p eSym
$20 = (llvm::object::Elf_Sym_Impl&lt;llvm::object::ELFType&lt;(llvm::endianness)1, true&gt; &gt; *) 0x753da8106000
(gdb) p *eSym
Cannot access memory at address 0x753da8106000

I understand that it can't be easily reproduced as cross-compiling chromium to riscv64 requries lots of patches and building chromium takes a lot of time. So please ask me for more information if the above backtrace is not sufficient for tracing down the bug.

@MaskRay
Copy link
Member

MaskRay commented Jan 30, 2024

Can you relink the executable using the environment variable LLD_REPRODUCE=/tmp/rep.tar or specifying -Wl,--reproduce=/tmp/rep.tar and upload the reproduce tarball somewhere?

@kxxt
Copy link
Author

kxxt commented Jan 30, 2024

Can you relink the executable using the environment variable LLD_REPRODUCE=/tmp/rep.tar or specifying -Wl,--reproduce=/tmp/rep.tar and upload the reproduce tarball somewhere?

Yes. The linker haven't finished but the size of the uncompressed tarball is already 21GB. I am uncertain where I could upload it. BTW is there any way to generate a smaller reproduce tarball?

@kxxt
Copy link
Author

kxxt commented Jan 30, 2024

@MaskRay I have uploaded the zstd compressed reproduce tarball to github: https://github.com/kxxt/lld-79944-reproducer/releases/tag/original . It is split-ed into three parts due to file size limitation.

@kxxt
Copy link
Author

kxxt commented Feb 1, 2024

This issue also occurs when ThinLTO is disabled.

With ThinLTO disabled, linking with riscv64-linux-gnu-ld also results in a segfault. So gnu bfd linker might also be affected by the same bug.

@SunFengRui
Copy link

I have the same problem. Have you solved it?

@kxxt
Copy link
Author

kxxt commented Jul 25, 2024

I have the same problem. Have you solved it?

Nope.

@MaskRay
Copy link
Member

MaskRay commented Jul 27, 2024

@MaskRay I have uploaded the zstd compressed reproduce tarball to github: kxxt/lld-79944-reproducer@original (release) . It is split-ed into three parts due to file size limitation.

The link succeeded with the latest lld :)

cat repro.tar.zst.aa repro.tar.zst.ab repro.tar.zst.ac | tar -I zstd -x
cd lld-repro
/tmp/Rel/bin/ld.lld @reponse.txt 

@SunFengRui
Copy link

@MaskRay I have uploaded the zstd compressed reproduce tarball to github: kxxt/lld-79944-reproducer@original (release) . It is split-ed into three parts due to file size limitation.

The link succeeded with the latest lld :)

cat repro.tar.zst.aa repro.tar.zst.ab repro.tar.zst.ac | tar -I zstd -x
cd lld-repro
/tmp/Rel/bin/ld.lld @reponse.txt 

I have a similar problem: #100511. Can you help me take a look?

@kxxt
Copy link
Author

kxxt commented Aug 3, 2024

The link succeeded with the latest lld :)

Yes. I could also confirm it. Cross compiling chromium 126.0.6478.185 for riscv64 using clang and lld version 19.0.0git (https://chromium.googlesource.com/external/github.com/llvm/llvm-project 76ea5feb1f12ab35547a3aa1bc1b84d4bca69aa7) succeeds.

Do you happen to know the commit that fixes this bug? I suspect bfd linker is also affected but haven't checked it on chromium 126.0.6478.185.

@kxxt kxxt closed this as completed Aug 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crash Prefer [crash-on-valid] or [crash-on-invalid] lld:ELF
Projects
None yet
Development

No branches or pull requests

5 participants