February 12, 2020
https://issues.dlang.org/show_bug.cgi?id=20578

          Issue ID: 20578
           Summary: Parallel GC causes segfault in dl
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: regression
          Priority: P1
         Component: druntime
          Assignee: nobody@puremagic.com
          Reporter: dlang-bugzilla@thecybershadow.net
                CC: r.sagitario@gmx.de

I'm seeing the following problem on an Ubuntu 16.04 server:

===============================================================================
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /tmp/gc-test/test_program...done.
Starting program: /tmp/gc-test/test_program --help
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff7ff7700 (LWP 16618)]
[New Thread 0x7ffff7ff3700 (LWP 16619)]
[New Thread 0x7ffff7fef700 (LWP 16620)]
[New Thread 0x7ffff7feb700 (LWP 16621)]
[New Thread 0x7ffff7fe7700 (LWP 16622)]
[New Thread 0x7ffff7fe3700 (LWP 16623)]
[New Thread 0x7ffff7fd8700 (LWP 16624)]

Thread 2 "test_program" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7ff7700 (LWP 16618)]
0x00007ffff7de8981 in _dl_name_match_p (name=0x51b9b2 "libc.so.6",
map=map@entry=0x7ffff7ffe168) at dl-misc.c:288
288     dl-misc.c: No such file or directory.
(gdb) where
#0  0x00007ffff7de8981 in _dl_name_match_p (name=0x51b9b2 "libc.so.6",
map=map@entry=0x7ffff7ffe168) at dl-misc.c:288
#1  0x00007ffff7de0fe1 in do_lookup_x (undef_name=undef_name@entry=0x51bb12
"sched_yield", new_hash=new_hash@entry=3838766306,
    old_hash=old_hash@entry=0x7ffff7ff5160, ref=0x44bcf8,
result=result@entry=0x7ffff7ff5170, scope=<optimised out>, i=<optimised out>,
    version=0x7ffff7fdd700, flags=5, skip=0x0, type_class=1,
undef_map=0x7ffff7ffe168) at dl-lookup.c:554
#2  0x00007ffff7de1b1f in _dl_lookup_symbol_x (undef_name=0x51bb12
"sched_yield", undef_map=0x7ffff7ffe168, ref=ref@entry=0x7ffff7ff5228,
    symbol_scope=0x7ffff7ffe4c0, version=0x7ffff7fdd700,
