https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68562
Bug ID: 68562 Summary: config/i386/morestack.S misaligns stack on x86_64 Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libgcc Assignee: unassigned at gcc dot gnu.org Reporter: trippels at gcc dot gnu.org CC: ian at gcc dot gnu.org Target Milestone: --- markus@x4 tmp % gdb --args /lib/ld-2.22.90.so =go Reading symbols from /lib/ld-2.22.90.so...done. (gdb) run Starting program: /lib64/ld-2.22.90.so /usr/x86_64-pc-linux-gnu/gcc-bin/6.0.0/go [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/libthread_db.so.1". Program received signal SIGSEGV, Segmentation fault. _dl_lookup_symbol_x (undef_name=0x7ffff6e28038 "__tls_get_addr", undef_map=0x7ffff7ffa5d8, ref=ref@entry=0x7fffffffe310, symbol_scope=0x7ffff7ffa930, version=0x7ffff64c32d0, type_class=type_class@entry=1, flags=1, skip_map=0x0) at dl-lookup.c:809 809 struct sym_val current_value = { NULL, NULL }; (gdb) bt #0 _dl_lookup_symbol_x (undef_name=0x7ffff6e28038 "__tls_get_addr", undef_map=0x7ffff7ffa5d8, ref=ref@entry=0x7fffffffe310, symbol_scope=0x7ffff7ffa930, version=0x7ffff64c32d0, type_class=type_class@entry=1, flags=1, skip_map=0x0) at dl-lookup.c:809 #1 0x0000555555564413 in _dl_fixup (l=<optimized out>, reloc_arg=<optimized out>) at ../elf/dl-runtime.c:111 #2 0x000055555556ce1f in _dl_runtime_resolve_sse () at ../sysdeps/x86_64/dl-trampoline.h:112 #3 0x00007ffff79a35e7 in __generic_morestack_set_initial_sp (sp=0x7fffffffe600, len=16000) at ../../../gcc/libgcc/generic-morestack.c:508 #4 0x00007ffff79a4d37 in __stack_split_initialize () at ../../../gcc/libgcc/config/i386/morestack.S:752 #5 0x0000555555565112 in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffe510, env=env@entry=0x7fffffffe520) at dl-init.c:72 #6 0x0000555555565345 in call_init (env=0x7fffffffe520, argv=0x7fffffffe510, argc=1, l=<optimized out>) at dl-init.c:30 #7 _dl_init (main_map=0x55555577c158, argc=1, argv=0x7fffffffe510, env=0x7fffffffe520) at dl-init.c:120 #8 0x0000555555554c7a in _dl_start_user () from /lib64/ld-2.22.90.so #9 0x0000000000000002 in ?? () #10 0x0000000000000001 in ?? () #11 0x00007fffffffe86c in ?? () #12 0x0000000000000000 in ?? () (gdb) disass Dump of assembler code for function _dl_lookup_symbol_x: 0x000055555555e8a0 <+0>: push %rbp 0x000055555555e8a1 <+1>: mov %rsp,%rbp 0x000055555555e8a4 <+4>: push %r15 0x000055555555e8a6 <+6>: push %r14 0x000055555555e8a8 <+8>: push %r13 0x000055555555e8aa <+10>: push %r12 0x000055555555e8ac <+12>: mov %rdx,%r15 0x000055555555e8af <+15>: push %rbx 0x000055555555e8b0 <+16>: mov %rsi,%r14 0x000055555555e8b3 <+19>: mov %r8,%r12 0x000055555555e8b6 <+22>: sub $0xc8,%rsp 0x000055555555e8bd <+29>: movzbl (%rdi),%edx 0x000055555555e8c0 <+32>: mov %rdi,-0xa8(%rbp) 0x000055555555e8c7 <+39>: mov %rcx,-0xd0(%rbp) 0x000055555555e8ce <+46>: mov %r9d,-0xbc(%rbp) 0x000055555555e8d5 <+53>: mov 0x18(%rbp),%r13 0x000055555555e8d9 <+57>: test %dl,%dl 0x000055555555e8db <+59>: je 0x55555555ec01 <_dl_lookup_symbol_x+865> 0x000055555555e8e1 <+65>: mov %rdi,%rcx 0x000055555555e8e4 <+68>: mov $0x1505,%eax 0x000055555555e8e9 <+73>: nopl (%rax) 0x000055555555e8ec <+76>: nopw %cs:0x0(%rax,%rax,1) 0x000055555555e8f6 <+86>: nopw %cs:0x0(%rax,%rax,1) 0x000055555555e900 <+96>: mov %rax,%rsi 0x000055555555e903 <+99>: inc %rcx 0x000055555555e906 <+102>: shl $0x5,%rsi 0x000055555555e90a <+106>: add %rsi,%rax 0x000055555555e90d <+109>: add %rdx,%rax 0x000055555555e910 <+112>: movzbl (%rcx),%edx 0x000055555555e913 <+115>: test %dl,%dl 0x000055555555e915 <+117>: jne 0x55555555e900 <_dl_lookup_symbol_x+96> 0x000055555555e917 <+119>: mov %eax,%eax 0x000055555555e919 <+121>: mov %rax,-0xb0(%rbp) 0x000055555555e920 <+128>: pxor %xmm0,%xmm0 0x000055555555e924 <+132>: mov $0xffffffff,%eax 0x000055555555e929 <+137>: incq 0x21d048(%rip) # 0x55555577b978 <_rtld_local+2424> 0x000055555555e930 <+144>: test %r12,%r12 0x000055555555e933 <+147>: mov %rax,-0xa0(%rbp) => 0x000055555555e93a <+154>: movaps %xmm0,-0x90(%rbp) ... (gdb) info registers rax 0xffffffff 4294967295 rbx 0x7ffff7b78d58 140737349389656 rcx 0x7ffff6e28046 140737335427142 rdx 0x0 0 rsi 0x48fd0643617edba0 5259366826306886560 rdi 0x7ffff6e28038 140737335427128 rbp 0x7fffffffe2e8 0x7fffffffe2e8 rsp 0x7fffffffe1f8 0x7fffffffe1f8 r8 0x7ffff64c32d0 140737325576912 r9 0x1 1 r10 0x7ffff7ffa5d8 140737354114520 r11 0x7fffffffe41c 140737488348188 r12 0x7ffff64c32d0 140737325576912 r13 0x0 0 r14 0x7ffff7ffa5d8 140737354114520 r15 0x7fffffffe310 140737488347920 rip 0x55555555e93a 0x55555555e93a <_dl_lookup_symbol_x+154> eflags 0x10202 [ IF RF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 (0x7fffffffe1f8 + 0xc8) % 16 == 0 (instead of correct 8) From config/i386/morestack.S: 745 #else /* defined(__x86_64__) */ 746 747 leaq -16000(%rsp),%rax # We should have at least 16K. 748 X86_64_SAVE_NEW_STACK_BOUNDARY (ax) 749 movq %rsp,%rdi 750 movq $16000,%rsi 751 #ifdef __PIC__ 752 call __generic_morestack_set_initial_sp@PLT 753 #else 754 call __generic_morestack_set_initial_sp 755 #endif