Skip to content

mold segfaults when linking GCC-generated code with --gdb-index #436

Closed
@sicherha

Description

@sicherha

I initially thought this is identical to #431, but the error pattern is slightly different and the problem still persists with c90801e.

How to reproduce

This is on Fedora 35 x86_64, with GCC 11.2.1. The script is a distilled version of test/elf/gdb-index.sh.

cat <<EOF | gcc -o b.o -c -xc -ggnu-pubnames -g -
void greet() {
}
EOF

cat <<EOF | gcc -o d.o -c -xc -ggnu-pubnames -g -
int main() {
}
EOF

gcc -B. -o exe1 b.o d.o -Wl,--gdb-index -Wl,--no-fork

Object files are here:
https://www4.cs.fau.de/~erhardt/foo/mold/gdb-index-segfault/b.o
https://www4.cs.fau.de/~erhardt/foo/mold/gdb-index-segfault/d.o

Output

mold: error: b.o: --gdb-index: .debug_abbrev does not contain DW_TAG_compile_unit
mold: error: b.o: --gdb-index: unknown debug info form: 0x0collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core dumped
compilation terminated.

Stack trace

Program terminated with signal SIGSEGV, Segmentation fault.
#0  mold::read_uleb (buf=<synthetic pointer>: 0x7f472f5ebd56 <error: Cannot access memory at address 0x7f472f5ebd56>) at elf/../mold.h:257
257       } while (byte & 0x80);
[Current thread is 1 (Thread 0x7f472e2cc640 (LWP 337936))]
(gdb) bt
#0  mold::read_uleb (buf=<synthetic pointer>: 0x7f472f5ebd56 <error: Cannot access memory at address 0x7f472f5ebd56>) at elf/../mold.h:257
#1  mold::elf::GdbIndexSection<mold::elf::X86_64>::read_address_areas (this=<optimized out>, ctx=..., file=..., offset=offset@entry=73) at elf/output-chunks.cc:2521
#2  0x0000000000643e30 in mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}::operator()(mold::elf::ObjectFile<mold::elf::X86_64>*) const (__closure=0x7ffd944ab5e0, file=0x2bb841c0e80) at elf/output-chunks.cc:2381
#3  0x00000000006b1ef1 in tbb::detail::d2::parallel_for_each_operator_selector<mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}>::call<mold::elf::ObjectFile<mold::elf::X86_64>*&, tbb::detail::d2::feeder_impl<mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*> >(mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1} const&, mold::elf::ObjectFile<mold::elf::X86_64>*&, tbb::detail::d2::feeder_impl<mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>*) (item=<optimized out>, body=...) at third-party/tbb/include/tbb/../oneapi/tbb/parallel_for_each.h:87
#4  tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>::operator()(tbb::detail::d1::blocked_range<unsigned long>) const (range=..., this=0x2bb84280ed8) at third-party/tbb/include/tbb/../oneapi/tbb/parallel_for_each.h:400
#5  tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>::run_body(tbb::detail::d1::blocked_range<unsigned long>&) (r=..., this=0x2bb84280e80)
    at third-party/tbb/include/tbb/../oneapi/tbb/parallel_for.h:119
#6  tbb::detail::d1::dynamic_grainsize_mode<tbb::detail::d1::adaptive_mode<tbb::detail::d1::auto_partition_type> >::work_balance<tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>, tbb::detail::d1::blocked_range<unsigned long> >(tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>&, tbb::detail::d1::blocked_range<unsigned long>&, tbb::detail::d1::execution_data&) (this=this@entry=0x2bb84280ef8, start=warning: RTTI symbol not found for class 'tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>'

..., range=..., ed=...) at third-party/tbb/include/tbb/../oneapi/tbb/partitioner.h:447
#7  0x00000000006b24aa in tbb::detail::d1::partition_type_base<tbb::detail::d1::auto_partition_type>::execute<tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>, tbb::detail::d1::blocked_range<unsigned long> >(tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>&, tbb::detail::d1::blocked_range<unsigned long>&, tbb::detail::d1::execution_data&) (ed=..., range=..., start=warning: RTTI symbol not found for class 'tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>'
..., this=0x2bb84280ef8)
    at third-party/tbb/include/tbb/../oneapi/tbb/partitioner.h:288
#8  tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<unsigned long>, tbb::detail::d2::parallel_for_body_wrapper<__gnu_cxx::__normal_iterator<mold::elf::ObjectFile<mold::elf::X86_64>**, std::vector<mold::elf::ObjectFile<mold::elf::X86_64>*, std::allocator<mold::elf::ObjectFile<mold::elf::X86_64>*> > >, mold::elf::GdbIndexSection<mold::elf::X86_64>::write_address_areas(mold::elf::Context<mold::elf::X86_64>&)::{lambda(mold::elf::ObjectFile<mold::elf::X86_64>*)#1}, mold::elf::ObjectFile<mold::elf::X86_64>*>, tbb::detail::d1::auto_partitioner const>::execute(tbb::detail::d1::execution_data&) (this=0x2bb84280e80, ed=...) at third-party/tbb/include/tbb/../oneapi/tbb/parallel_for.h:172
#9  0x000000000083e64a in tbb::detail::r1::task_dispatcher::local_wait_for_all<false, tbb::detail::r1::outermost_worker_waiter> (waiter=..., t=0x2bb84280e80, this=0x2bb84270a00)
    at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/task_dispatcher.h:322
#10 tbb::detail::r1::task_dispatcher::local_wait_for_all<tbb::detail::r1::outermost_worker_waiter> (waiter=..., t=0x0, this=0x2bb84270a00) at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/task_dispatcher.h:463
#11 tbb::detail::r1::arena::process (this=<optimized out>, tls=...) at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/arena.cpp:138
#12 0x000000000084c3ab in tbb::detail::r1::market::process (this=0x2bb841d0080, j=...) at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/market.cpp:597
#13 0x000000000084f074 in tbb::detail::r1::rml::private_worker::run (this=0x2bb841f7f00) at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/private_server.cpp:267
#14 0x000000000084f2c9 in tbb::detail::r1::rml::private_worker::thread_routine (arg=<optimized out>) at /home/erhardt/Projects/mold/third-party/tbb/src/tbb/private_server.cpp:221
#15 0x00007f472eb61b1a in start_thread (arg=<optimized out>) at pthread_create.c:443
#16 0x00007f472ebe6660 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions