This is the mail archive of the gcc-help@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]

RE: ARM GCC: MOVT/MOVW reloacations error



> -----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.
> 
> 


Hi, I tried that patch and it fixes the issue. However, I have a question related to the original error.
Assembler cries than that it cannot represent that sequence in coff object file, but technically that kind of relocs are supported by windows loader:
Winnt.h contains flags for relocs and the flags for MOVW/MOVT sequence should be IMAGE_REL_BASED_HIGH and IMAGE_REL_BASED_LOW.
Probably it's more related to binutils than to gcc, hopefully somebody from binutils can comment on that.

Thanks




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