C++ support in DSLINUX

Amadeus amadeus at iksw-muees.de
Tue Oct 17 22:07:50 CEST 2006


On Monday 16 October 2006 22:58, Amadeus wrote:

in rtest.o, I see:

000003d4 <puts>:
     3d4:       e92d4030        stmdb   sp!, {r4, r5, lr}
     3d8:       e59f3038        ldr     r3, [pc, #56]   ; 418 
     3dc:       e79a2003        ldr     r2, [sl, r3]
     3e0:       e5924000        ldr     r4, [r2]
     3e4:       e1a01004        mov     r1, r4
     3e8:       eb000089        bl      614 <__fputs_unlocked>
     3ec:       e1a05000        mov     r5, r0
     3f0:       e3750001        cmn     r5, #1  ; 0x1
     3f4:       e1a01004        mov     r1, r4
     3f8:       e3a0000a        mov     r0, #10 ; 0xa
     3fc:       0a000003        beq     410 <puts+0x3c>
     400:       eb00003c        bl      4f8 <__fputc_unlocked>
     404:       e2855001        add     r5, r5, #1      ; 0x1
     408:       e3700001        cmn     r0, #1  ; 0x1
     40c:       01a05000        moveq   r5, r0
     410:       e1a00005        mov     r0, r5
     414:       e8bd8030        ldmia   sp!, {r4, r5, pc}
     418:       0000003c        andeq   r0, r0, ip, lsr r0

obviously, the value 3c at 418 is an offset into a table. Base address 
of this table is in register sl. Value is read from the table and 

My problem is that the value in r1/r4 is pointing to page 0.

So I have a relocation error!

The value read in r1/r4 is supposed to be a stream * named "stdout".
This stream pointer is defined in /uClibc/libc/stdio/_stdio.c:

static FILE _stdio_streams[] = {
	__STDIO_INIT_FILE_STRUCT(_stdio_streams[0], \
							 0, \
							 _stdio_streams + 1, \
							 _fixed_buffers, \
							 BUFSIZ ),
	__STDIO_INIT_FILE_STRUCT(_stdio_streams[1], \
							 1, \
							 _stdio_streams + 2, \
							 _fixed_buffers + BUFSIZ, \
							 BUFSIZ ),
	__STDIO_INIT_FILE_STRUCT(_stdio_streams[2], \
							 2, \
							 NULL, \
							 NULL, \
							 0 )

FILE *stdin  = _stdio_streams;
FILE *stdout = _stdio_streams + 1;
FILE *stderr = _stdio_streams + 2;

The problem is here that without valid stdout/stderr streams, debugging 
is very difficult....

This error is ONLY there if there are c++ items (classes, objects, etc) 
in the file.

A simple rtest.xxx with a printf() and no classes is fine.

Any idea of how to debug? There must be something wrong with the binfmt 


We're back to the times when men were men 
and wrote their own device drivers.

(Linus Torvalds)

More information about the dslinux-devel mailing list