POWERPC g++ crash in __uClibc_main

Stefani Seibold stefani at seibold.net
Mon Sep 20 07:02:13 UTC 2010


uclib is crashing in the __uClibc_main() executing a program compiled
with g++ and statical linked. A simple test application like

int main(void)
{
        return 0;
}

compile with gcc as a "C" application will run without a problem, but
when this program will be compiled with g++ it will crash when executed:

"Program received signal SIGILL, Illegal instruction."

The problem is in the current git tree and also in 0.9.31 and 0.9.30.

Here is the shortened assembler output when single stepping through the
startup code:

0x100000fc <_start+0>:	mr	r9,r1
0x100000fc <_start+4>:	rlwinm  r1,r1,0,0,27
0x10000100 <_start+8>:	lis     r13,4100
0x10000104 <_start+12>:	addi    r13,r13,-19216
0x10000108 <_start+16>:	li      r0,0
0x1000010c <_start+20>:	stwu    r1,-16(r1)
0x10000110 <_start+24>:	mtlr    r0
0x10000114 <_start+28>:	stw     r0,0(r1)

Cannot access memory at address 0x0

0x1000011c <_start+36>:	addi    r5,r9,4
0x10000120 <_start+40>:	mr      r8,r3
0x10000124 <_start+44>:	lis     r6,4096
0x10000128 <_start+48>:	addi    r6,r6,212
0x1000012c <_start+52>:	lis     r7,4098
0x10000130 <_start+56>:	addi    r7,r7,-26376
0x10000134 <_start+60>:	lis     r3,4096
0x10000138 <_start+64>:	addi    r3,r3,768
0x1000013c <_start+68>:	b       0x10015d30 <__uClibc_main>
0x10015d30 <__uClibc_main>:	stwu    r1,-176(r1)
0x10015d34 <__uClibc_main+4>:	mflr    r0
0x10015d38 <__uClibc_main+8>:	lis     r10,4099
0x10015d3c <__uClibc_main+12>:	lis     r11,4099
0x10015d40 <__uClibc_main+16>:	stw     r9,14192(r10)
0x10015d44 <__uClibc_main+20>:	lis     r9,4099
0x10015d48 <__uClibc_main+24>:	stw     r8,14208(r9)
0x10015d4c <__uClibc_main+28>:	stw     r0,180(r1)
0x10015d50 <__uClibc_main+32>:	addi    r0,r4,1
0x10015d54 <__uClibc_main+36>:	rlwinm  r0,r0,2,0,29
0x10015d58 <__uClibc_main+40>:	stw     r26,152(r1)
0x10015d5c <__uClibc_main+44>:	mr      r26,r7
0x10015d60 <__uClibc_main+48>:	add     r0,r5,r0
0x10015d64 <__uClibc_main+52>:	stw     r28,160(r1)
0x10015d68 <__uClibc_main+56>:	mr      r28,r6
0x10015d6c <__uClibc_main+60>:	stw     r29,164(r1)
0x10015d70 <__uClibc_main+64>:	mr      r29,r3
0x10015d74 <__uClibc_main+68>:	stw     r30,168(r1)
0x10015d78 <__uClibc_main+72>:	mr      r30,r4
0x10015d7c <__uClibc_main+76>:	stw     r31,172(r1)
0x10015d80 <__uClibc_main+80>:	mr      r31,r5
0x10015d84 <__uClibc_main+84>:	stw     r25,148(r1)
0x10015d88 <__uClibc_main+88>:	stw     r27,156(r1)
0x10015d8c <__uClibc_main+92>:	stw     r0,14196(r11)
0x10015d90 <__uClibc_main+96>:	lwz     r9,0(r5)
0x10015d94 <__uClibc_main+100>:	cmpw    cr7,r0,r9
0x10015d98 <__uClibc_main+104>:	bne+    cr7,0x10015da8 <__uClibc_main+120>
0x10015da8 <__uClibc_main+120>:	addi    r3,r1,8
0x10015dac <__uClibc_main+124>:	li      r4,0
0x10015db0 <__uClibc_main+128>:	li      r5,120
0x10015db4 <__uClibc_main+132>:	bl      0x10013184 <memset>
0x10015db8 <__uClibc_main+136>:	lis     r9,4099
0x10015dbc <__uClibc_main+140>:	lwz     r27,14196(r9)

<loop>
0x10015dc0 <__uClibc_main+144>:	lwz     r0,0(r27)
0x10015dc4 <__uClibc_main+148>:	addi    r27,r27,4
0x10015dc8 <__uClibc_main+152>:	cmpwi   cr7,r0,0
0x10015dcc <__uClibc_main+156>:	bne+    cr7,0x10015dc0 <__uClibc_main+144>
</loop>

<loop>
0x10015dd0 <__uClibc_main+160>:	addi    r25,r1,8
0x10015dd4 <__uClibc_main+164>:	b       0x10015df8 <__uClibc_main+200>
0x10015df8 <__uClibc_main+200>:	lwz     r3,0(r27)
0x10015dfc <__uClibc_main+204>:	cmpwi   cr7,r3,0
0x10015e00 <__uClibc_main+208>:	bne+    cr7,0x10015dd8 <__uClibc_main+168>
0x10015dd8 <__uClibc_main+168>:	cmplwi  cr7,r3,14
0x10015ddc <__uClibc_main+172>:	bgt+    cr7,0x10015df4 <__uClibc_main+196>
</loop>

