http://sourceware.org/bugzilla/show_bug.cgi?id=13352
--- Comment #1 from Barry Keane <bfkeane at gmail dot com> 2011-10-27 17:40:17
UTC ---
I should clarify a little more. The problematic IMM+BRLID instruction pair lies
at text addresses 0x100A8 and 0x100AC in the linker output.
100a8: b000fffe imm -2
100ac: b9f4015c brlid r15, 348
The target subroutine address (atoi0000) lies at 0x0208.
The BRLID interprets its address as a PC-relative (not absolute) address, hence
the linker relocation result should be the difference:
atoi0000 address: 0x208:
BRLID address: 0x100AC
difference: 0xFFFF015C
Instead the linker produces 0xFFFE015C, which is a bug.
If you look at the .o assembler output you'll see that that the assembler
produces a correct PC-relative address in which the IMM operand is 0xFFFE.
10270: b000fffe imm -2
10274: b9f4fd8c brlid r15, -628 // 0 <atoi0000>
At this point (before relaxation) the target is more than 64KB away from the
BRLID instruction: 0xFFFEFD8C (66164 decimal) bytes. After relaxation the
target is less than 64KB away: 0xFFFF015C (65188 decimal) bytes.
It looks to me like the linker's relaxation optimization updated the BRLID
operand but neglected to update the IMM operand.
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
bug-binutils mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-binutils