[ARM] Wrong BLX destination
Simon Marchi
simon.marchi@polymtl.ca
Wed Mar 9 15:58:00 GMT 2016
On 2016-03-09 10:48, Christophe Lyon wrote:
> On 9 March 2016 at 16:35, Simon Marchi <simon.marchi@polymtl.ca> wrote:
>> 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.
>>
>
> Did you supply a --cpu flag or a .cpu directive in your asm source?
> If no, then the tools default to some old version (I don't remember
> which) of the arm architecture which did not support the blx
> instruction.
>
> Hence the linker insert stubs to provide the desired behaviour
> (switching between arm and thumb modes).
>
> Add .cpu cortex-a9 in your source, and the linker should not insert
> stubs.
Right! Adding .cpu cortex-a9 to either assembly source file works. The
result is now:
8220: fa000015 blx 827c <hello1>
8224: fb000014 blx 827e <hello2>
8228: fa000014 blx 8280 <hello3>
Adding -mcpu=cortex-a9 to the command line works as well, obviously.
Thanks for your help, I would never have guessed it.
Simon
More information about the Binutils
mailing list