Hi Ulrich,
On Tuesday 15 March 2011 09:00 PM, Ulrich Weigand wrote:
Aneesh Vaneesh@ti.com wrote:
I was trying to build u-boot in Thumb2 for OMAP4. Everything was fine until I added some patches recently. One of these patches introduced an API (let's say foo()) that has a weakly linked alias(let's say __foo()) and a strongly linked implementation(the real foo()) in an assembly file.
Although I give -mthumb and -mthumb-interwork for all the files, apparently GCC generates ARM code for assembly files. In the final image foobar() calls foo() using a BL. Since foobar() is in Thumb and foo() in ARM, it ends up crashing. Looks like foobar() assumed foo() to be Thumb because __foo() is Thumb.
I'm unable to reproduce this. Do you have a complete test case?
Thank you for looking into this problem.
I've tried with the following small example:
foo1.c:
extern void foo (void) __attribute__ ((weak, alias ("__foo")));
void __foo (void) { }
int main (void) { foo (); }
foo2.S: .text .align 2 .global foo .type foo, %function foo: push {r7} add r7, sp, #0 mov sp, r7 pop {r7} bx lr .size foo, .-foo
Can you try this sequence:
arm-linux-gnueabi-gcc -march=armv7-a -mthumb -mthumb-interwork -o foo1.o foo1.c -c arm-linux-gnueabi-gcc -march=armv7-a -mthumb -mthumb-interwork -o foo2.o foo2.S -c arm-linux-gnueabi-ld -r foo1.o foo2.o arm-linux-gnueabi-objdump -S a.out
With this sequence I get the following output:
00000000 <__foo>: 0: b480 push {r7} 2: af00 add r7, sp, #0 4: 46bd mov sp, r7 6: bc80 pop {r7} 8: 4770 bx lr a: bf00 nop
0000000c <main>: c: b580 push {r7, lr} e: af00 add r7, sp, #0 10: f7ff fffe bl 18 <foo> 14: 4618 mov r0, r3 16: bd80 pop {r7, pc}
00000018 <foo>: 18: e92d0080 push {r7} 1c: e28d7000 add r7, sp, #0 20: e1a0d007 mov sp, r7 24: e8bd0080 pop {r7} 28: e12fff1e bx lr
When building just "gcc foo1.c", I get:
0000835c<__foo>: 835c: b480 push {r7} 835e: af00 add r7, sp, #0 8360: 46bd mov sp, r7 8362: bc80 pop {r7} 8364: 4770 bx lr 8366: bf00 nop
00008368<main>: 8368: b580 push {r7, lr} 836a: af00 add r7, sp, #0 836c: f7ff fff6 bl 835c<__foo> 8370: 4618 mov r0, r3 8372: bd80 pop {r7, pc}
When building both files "gcc foo1.c foo2.S", I get instead:
00008368<main>: 8368: b580 push {r7, lr} 836a: af00 add r7, sp, #0 836c: f000 e802 blx 8374<foo> 8370: 4618 mov r0, r3 8372: bd80 pop {r7, pc}
00008374<foo>: 8374: e92d0080 push {r7} 8378: e28d7000 add r7, sp, #0 837c: e1a0d007 mov sp, r7 8380: e8bd0080 pop {r7} 8384: e12fff1e bx lr
So it seems to me the linker is handling this correctly ...
(This is on Ubuntu Natty using system gcc and binutils.)
Mit freundlichen Gruessen / Best Regards
Ulrich Weigand
-- Dr. Ulrich Weigand | Phone: +49-7031/16-3727 STSM, GNU compiler and toolchain for Linux on System z and Cell/B.E. IBM Deutschland Research& Development GmbH Vorsitzender des Aufsichtsrats: Martin Jetter | Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen | Registergericht: Amtsgericht Stuttgart, HRB 243294