[Bug libgcc/68562] New: config/i386/morestack.S misaligns stack on x86_64
trippels at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Nov 26 16:35:00 GMT 2015
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
More information about the Gcc-bugs
mailing list