This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

XIP on an ARM processor (R_ARM_GOTOFF32)


I'm attempting to build an XIP "Hello, world!" application for the ARM
processor. I'm compiling with -fPIC -msingle-pic-base with the default
-mpic-register=r10. The layout of the memory map is such that the
.text and .rodata are in flash memory, and the .got, .data and so
forth are loaded into RAM. r10 is loaded with the address of the .got.

I'm having trouble with string constants. The address of a string
constant is being resolved using a R_ARM_GOTOFF32 relocation. For
example...

     d6:	4803      	ldr	r0, [pc, #12]	(e4 <.text+0xe4>)
     d8:	4450      	add	r0, sl
...
     e4:	ffdc ffff 	undefined
			e4: R_ARM_GOTOFF32	.LC0

The address to the string constant is being specified as a negative
offset from the GOT. However, in this memory layout the GOT does not
immediately follow the .text section, so a negative offset from the
GOT expecting to find the .text section does not make any sense. A PC
relative relocation (R_ARM_PC24), on the other hand, should work. The
address of the string constant would be specified as a positive offset
from the program counter, rather than a negative offset from the GOT.
Is there a compiler option to force this behaviour?

Please cc me in your reply. Thanks,
Shaun


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]