Hi,

When one compiles kernel with most symbols hidden (which also hides 
completely STD C++ library), the tst-tls-pie.so crashes like so:

#0  0x00000000402da5b2 in processor::cli_hlt () at arch/x64/processor.hh:247
#1  arch::halt_no_interrupts () at arch/x64/arch.hh:48
#2  osv::halt () at arch/x64/power.cc:26
#3  0x00000000402211a0 in abort (fmt=fmt@entry=0x4049aef3 "Aborted\n") at 
runtime.cc:137
#4  0x00000000402211b2 in abort () at runtime.cc:103
#5  0x000000004039cade in osv::generate_signal (siginfo=..., 
ef=0xffff800000e87068) at libc/signal.cc:130
#6  0x000000004039cb9f in osv::handle_mmap_fault 
(addr=addr@entry=18446744073709547520, sig=sig@entry=11, 
ef=ef@entry=0xffff800000e87068)
    at libc/signal.cc:145
#7  0x000000004028709b in mmu::vm_sigsegv (ef=0xffff800000e87068, 
addr=18446744073709547520) at core/mmu.cc:1334
#8  mmu::vm_fault (addr=18446744073709547520, 
addr@entry=18446744073709551592, ef=ef@entry=0xffff800000e87068) at 
core/mmu.cc:1354
#9  0x00000000402d3d90 in page_fault (ef=0xffff800000e87068) at 
arch/x64/mmu.cc:42
#10 <signal handler called>
#11 0x0000100000156cf7 in std::ostream::sentry::sentry 
(this=0x200000200df0, __os=...)
    at 
/usr/src/debug/gcc-10.3.1-1.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/ostream.tcc:51
#12 0x000010000015743c in std::__ostream_insert<char, 
std::char_traits<char> > (__out=..., __s=0x40303a "PASS", __n=__n@entry=4)
    at 
/usr/src/debug/gcc-10.3.1-1.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/ostream_insert.h:82
#13 0x0000000000401ccf in std::operator<< <std::char_traits<char> > 
(__s=<optimized out>, __out=...)
    at /usr/include/c++/10/bits/char_traits.h:371
#14 report (ok=<optimized out>, msg="v7 in init function") at 
/home/wkozaczuk/projects/osv-true-master/tests/tst-tls.cc:57
#15 0x00000000004014b3 in before_main () at 
/home/wkozaczuk/projects/osv-true-master/tests/tst-tls.cc:127
#16 0x00000000402972c5 in elf::object::run_init_funcs 
(this=0xffffa0000094a600, argc=argc@entry=1, 
argv=argv@entry=0xffffa0000094a400)
    at core/elf.cc:1178
#17 0x0000000040298a0b in elf::program::init_library (this=<optimized out>, 
argc=1, argv=0xffffa0000094a400) at core/elf.cc:1500
#18 0x000000004020c239 in osv::application::main (this=0xffffa0000094cc10) 
at core/app.cc:319
#19 0x0000000040365cb9 in operator() (app=<optimized out>, __closure=0x0) 
at core/app.cc:236
#20 _FUN () at core/app.cc:238
#21 0x0000000040398a66 in operator() (__closure=0xffffa00000abda00) at 
libc/pthread.cc:116
#22 std::__invoke_impl<void, pthread_private::pthread::pthread(void* 
(*)(void*), void*, sigset_t, const 
pthread_private::thread_attr*)::<lambda()>&> (__f=...) at 
/usr/include/c++/10/bits/invoke.h:60
#23 std::__invoke_r<void, pthread_private::pthread::pthread(void* 
(*)(void*), void*, sigset_t, const 
pthread_private::thread_attr*)::<lambda()>&> (__fn=...) at 
/usr/include/c++/10/bits/invoke.h:153
#24 std::_Function_handler<void(), pthread_private::pthread::pthread(void* 
(*)(void*), void*, sigset_t, const 
pthread_private::thread_attr*)::<lambda()> >::_M_invoke(const 
std::_Any_data &) (__functor=...) at 
/usr/include/c++/10/bits/std_function.h:291
#25 0x00000000403391ea in sched::thread::main (this=0xffff800000e82040) at 
core/sched.cc:1267
#26 sched::thread_main_c (t=0xffff800000e82040) at 
arch/x64/arch-switch.hh:325
#27 0x00000000402d3b33 in thread_main () at arch/x64/entry.S:116

