gcc: Thumb interworking and weakly linked functions

Ulrich Weigand Ulrich.Weigand at de.ibm.com
Tue Mar 15 15:30:12 UTC 2011

Aneesh V <aneesh at 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?

I've tried with the following small example:


extern void foo (void) __attribute__ ((weak, alias ("__foo")));

void __foo (void)

int main (void)
  foo ();

        .align  2
        .global foo
        .type   foo, %function
        push    {r7}
        add     r7, sp, #0
        mov     sp, r7
        pop     {r7}
        bx      lr
        .size   foo, .-foo

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
  Sitz der Gesellschaft: Böblingen | Registergericht: Amtsgericht
Stuttgart, HRB 243294

More information about the linaro-dev mailing list