GAS compiling problem on ARM

Mats Liljegren mlil@enea.se
Fri Jul 4 09:29:00 GMT 2003


>
>
>Because the symbol arm_lock32 is exported, gas is refusing to resolve the 
>offset at assembly time.  Since it has no way of representing the 
>relocation in the object file it is then generating an error.  You can 
>work around the problem by defining an alternative local symbol as follows:
>
>        .thumb
>
>        .globl  arm_lock
>        .globl  arm_lock32
>arm_lock:      
>        adr     r0,.Larm_lock32_internal
>        bx      r0
>        .align 2
>        .arm
>arm_lock32:
>.Larm_lock32_internal:
>
>Note, if all you want to do is switch to ARM state from thumb state (eg 
>add a Thumb veneer to an ARM function, then the following trick will also 
>work:
>
>	.thumb
>	.align 2
>arm_lock:
>	bx	pc	// PC is (. + 4), bit 0 == 0, '.' is word aligned.
>	nop
>	.arm
>arm_lock32:
>	...
>
>Note that for this to work, the bx instruction must be word aligned (hence 
>the ".align 2" before the Thumb code sequence.
>
>R.
>

Thanks! This was swallowed by the assembler just fine!

Now for something quite interesting: I fed AXD with the GNU-generated 
ELF-file, to see if they would co-operate. I was quite surprised to find 
out that the file was loaded with switched endianess, which of course 
produces garbage. Using objdump on the ELF file says it is in little 
endian, and the target setting is also little endian.

If I do a hex-dump of the ELF-file using objdump, it looks correct. But 
using "interleave assembly" shows garbage in the AXD.

Are GNU tools and AXD simply non-compatible, or am I doing something 
wrong here? I can see the source files, so the debug info should be correct.

/Mats




More information about the Binutils mailing list