type_class=type_class@entry=1, flags=5, skip_map=0x0) at dl-lookup.c:829
#3  0x00007ffff7de6ac6 in _dl_fixup (l=<optimised out>, reloc_arg=<optimised
out>) at ../elf/dl-runtime.c:111
#4  0x00007ffff7dee923 in _dl_runtime_resolve_avx () at
../sysdeps/x86_64/dl-trampoline.h:112
#5  0x00007ffff78e6c20 in ?? () from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x00007ffff7ff5700 in ?? ()
#7  0x00007ffff7dee923 in _dl_runtime_resolve_avx () at
../sysdeps/x86_64/dl-trampoline.h:112
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(failed reverse-i-search)`thread': Quit
(gdb) thread apply all backtrace

Thread 8 (Thread 0x7ffff7fd8700 (LWP 16624)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7fd8700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 7 (Thread 0x7ffff7fe3700 (LWP 16623)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7fe3700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 6 (Thread 0x7ffff7fe7700 (LWP 16622)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7fe7700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 5 (Thread 0x7ffff7feb700 (LWP 16621)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7feb700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 4 (Thread 0x7ffff7fef700 (LWP 16620)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7fef700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 3 (Thread 0x7ffff7ff3700 (LWP 16619)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e05ce6 in _D2gc4impl12conservativeQw3Gcx14scanBackgroundMFNbZv
()
#4  0x0000000000e0cfff in
_D4core6thread8osthread20createLowLevelThreadFNbNiDFNbZvkDFNbZvZ20thread_lowlevelEntryUNbPvZQd
()
#5  0x00007ffff78ec6ba in start_thread (arg=0x7ffff7ff3700) at
pthread_create.c:333
#6  0x00007ffff6cf741d in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Thread 2 (Thread 0x7ffff7ff7700 (LWP 16618)):
#0  0x00007ffff7de8981 in _dl_name_match_p (name=0x51b9b2 "libc.so.6",
map=map@entry=0x7ffff7ffe168) at dl-misc.c:288
#1  0x00007ffff7de0fe1 in do_lookup_x (undef_name=undef_name@entry=0x51bb12
"sched_yield", new_hash=new_hash@entry=3838766306,
old_hash=old_hash@entry=0x7ffff7ff5160, ref=0x44bcf8,
result=result@entry=0x7ffff7ff5170, scope=<optimised out>, i=<optimised out>,
    version=0x7ffff7fdd700, flags=5, skip=0x0, type_class=1,
undef_map=0x7ffff7ffe168) at dl-lookup.c:554
#2  0x00007ffff7de1b1f in _dl_lookup_symbol_x (undef_name=0x51bb12
"sched_yield", undef_map=0x7ffff7ffe168, ref=ref@entry=0x7ffff7ff5228,
symbol_scope=0x7ffff7ffe4c0, version=0x7ffff7fdd700,
type_class=type_class@entry=1, flags=5, skip_map=0x0) at dl-lookup.c:829
#3  0x00007ffff7de6ac6 in _dl_fixup (l=<optimised out>, reloc_arg=<optimised
out>) at ../elf/dl-runtime.c:111
#4  0x00007ffff7dee923 in _dl_runtime_resolve_avx () at
../sysdeps/x86_64/dl-trampoline.h:112
#5  0x00007ffff78e6c20 in ?? () from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x00007ffff7ff5700 in ?? ()
#7  0x00007ffff7dee923 in _dl_runtime_resolve_avx () at
../sysdeps/x86_64/dl-trampoline.h:112
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Thread 1 (Thread 0x7ffff7fdae80 (LWP 16614)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at
../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1  0x0000000000e0cbf2 in
_D4core4sync5event5Event4waitMFNbNiSQBi4time8DurationZb ()
#2  0x0000000000e0b395 in
_D2gc4impl12conservativeQw3Gcx__T21pullFromScanStackImplVbi0ZQBcMFNbZv ()
#3  0x0000000000e0580d in _D2gc4impl12conservativeQw3Gcx12markParallelMFNbbZv
()
#4  0x0000000000e0500a in _D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm ()
#5  0x0000000000e0334c in
_D2gc4impl12conservativeQw3Gcx10smallAllocMFNbmKmkxC8TypeInfoZPv ()
#6  0x0000000000e08d29 in
_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs12mallocNoSyncMFNbmkKmxC8TypeInfoZPvS_DQEgQEgQEeQEp10mallocTimelS_DQFiQFiQFgQFr10numMallocslTmTkTmTxQCzZQFcMFNbKmKkKmKxQDsZQDl
()
#7  0x0000000000e0097e in
_D2gc4impl12conservativeQw14ConservativeGC6mallocMFNbmkxC8TypeInfoZPv ()
#8  0x0000000000d6a103 in gc_malloc ()
#9  0x0000000000dc7ead in
_D2rt3aaA11fakeEntryTIFKSQxQw4ImplxC8TypeInfoxQlZC15TypeInfo_Struct ()
#10 0x0000000000dc75d0 in
_D2rt3aaA4Impl6__ctorMFNcMxC25TypeInfo_AssociativeArraymZSQCeQCeQCd ()
#11 0x0000000000d6a806 in _aaGetX ()
#12 0x0000000000d6a77d in _aaGetY ()
#13 0x0000000000caf605 in
_D3std6getopt__T10getoptImplTAyaTPbZQuFNfKAQoKSQBtQBs13configurationKSQCqQCp12GetoptResultKCQDmQDl15GetOptExceptionHQDjAvQgQDqQDpZv
(_param_7=0x7fffffffd9d0, _param_6=..., visitedShortOpts=...,
visitedLongOpts=..., excep=@0x7fffffffd908: 0x0,
    rslt=..., cfg=..., args=...) at
/home/vladimir/dlang/dmd-2.090.0/linux/bin64/../../src/phobos/std/getopt.d:727
#14 0x0000000000cb9e90 in
_D3std6getopt__T10getoptImplTAyaTPbTQhTQgZQBaFNfKAQvKSQCaQBz13configurationKSQCxQCw12GetoptResultKCQDtQDs15GetOptExceptionHQDqAvQgQDxQDwQEdQEcZv
(_param_9=0x7fffffffd9d0, _param_8=..., _param_7=0x7fffffffd990, _param_6=...,
    visitedShortOpts=..., visitedLongOpts=..., excep=@0x7fffffffd908: 0x0,
rslt=..., cfg=..., args=...) at
/home/vladimir/dlang/dmd-2.090.0/linux/bin64/../../src/phobos/std/getopt.d:762
#15 0x0000000000cb9899 in
_D3std6getopt__T10getoptImplTEQBcQBb6configTAyaTPbTQhTQgZQBpFNfKAQvKSQCpQCo13configurationKSQDmQDl12GetoptResultKCQEiQEh15GetOptExceptionHQDqAvQgQEmQEaQDzQEgQEfZv
(_param_10=0x7fffffffd9d0, _param_9=..., _param_8=0x7fffffffd990, _param_7=...,
    _param_6=<incomplete type>, visitedShortOpts=..., visitedLongOpts=...,
excep=@0x7fffffffd908: 0x0, rslt=..., cfg=..., args=...) at
/home/vladimir/dlang/dmd-2.090.0/linux/bin64/../../src/phobos/std/getopt.d:699
#16 0x0000000000cb97ed in
_D3std6getopt__TQkTEQsQq6configTAyaTPbTQhTQgZQBnFNfKAQvQBkQBaQzQBfQBeZSQCrQCq12GetoptResult
(rslt=0x7fffffffd9e0, _param_5=0x7fffffffd9d0, _param_4=...,
_param_3=0x7fffffffd990, _param_2=..., _param_1=<incomplete type>, args=...)
    at
/home/vladimir/dlang/dmd-2.090.0/linux/bin64/../../src/phobos/std/getopt.d:435
#17 0x0000000000cbde08 in
_D2ae5utils6funopt__TQkS_DQyQxQt18__unittest_L636_C1FZ7Actions2f1FbZvVSQCrQCrQCo12FunOptConfigS1nS_DQDuQDuQDr__T14funoptDispatchTSQEyQEyQEvQEdFZQDmVQDaS1nS_DQFzQFzQFwQFeFZ8usageFunFNbNiNfAyaZvZQDdFAQlZ3funMFQuQmZ__T12descUsageFunVQBra17_506572666f726d20616374696f6e206631ZQCfFNbNfQDpZvZQKpFQDpZv
(args=...) at lib/ae/utils/funopt.d:245
#18 0x0000000000cbd946 in
_D2ae5utils6funopt__T14funoptDispatchTSQBlQBlQBi18__unittest_L636_C1FZ7ActionsVSQDaQDaQCx12FunOptConfigS1nS_DQEdQEdQEaQCsFZ8usageFunFNbNiNfAyaZvZQEuFAQlZ3funMFQuQmZv
(__capture=0x7ffff7fd2660, actionArguments=..., action=...)
    at lib/ae/utils/funopt.d:594
#19 0x0000000000cc0adb in
_D2ae5utils6funopt__TQkS_DQyQxQt__T14funoptDispatchTSQBzQBzQBw18__unittest_L636_C1FZ7ActionsVSQDoQDoQDl12FunOptConfigS1nS_DQErQErQEoQCsFZ8usageFunFNbNiNfAyaZvZQEuFAQlZ3funMFQuQmZvVQDjS1A1i6S_DQHiQHiQHf__TQGnTQGaVQEpS1nS_DQIlQIlQIiQGmFZQDuQDoZQHzFQDfZ10myUsageFunFQEgZvZQJyMFQEhZv
(__capture=0x7ffff7fd2660, args=...) at lib/ae/utils/funopt.d:302
#20 0x0000000000cbd7c6 in
_D2ae5utils6funopt__T14funoptDispatchTSQBlQBlQBi18__unittest_L636_C1FZ7ActionsVSQDaQDaQCx12FunOptConfigS1nS_DQEdQEdQEaQCsFZ8usageFunFNbNiNfAyaZvZQEuFAQlZv
(args=...) at lib/ae/utils/funopt.d:608
#21 0x0000000000cab541 in ae.utils.funopt.__unittest_L636_C1() () at
lib/ae/utils/funopt.d:668
#22 0x0000000000ce928f in ae.utils.funopt.__modtest() ()
#23 0x0000000000dc362d in
core.runtime.runModuleUnitTests().__foreachbody2(object.ModuleInfo*) ()
#24 0x0000000000d5d3a8 in
_D6object10ModuleInfo7opApplyFMDFPSQBhQBdZiZ9__lambda2MFyPSQCfQCbZi ()
#25 0x0000000000d71d1c in
_D2rt5minfo17moduleinfos_applyFMDFyPS6object10ModuleInfoZiZ14__foreachbody2MFKSQCz19sections_elf_shared3DSOZi
()
#26 0x0000000000d72571 in
_D2rt19sections_elf_shared3DSO7opApplyFMDFKSQBqQBqQyZiZi ()
#27 0x0000000000d71caa in rt.minfo.moduleinfos_apply(scope
int(immutable(object.ModuleInfo*)) delegate) ()
#28 0x0000000000d5d37a in _D6object10ModuleInfo7opApplyFMDFPSQBhQBdZiZi ()
#29 0x0000000000dc346a in runModuleUnitTests ()
#30 0x0000000000d6c109 in _D2rt6dmain212_d_run_main2UAAamPUQgZiZ6runAllMFZv ()
#31 0x0000000000d6c095 in
_D2rt6dmain212_d_run_main2UAAamPUQgZiZ7tryExecMFMDFZvZv ()
#32 0x0000000000d6bffe in _d_run_main2 ()
#33 0x0000000000d6bdba in _d_run_main ()
#34 0x0000000000d01086 in main (argc=2, argv=0x7fffffffe4b8) at
/home/vladimir/dlang/dmd-2.090.0/linux/bin64/../../src/druntime/import/core/internal/entrypoint.d:34
#35 0x00007ffff6c10830 in __libc_start_main (main=0xd01064 <main>, argc=2,
argv=0x7fffffffe4b8, init=<optimised out>, fini=<optimised out>,
rtld_fini=<optimised out>, stack_end=0x7fffffffe4a8) at ../csu/libc-start.c:291
#36 0x00000000009f9a49 in _start ()
===============================================================================

The program crashes in this manner about 50% of the time on start-up.

The program was compiled with DMD 2.090.0, with -g -debug -cov.

The problem does not occur if parallel GC is switched off using --DRT-gcopt=parallel:0.

I'm not sure why dl and the GC are running at the same time. It looks like it is trying to link sched_yield lazily? Perhaps there is a thread safety bug in (this version of) dl?

--