-----Original Message-----
From: Jie Zhang [mailto:jie@codesourcery.com]
Sent: Tuesday, July 06, 2010 01:53
To: Pavel Pavlov
Cc: gcc-help@gcc.gnu.org
Subject: Re: ARM GCC: MOVT/MOVW reloacations error
On 07/06/2010 08:50 AM, Pavel Pavlov wrote:
I'm compiling for armv7 windows mobile (coff-pe). The problem I have is
that my build of gcc tries to use MOVT/MOVW in the following case:
static void test_func(){}
void test(struct teststruct * ts)
{
ts->func = test_func;
}
The generated asm will be:
...
movw r4, #:lower16:test_func
movt r4, #:upper16:test_func
When compiling I get this error:
GNU assembler version 2.20.51 (arm-mingw32ce) using BFD version (GNU
Binutils) 2.20.51.20091016
test.s: Assembler messages:
...
test.s:10: Error: cannot represent BFD_RELOC_ARM_MOVW relocation in
this object file format
test.s:11: Error: cannot represent BFD_RELOC_ARM_MOVT relocation in
this object file format ...
basically, it simply fails in my case because such asm cannot work on
windows, and I'm not sure if such thing can work anywhere else.
ARM ELF targets use movw/movt. But apparently binutils for ARM COFF
targets cannot handle such relocations. So I think it might be a good to
disable it for ARM COFF targets.
Can somebody maybe recommend where I need to look for in gcc code to
make gcc not generate movw/movt sequences for functions (or anything
else that isn't a real constant at compile time)?
You could try this draft patch.