<loop>
0x10015de0 <__uClibc_main+176>:	rlwinm  r3,r3,3,0,28
0x10015de4 <__uClibc_main+180>:	mr      r4,r27
0x10015de8 <__uClibc_main+184>:	add     r3,r25,r3
0x10015dec <__uClibc_main+188>:	li      r5,8
0x10015df0 <__uClibc_main+192>:	bl      0x100130ec <memcpy>
0x10015df4 <__uClibc_main+196>:	addi    r27,r27,8
0x10015df8 <__uClibc_main+200>:	lwz     r3,0(r27)
0x10015dfc <__uClibc_main+204>:	cmpwi   cr7,r3,0
0x10015e00 <__uClibc_main+208>:	bne+    cr7,0x10015dd8 <__uClibc_main+168>
0x10015dd8 <__uClibc_main+168>:	cmplwi  cr7,r3,14
0x10015ddc <__uClibc_main+172>:	bgt+    cr7,0x10015df4 <__uClibc_main+196>
</loop>

0x10015e04 <__uClibc_main+212>:	addi    r3,r1,8
0x10015e08 <__uClibc_main+216>:	bl      0x10018d7c <_dl_aux_init>
0x10015e0c <__uClibc_main+220>:	bl      0x10015cc8 <__uClibc_init>
0x10015e10 <__uClibc_main+224>:	lwz     r0,60(r1)
0x10015e14 <__uClibc_main+228>:	cmpwi   cr7,r0,0
0x10015e18 <__uClibc_main+232>:	bne-    cr7,0x10015e20 <__uClibc_main+240>
0x10015e20 <__uClibc_main+240>:	lwz     r9,100(r1)
0x10015e24 <__uClibc_main+244>:	cmpwi   cr7,r9,-1
0x10015e28 <__uClibc_main+248>:	lis     r9,4099
0x10015e2c <__uClibc_main+252>:	stw     r0,14200(r9)
0x10015e30 <__uClibc_main+256>:	bne+    cr7,0x10015e5c <__uClibc_main+300>
0x10015e5c <__uClibc_main+300>:	lwz     r0,100(r1)
0x10015e60 <__uClibc_main+304>:	cmpwi   cr7,r0,-1
0x10015e64 <__uClibc_main+308>:	beq-    cr7,0x10015eb4 <__uClibc_main+388>
0x10015e68 <__uClibc_main+312>:	lwz     r9,108(r1)
0x10015e6c <__uClibc_main+316>:	cmpw    cr7,r0,r9
0x10015e70 <__uClibc_main+320>:	bne+    cr7,0x10015e84 <__uClibc_main+340>
0x10015e74 <__uClibc_main+324>:	lwz     r0,124(r1)
0x10015e78 <__uClibc_main+328>:	lwz     r9,116(r1)
0x10015e7c <__uClibc_main+332>:	cmpw    cr7,r9,r0
0x10015e80 <__uClibc_main+336>:	beq-    cr7,0x10015eb4 <__uClibc_main+388>
0x10015eb4 <__uClibc_main+388>:	lwz     r11,0(r31)
0x10015eb8 <__uClibc_main+392>:	lis     r9,4099
0x10015ebc <__uClibc_main+396>:	lis     r25,4099
0x10015ec0 <__uClibc_main+400>:	addi    r0,r9,-7396
0x10015ec4 <__uClibc_main+404>:	addi    r25,r25,-7396
0x10015ec8 <__uClibc_main+408>:	lis     r9,4099
0x10015ecc <__uClibc_main+412>:	subf    r0,r25,r0
0x10015ed0 <__uClibc_main+416>:	stw     r11,14096(r9)
0x10015ed4 <__uClibc_main+420>:	lis     r9,4099
0x10015ed8 <__uClibc_main+424>:	li      r27,0
0x10015edc <__uClibc_main+428>:	stw     r26,14204(r9)
0x10015ee0 <__uClibc_main+432>:	srawi   r26,r0,2
0x10015ee4 <__uClibc_main+436>:	b       0x10015efc <__uClibc_main+460>
0x10015efc <__uClibc_main+460>:	cmplw   cr7,r27,r26
0x10015f00 <__uClibc_main+464>:	blt+    cr7,0x10015ee8 <__uClibc_main+440>
0x10015f04 <__uClibc_main+468>:	cmpwi   cr7,r28,0
0x10015f08 <__uClibc_main+472>:	beq-    cr7,0x10015f14 <__uClibc_main+484>
0x10015f0c <__uClibc_main+476>:	mtctr   r28
0x10015f10 <__uClibc_main+480>:	bctrl

Program received signal SIGILL, Illegal instruction.
0x10000000 in ?? ()
0x10000000:	.long 0x7f454c46

One more information: It was necessary to build the cross compiler with
"--disable-tls", otherwise i will get the error:

libstdc++.so: undefined reference to `__tls_get_addr'

So i am currently unable to have C++, uClibc and thread local storage
support at the same time :-(

Any idea?

- Stefani




More information about the uClibc mailing list