TLS initialization crashes for 32 bit crosscompiled on 64-bit x86
Original Reporter info from Mantis: BeniBela @benibela
-
Reporter name: Benito van der Zander
Original Reporter info from Mantis: BeniBela @benibela
- Reporter name: Benito van der Zander
Description:
A 32-bit program does not start when compiled and run on 64-bit due to INITTLS failure. Even if it is just begin end.
Additional information:
Starting program: /tmp/project1
Program received signal SIGSEGV, Segmentation fault.
0x08069710 in SYSTEM_$$_INITTLS ()
(gdb) bt
0 0x08069710 in SYSTEM_$$_INITTLS ()
1 0x0804902b in SI_PRC_$$__FPC_PROC_START ()
(gdb) disassemble
Dump of assembler code for function SYSTEM_$$_INITTLS:
0x08069670 <+0>: push ebp
0x08069671 <+1>: mov ebp,esp
0x08069673 <+3>: lea esp,[esp-0xc]
0x08069677 <+7>: push ebx
0x08069678 <+8>: push esi
0x08069679 <+9>: push edi
0x0806967a <+10>: mov edx,DWORD PTR ds:0x8073d50
0x08069680 <+16>: jmp 0x806968b <SYSTEM_$$_INITTLS+27>
0x08069682 <+18>: lea esi,[esi+0x0]
0x08069688 <+24>: add edx,0x4
0x0806968b <+27>: cmp DWORD PTR [edx],0x0
0x0806968e <+30>: jne 0x8069688 <SYSTEM_$$_INITTLS+24>
0x08069690 <+32>: add edx,0x4
0x08069693 <+35>: mov DWORD PTR [ebp-0xc],0x0
0x0806969a <+42>: xor ecx,ecx
0x0806969c <+44>: jmp 0x80696e3 <SYSTEM_$$_INITTLS+115>
0x0806969e <+46>: mov esi,esi
0x080696a0 <+48>: mov eax,DWORD PTR [edx]
0x080696a2 <+50>: cmp eax,0x3
0x080696a5 <+53>: jl 0x80696e0 <SYSTEM_$$_INITTLS+112>
0x080696a7 <+55>: sub eax,0x3
0x080696aa <+58>: je 0x80696c0 <SYSTEM_$$_INITTLS+80>
0x080696ac <+60>: sub eax,0x2
0x080696af <+63>: je 0x80696d0 <SYSTEM_$$_INITTLS+96>
0x080696b1 <+65>: jmp 0x80696e0 <SYSTEM_$$_INITTLS+112>
0x080696b3 <+67>: lea esi,[esi+eiz*1+0x0]
0x080696ba <+74>: lea esi,[esi+0x0]
0x080696c0 <+80>: mov eax,DWORD PTR [edx+0x4]
0x080696c3 <+83>: mov DWORD PTR [ebp-0xc],eax
0x080696c6 <+86>: jmp 0x80696e0 <SYSTEM_$$_INITTLS+112>
0x080696c8 <+88>: lea esi,[esi+eiz*1+0x0]
0x080696cf <+95>: nop
0x080696d0 <+96>: mov ecx,DWORD PTR [edx+0x4]
0x080696d3 <+99>: lea esi,[esi+eiz*1+0x0]
0x080696da <+106>: lea esi,[esi+0x0]
0x080696e0 <+112>: add edx,0x8
0x080696e3 <+115>: cmp DWORD PTR [edx],0x0
0x080696e6 <+118>: jne 0x80696a0 <SYSTEM_$$_INITTLS+48>
0x080696e8 <+120>: mov BYTE PTR [ebp-0x8],0x0
0x080696ec <+124>: mov DWORD PTR [ebp-0x4],0x0
0x080696f3 <+131>: mov di,cx
0x080696f6 <+134>: cmp di,0x1
0x080696fb <+139>: jl 0x8069769 <SYSTEM_$$_INITTLS+249>
0x08069701 <+145>: xor bx,bx
0x08069704 <+148>: lea esi,[esi+eiz*1+0x0]
0x08069708 <+152>: add bx,0x1
--Type <RET> for more, q to quit, c to continue without paging--
0x0806970d <+157>: mov eax,DWORD PTR [ebp-0xc]
=> 0x08069710 <+160>: mov edx,DWORD PTR [eax]
0x08069712 <+162>: cmp edx,0x2
0x08069715 <+165>: jb 0x8069760 <SYSTEM_$$_INITTLS+240>
0x08069717 <+167>: sub edx,0x2
0x0806971a <+170>: je 0x80697a7 <SYSTEM_$$_INITTLS+311>
0x08069720 <+176>: sub edx,0x5
0x08069723 <+179>: jne 0x8069760 <SYSTEM_$$_INITTLS+240>
0x08069725 <+181>: lea esi,[esi+eiz*1+0x0]
0x0806972c <+188>: lea esi,[esi+eiz*1+0x0]
0x08069730 <+192>: mov BYTE PTR [ebp-0x8],0x1
0x08069734 <+196>: mov eax,DWORD PTR [ebp-0xc]
0x08069737 <+199>: mov edx,DWORD PTR [eax+0x14]
0x0806973a <+202>: add DWORD PTR [ebp-0x4],edx
0x0806973d <+205>: mov eax,DWORD PTR [ebp-0xc]
0x08069740 <+208>: mov esi,DWORD PTR [eax+0x1c]
0x08069743 <+211>: lea eax,[esi-0x1]
0x08069746 <+214>: add eax,DWORD PTR [ebp-0x4]
0x08069749 <+217>: mov ecx,eax
0x0806974b <+219>: xor edx,edx
0x0806974d <+221>: div esi
0x0806974f <+223>: mov eax,ecx
0x08069751 <+225>: sub eax,edx
0x08069753 <+227>: mov DWORD PTR [ebp-0x4],eax
0x08069756 <+230>: lea esi,[esi+eiz*1+0x0]
0x0806975d <+237>: lea esi,[esi+0x0]
0x08069760 <+240>: add DWORD PTR [ebp-0xc],0x20
0x08069764 <+244>: cmp di,bx
0x08069767 <+247>: jg 0x8069708 <SYSTEM_$$_INITTLS+152>
0x08069769 <+249>: mov al,BYTE PTR [ebp-0x8]
0x0806976c <+252>: test al,al
0x0806976e <+254>: je 0x80697a7 <SYSTEM_$$_INITTLS+311>
0x08069770 <+256>: mov eax,DWORD PTR [ebp-0x4]
0x08069773 <+259>: lea edx,[eax+0xfff]
0x08069779 <+265>: mov eax,edx
0x0806977b <+267>: and eax,0xfff
0x08069780 <+272>: sub edx,eax
0x08069782 <+274>: lea eax,[edx+0x4]
0x08069785 <+277>: mov DWORD PTR [ebp-0x4],eax
0x08069788 <+280>: push 0x22
0x0806978a <+282>: push 0xffffffff
0x0806978c <+284>: push 0x0
0x0806978e <+286>: push 0x0
0x08069790 <+288>: mov edx,DWORD PTR [ebp-0x4]
0x08069793 <+291>: mov ecx,0x3
0x08069798 <+296>: xor eax,eax
0x0806979a <+298>: call 0x804abd0 <SYSTEM_$$_FPMMAP$POINTER$LONGWORD$LONGINT$LONGINT$LONGINT$INT64$$POINTER>
--Type <RET> for more, q to quit, c to continue without paging--
0x0806979f <+303>: mov edx,DWORD PTR [ebp-0x4]
0x080697a2 <+306>: call 0x8069600 <SYSTEM_$$_FPSET_TLS$POINTER$LONGWORD$$LONGINT>
0x080697a7 <+311>: pop edi
0x080697a8 <+312>: pop esi
0x080697a9 <+313>: pop ebx
0x080697aa <+314>: mov esp,ebp
0x080697ac <+316>: pop ebp
0x080697ad <+317>: ret
End of assembler dump.
(gdb)
But it works with uses cthreads;
Mantis conversion info:
- Mantis ID: 35107
- OS: linux
- OS Build: opensuse
- Build: r40721
- Platform: amd64
- Version: 3.3.1
- Monitored by: » alexs75 (Lagunov Aleksey), » Cyrax (Cyrax)