I have been researching this for a bit and realized that when I change the 
report() function not use std::cout but instead use printf() like so:

printf("%s: %s\n", ok ? "PASS" : "FAIL", msg.c_str());
the crash goes away.

I knew something was wrong with the initialization of some objects but 
could not quite pin it down. Then I tried to run the tst-tls-pie.so on the 
Linux host (it is a pie) and it crashed with a segmentation fault. This 
made me think that maybe something is wrong with the test program itself. 

Finally, I found this on the internet 
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94810 - where somebody tried 
to compile and run a program with a similar construct: std::cout used in 
the __constructor__ annotated function. The stack trace looks very similar 
as well. The bug was rejected with the explanation that the 
std::ios_base::Init object may not be initialized yet if used in the 
__constructor__ annotated function.

What is interesting this test happens to work with kernel exposing all 
symbols including stdc++ because the kernel copy of std::ios_base::Init was 
already initialized.

So I think the tst-tls.cc needs to be changed to not to use std:cout in the 
report function or uses different report() from before_main(). 

Waldek

PS1. Regarding using std:cout in various __constructor__  kernel functions 
like parse_madt() (which calls debug()) and called by smp_init(), I wonder 
if we are just lucky that std::ios_base::Init is already initialized and we 
do not see similar crashes.

PS2: This printout with dynamic linker info suggests that all global 
objects in stdc++.so should have been initialized before calling 
before_main(). So why is std::ios_base::Init  not initialized yet?

ELF [tid:26, mod:5, /usr/lib/libstdc++.so.6]: Executing DT_INIT function
ELF [tid:26, mod:5, /usr/lib/libstdc++.so.6]: Finished executing DT_INIT 
function
ELF [tid:26, mod:5, /usr/lib/libstdc++.so.6]: Executing 12 DT_INIT_ARRAYSZ 
functions
ELF [tid:26, mod:5, /usr/lib/libstdc++.so.6]: Finished executing 12 
DT_INIT_ARRAYSZ functions
ELF [tid:26, mod:4, /tests/libtls.so]: Executing DT_INIT function
ELF [tid:26, mod:4, /tests/libtls.so]: Finished executing DT_INIT function
ELF [tid:26, mod:4, /tests/libtls.so]: Executing 1 DT_INIT_ARRAYSZ functions
ELF [tid:26, mod:4, /tests/libtls.so]: Finished executing 1 DT_INIT_ARRAYSZ 
functions
ELF [tid:26, mod:3, /usr/lib/libgcc_s.so.1]: Executing DT_INIT function
ELF [tid:26, mod:3, /usr/lib/libgcc_s.so.1]: Finished executing DT_INIT 
function
ELF [tid:26, mod:3, /usr/lib/libgcc_s.so.1]: Executing 2 DT_INIT_ARRAYSZ 
functions
ELF [tid:26, mod:3, /usr/lib/libgcc_s.so.1]: Finished executing 2 
DT_INIT_ARRAYSZ functions
ELF [tid:26, mod:2, /tests/tst-tls-pie.so]: Executing DT_INIT function
ELF [tid:26, mod:2, /tests/tst-tls-pie.so]: Finished executing DT_INIT 
function
ELF [tid:26, mod:2, /tests/tst-tls-pie.so]: Executing 3 DT_INIT_ARRAYSZ 
functions
Aborted

[backtrace]
0x000000004039cadd <???+1077529309>
0x000000004039cb9e <???+1077529502>
0x000000004028709a <???+1076392090>
0x00000000402d3d8f <???+1076706703>
0x00000000402d2bb6 <???+1076702134>
0x00000000004050bf <???+4214975>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/d0c7f7c0-91f4-4478-9ccf-c2cfe13c15afn%40googlegroups.com.

Reply via email to