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

Reply via email to