[patch] MIPS: Incorrect calculation for R_MIPS_LO16 relocs

Richard Sandiford rsandifo@redhat.com
Wed Jun 30 20:48:00 GMT 2004


Paul Koning <pkoning@equallogic.com> writes:
> I didn't understand this discussion particularly well, but let me
> toss in an example I just spotted in GCC 3.4.1 RC1 output:
>
> 	.loc 1 93 0
> 	lw	$16,%got(utfile)($28)
> 	lw	$5,%got($LC0)($28)
> 	lw	$25,%call16(fopen)($28)
> 	addiu	$4,$16,%lo(utfile)
> 	jalr	$25
> 	addiu	$5,$5,%lo($LC0)
>
> According to comments in the bfd sources, a %got is treated much like
> a %hi.  So what I see here is two %lo operations that are each paired
> with a %hi (%got) but the matching one is NOT the immediately
> preceding one.
>
> Is this legal?

Yes.  The order of the relocations in the assembly code doesn't matter.
When you use explicit relocs, it's up to the assembler to make sure that
the relocations are listed in the correct order.

(Note that relocations don't have to be in order of increasing
field address.)

> Is this what the discussion is about?

No, it's about what happens when you have more instances of %lo(FOO)
than you have of %hi(FOO) or %got(FOO).

> Will the current toolchain handle it correctly?

Hope so ;)

Richard



More information about the Binutils mailing list