On 2016-03-09 03:07, Christophe Lyon wrote:
Hi,
I haven't looked at this for a while, but:
- which relocations are encoded by gas? (objdump -r). I suspect you
have the ARM version of call (as opposed to the thumb one)
Indeed:
00000000 R_ARM_CALL hello1
- I think you have to use the .thumb_func assembly directive right
before helloX definition, and probably give it a function type too
The linker will take care of making the call point to the right
address, provided it has the right relocations.
When adding .thumb_func before the helloX definitions, the branches
are now
8220: eb00013c bl 8718 <__hello1_from_arm>
8224: eb000135 bl 8700 <__hello2_from_arm>
8228: eb000137 bl 870c <__hello3_from_arm>
and this additional code was added somewhere:
00008700 <__hello2_from_arm>:
8700: e59fc000 ldr ip, [pc] ; 8708
<__hello2_from_arm+0x8>
8704: e12fff1c bx ip
8708: 0000827f .word 0x0000827f
0000870c <__hello3_from_arm>:
870c: e59fc000 ldr ip, [pc] ; 8714
<__hello3_from_arm+0x8>
8710: e12fff1c bx ip
8714: 00008281 .word 0x00008281
00008718 <__hello1_from_arm>:
8718: e59fc000 ldr ip, [pc] ; 8720
<__hello1_from_arm+0x8>
871c: e12fff1c bx ip
8720: 0000827d .word 0x0000827d
So while it doesn't simply use BLX with the H bit set, it seems that
it
would now work properly with this indirection.