next iteration of golang support attempt
Alexander Tormasov
a.tormasov at innopolis.ru
Sun Apr 4 00:00:07 CEST 2021
Hello Josef,
I try to fix a problem with SMP support with golang relate to nested mutex call.
As I mention couple month ago here
https://lists.genode.org/pipermail/users/2020-October/007269.html
I still have a problem with nested jmp_slot() related to call to strlen() during stack unwind call and related nested mutex leading to deadlock.
Seems that strlen() was instantiated as a call to shared libc from libgcc compiled and linked to main test-go. This is a part of compiled
What I found is the following
#0 strlen (str=str at entry=0x127d029 "zR") at /var/services/homes/admin/gen/21.02/contrib/libc-3ec28a350593879749a015a584ed24ffd7d3edce/src/lib/libc/lib/libc/string/strlen.c:100
#1 0x00000000011a8ca5 in get_cie_encoding (cie=0x127d020) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:300
#2 0x00000000011a93a3 in get_fde_encoding (f=0x12a8e8c) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.h:157
#3 _Unwind_IteratePhdrCallback (info=<optimized out>, size=<optimized out>, ptr=0x405fe190) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde-dip.c:418
#4 0x00000000000eba9e in dl_iterate_phdr (callback=callback at entry=0x11a8f60 <_Unwind_IteratePhdrCallback>, data=data at entry=0x405fe190) at /var/services/homes/admin/gen/21.02/repos/base/src/lib/ldso/exception.cc:53
#5 0x00000000011aa1cf in _Unwind_Find_FDE (pc=0x11a8797 <_Unwind_Backtrace+55>, bases=bases at entry=0x405fe4c8) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde-dip.c:469
#6 0x00000000011a6783 in uw_frame_state_for (context=context at entry=0x405fe420, fs=fs at entry=0x405fe270) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2.c:1257
#7 0x00000000011a77a0 in uw_init_context_1 (context=context at entry=0x405fe420, outer_cfa=outer_cfa at entry=0x405fe6d0, outer_ra=0x119ad62 <backtrace_full+180>) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2.c:1586
#8 0x00000000011a8798 in _Unwind_Backtrace (trace=0x119abbc <unwind>, trace_argument=0x405fe700) at /genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind.inc:295
#9 0x000000000119ad62 in backtrace_full (state=0x29000, skip=0x0, callback=0x119804e <callback>, error_callback=0x1198503 <error_callback>, data=0x405fe770) at /var/services/homes/admin/gen/21.02/contrib/libbacktrace-cabcd83bc903137f607eda3a65eb09feaa5f507e/src/lib/gcc/libbacktrace/backtrace.c:127
#9 0x000000000119ad62 in backtrace_full (state=0x29000, skip=0x0, callback=0x119804e <callback>, error_callback=0x1198503 <error_callback>, data=0x405fe770) at /var/services/homes/admin/gen/21.02/contrib/libbacktrace-cabcd83bc903137f607eda3a65eb09feaa5f507e/src/lib/gcc/libbacktrace/backtrace.c:127
#10 0x00000000011985d1 in runtime_callers (skip=0x2, locbuf=0xc42000e8d8, m=0x20, keep_thunks=0x0) at /var/services/homes/admin/gen/21.02/contrib/libgo-281260d9bdc27fefb62c00310025c54e1e629a2e/src/lib/gcc/libgo/runtime/go-callers.c:207
this is compiled inside toolchain, disassembly from here:
/usr/local/genode/tool/19.05/lib/gcc/x86_64-pc-elf/8.3.0/64/libgcc_eh.a
0000000000000460 <get_cie_encoding>:
get_cie_encoding():
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:293
460: 55 push %rbp
461: 48 89 fd mov %rdi,%rbp
464: 53 push %rbx
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:299
465: 48 8d 5f 09 lea 0x9(%rdi),%rbx
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:300
469: 48 89 df mov %rbx,%rdi
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:293
46c: 48 83 ec 18 sub $0x18,%rsp
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:300
470: e8 00 00 00 00 callq 475 <get_cie_encoding+0x15>
call above inside test-go linked to strlen() to inside libc, as you see from stack above and from disassemble test-go, where it call shared libc instance:
00000000011a8c90 <get_cie_encoding>:
get_cie_encoding():
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:293
11a8c90: 55 push %rbp
11a8c91: 48 89 fd mov %rdi,%rbp
11a8c94: 53 push %rbx
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:299
11a8c95: 48 8d 5f 09 lea 0x9(%rdi),%rbx
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:300
11a8c99: 48 89 df mov %rbx,%rdi
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:293
11a8c9c: 48 83 ec 18 sub $0x18,%rsp
/genodelabs-genode-2491eee/contrib/gcc-3cade18cf9defeefa714aa91de3b157fbad4aa18/src/noux-pkg/gcc/libgcc/unwind-dw2-fde.c:300
11a8ca0: e8 db 6b 00 00 callq 11af880 <strlen at plt>
inside callstack you can see a call to dl_iterate_phdr which contain in the very beginning
extern "C" int dl_iterate_phdr(int (*callback) (Phdr_info *info, size_t size, void *data), void *data)
{
int err = 0;
Phdr_info info;
Mutex::Guard guard(mutex());
so, we take same mutex twice here and in attempt to search for strlen() from @plt via jmp_slot…
This happens only with SMP, if I use UP configuration it is not happens.
Frankly, I am stuck a bit… this lib is a part of general toolchain, not clear why this stack unwind staff call shared libc…
may be it is necessary to recompile toolchain and library and force strlen() to be expanded to inlined one?
Sincerely,
Alexander
More information about the users
mailing list