This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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: [patch] R_ARM_REL32 and Thumb functions.


On Thu, Apr 20, 2006 at 07:29:49PM +0100, Paul Brook wrote:
> The attached patch makes the R_ARM_REL32 relocation set the low bit of the 
> value when the relocated symbol is a Thumb function, as required by the ARM 
> EABI.
> 
> I don't know if the current behavior is considered a bug or a feature for 
> pre-EABI objects. For now I'm assuming bug, and making the change 
> unconditionally. I can preserver the old behavior if anything depends on it.
> 
> A slight complication is that gas will try and fold relative expressions at 
> assembly time. This folding is done in generic code, so gets the value wrong. 
> e.g.
> 
> .thumb_func
> foo:
> .word foo - .
> 
> Will be folded to zero by gas/expr.c:expr.  I've [ab]used md_optimize_expr to 
> prevent this happening.
> 
> Initially I disabled the folding if either symbol was a Thumb function. 
> However this ends up breaking the explicit cfi directives in libgcc, so I've 
> only disabled the folding when the first symbol is a Thumb function.

Wow, this is nasty!

I can understand why Richard, and presumably the ABI, wants this to
happen:

	ldr	ip, 1f
2:	add	ip, pc, ip
	bx	ip
1:	.word	foo - . - (2b - .)

But I'd be mighty confused if, say, some code tried to copy itself from
one location to another and expected "foo - ." to describe the number
of bytes to be copied.  And now "foo - ." and ". - foo" are assymetric.


-- 
Daniel Jacobowitz
CodeSourcery


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