Hi Ulrich,

On Tuesday 15 March 2011 09:00 PM, Ulrich Weigand wrote:
Aneesh V<ane...@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


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to