Bug: setjmp multilib appears broken

Jeff Johnston jjohnstn@redhat.com
Fri Jun 2 20:34:00 GMT 2006


Shaun Jackman wrote:
> I'll test out your patch right now. I thought I'd mention first though
> that sh seems to work around this bug as follows:
> 
> newlib/libc/machine/sh/Makefile.am:7:
> AM_CCASFLAGS = $(INCLUDES) $(CFLAGS)
>

Thanks, I know.  That is what led me to look at the config-ml.in file.

> I added the same hack to ARM and it did workaround the bug. When the
> config-ml.in patch is checked, it should probably also revert this sh
> hack.
> 

I intend to revert it if the fix is acceptable to DJ.

> Cheers,
> Shaun
> 
> On 6/2/06, Jeff Johnston <jjohnstn@redhat.com> wrote:
> 
>> The move to the new configure/automake uses $(CCASCOMPILE) for compiling
>> .S files into .o files.  This ends up being the same gcc compiler used
>> for C files.  However, CCASCOMPILE uses its own set of flags: e.g.
>> CCASFLAGS instead of CFLAGS.
>>
>> Now, config-ml.in which adds the multilib logic gets special multilib
>> flags from the compiler and appends them to a set of flags to be passed
>> when building a particular multilib.  It adds these flags to CFLAGS, but
>> neglects to add them to CCASFLAGS.
>>
>> I propose the attached patch to fix this.  Shaun, please try it out.
>>
>> DJ, I cc'd you as you are listed in the MAINTAINERS file for
>> config-ml.in.  Ok?
>>
>> -- Jeff J.
>>
>> Shaun Jackman wrote:
>> > The functions setjmp and longmp in the thumb libc.a are in fact
>> > compiled as ARM code.
>> >
>> > The linker complains when I attempt to link my program.
>> >
>> > /usr/local/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/bin/ld:
>> > 
>> /usr/local/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/thumb/libg.a(lib_a-setjmp.o)(longjmp): 
>>
>> >
>> > warning: interworking not enabled.
>> >  first occurrence: proc.o: thumb call to arm
>> > proc.o: In function `kexit':../../kernel/proc.c:55: warning: internal
>> > error: dangerous error
>> >
>> > $ arm-elf-objdump -rS
>> > ./arm-elf/thumb/newlib/libc/machine/arm/lib_a-setjmp.o
>> >
>> > ./arm-elf/thumb/newlib/libc/machine/arm/lib_a-setjmp.o:     file
>> > format elf32-littlearm
>> >
>> > Disassembly of section .text:
>> >
>> > 00000000 <setjmp>:
>> >   0:   e8a07ff0        stmia   r0!, {r4, r5, r6, r7, r8, r9, sl, fp,
>> > ip, sp, lr}
>> >   4:   e3a00000        mov     r0, #0  ; 0x0
>> >   8:   e31e0001        tst     lr, #1  ; 0x1
>> >   c:   01a0f00e        moveq   pc, lr
>> >  10:   e12fff1e        bx      lr
>> >
>> > 00000014 <longjmp>:
>> >  14:   e8b07ff0        ldmia   r0!, {r4, r5, r6, r7, r8, r9, sl, fp,
>> > ip, sp, lr}
>> >  18:   e1b00001        movs    r0, r1
>> >  1c:   03a00001        moveq   r0, #1  ; 0x1
>> >  20:   e31e0001        tst     lr, #1  ; 0x1
>> >  24:   01a0f00e        moveq   pc, lr
>> >  28:   e12fff1e        bx      lr
>> >
>> > Here are the relevant lines from the compilation:
>> >
>> > make[9]: Entering directory
>> > 
>> `/home/sjackman/src/toolchain/src/_build/arm-elf/thumb/newlib/libc/machine/arm' 
>>
>> >
>> > arm-elf-gcc -B/home/sjackman/src/toolchain/src/_build/arm-elf/newlib/
>> > -isystem
>> > /home/sjackman/src/toolchain/src/_build/arm-elf/newlib/targ-include
>> > -isystem /home/sjackman/src/toolchain/src/newlib/libc/include -O2
>> > -D__NO_SYSCALLS__ -DNO_FLOATING_POINT -DHAVE_FCNTL -DHAVE_GETTIMEOFDAY
>> > -DHAVE_NANOSLEEP -fno-builtin    -c -o lib_a-setjmp.o `test -f
>> > 'setjmp.S' || echo
>> > '../../../../../../../newlib/libc/machine/arm/'`setjmp.S
>> > rm -f lib.a
>> > arm-elf-ar cru lib.a lib_a-setjmp.o lib_a-access.o
>> > arm-elf-ranlib lib.a
>> > make[9]: Leaving directory
>> > 
>> `/home/sjackman/src/toolchain/src/_build/arm-elf/thumb/newlib/libc/machine/arm' 
>>
>> >
>> >
>> > It looks as though the option -mthumb has been omitted.
>> >
>> > Cheers,
>> > Shaun
>>
>>
>>
>>



More information about the Newlib mailing list