Aneesh V aneesh@ti.com wrote on 03/16/2011 10:32:50 AM:
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:
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
Well, sure, but the result of "ld -r" is not a final executable, but just another relocatable object file. In particular, it will still carry relocation records. In fact, if you add --reloc to the objdump line, you should see:
0000000c <main>: c: b580 push {r7, lr} e: af00 add r7, sp, #0 10: f7ff fffe bl 18 <foo> 10: R_ARM_THM_CALL foo 14: 4618 mov r0, r3 16: bd80 pop {r7, pc}
The R_ARM_THM_CALL marks the branch instruction as still to be processed by the final link step. And once you actually *perform* the final link, e.g. via "gcc -o final a.out", the branch gets indeed converted to a blx by the linker for me:
0000836c <main>: 836c: b580 push {r7, lr} 836e: af00 add r7, sp, #0 8370: f000 e802 blx 8378 <foo> 8374: 4618 mov r0, r3 8376: bd80 pop {r7, pc}
00008378 <foo>: 8378: e92d0080 push {r7} 837c: e28d7000 add r7, sp, #0 8380: e1a0d007 mov sp, r7 8384: e8bd0080 pop {r7} 8388: e12fff1e bx lr
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