109 lines
3.4 KiB
Diff
109 lines
3.4 KiB
Diff
|
From 5eeb7401eed2f26d5fc255de816ca70a2cb9374e Mon Sep 17 00:00:00 2001
|
||
|
From: Sandra Loosemore <sandra@codesourcery.com>
|
||
|
Date: Sun, 27 Dec 2015 12:30:26 -0800
|
||
|
Subject: [PATCH 900/901] Correct nios2 _gp address computation.
|
||
|
|
||
|
2015-12-27 Sandra Loosemore <sandra@codesourcery.com>
|
||
|
|
||
|
bfd/
|
||
|
* elf32-nios2.c (nios2_elf_assign_gp): Correct computation of _gp
|
||
|
address.
|
||
|
(nios2_elf32_relocate_section): Tidy code for R_NIOS2_GPREL error
|
||
|
messages.
|
||
|
|
||
|
[Romain:
|
||
|
- backport upstream patch on 2.26
|
||
|
- drop bfd/ChangeLog entry]
|
||
|
Signed-off-by: Romain Naour <romain.naour@gmail.com>
|
||
|
---
|
||
|
bfd/elf32-nios2.c | 31 +++++++++++++++++++++----------
|
||
|
1 file changed, 21 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c
|
||
|
index 6b29d8b..01ebd6e 100644
|
||
|
--- a/bfd/elf32-nios2.c
|
||
|
+++ b/bfd/elf32-nios2.c
|
||
|
@@ -3086,7 +3086,15 @@ lookup:
|
||
|
case bfd_link_hash_defined:
|
||
|
case bfd_link_hash_defweak:
|
||
|
gp_found = TRUE;
|
||
|
- *pgp = lh->u.def.value;
|
||
|
+ {
|
||
|
+ asection *sym_sec = lh->u.def.section;
|
||
|
+ bfd_vma sym_value = lh->u.def.value;
|
||
|
+
|
||
|
+ if (sym_sec->output_section)
|
||
|
+ sym_value = (sym_value + sym_sec->output_offset
|
||
|
+ + sym_sec->output_section->vma);
|
||
|
+ *pgp = sym_value;
|
||
|
+ }
|
||
|
break;
|
||
|
case bfd_link_hash_indirect:
|
||
|
case bfd_link_hash_warning:
|
||
|
@@ -3719,7 +3727,6 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
struct elf32_nios2_link_hash_entry *eh;
|
||
|
bfd_vma relocation;
|
||
|
bfd_vma gp;
|
||
|
- bfd_vma reloc_address;
|
||
|
bfd_reloc_status_type r = bfd_reloc_ok;
|
||
|
const char *name = NULL;
|
||
|
int r_type;
|
||
|
@@ -3762,12 +3769,6 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
if (bfd_link_relocatable (info))
|
||
|
continue;
|
||
|
|
||
|
- if (sec && sec->output_section)
|
||
|
- reloc_address = (sec->output_section->vma + sec->output_offset
|
||
|
- + rel->r_offset);
|
||
|
- else
|
||
|
- reloc_address = 0;
|
||
|
-
|
||
|
if (howto)
|
||
|
{
|
||
|
switch (howto->type)
|
||
|
@@ -3816,6 +3817,15 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
/* Turns an absolute address into a gp-relative address. */
|
||
|
if (!nios2_elf_assign_gp (output_bfd, &gp, info))
|
||
|
{
|
||
|
+ bfd_vma reloc_address;
|
||
|
+
|
||
|
+ if (sec && sec->output_section)
|
||
|
+ reloc_address = (sec->output_section->vma
|
||
|
+ + sec->output_offset
|
||
|
+ + rel->r_offset);
|
||
|
+ else
|
||
|
+ reloc_address = 0;
|
||
|
+
|
||
|
format = _("global pointer relative relocation at address "
|
||
|
"0x%08x when _gp not defined\n");
|
||
|
sprintf (msgbuf, format, reloc_address);
|
||
|
@@ -3825,7 +3835,7 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
else
|
||
|
{
|
||
|
bfd_vma symbol_address = rel->r_addend + relocation;
|
||
|
- relocation = relocation + rel->r_addend - gp;
|
||
|
+ relocation = symbol_address - gp;
|
||
|
rel->r_addend = 0;
|
||
|
if (((signed) relocation < -32768
|
||
|
|| (signed) relocation > 32767)
|
||
|
@@ -3833,6 +3843,8 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
|| h->root.type == bfd_link_hash_defined
|
||
|
|| h->root.type == bfd_link_hash_defweak))
|
||
|
{
|
||
|
+ if (h)
|
||
|
+ name = h->root.root.string;
|
||
|
format = _("Unable to reach %s (at 0x%08x) from the "
|
||
|
"global pointer (at 0x%08x) because the "
|
||
|
"offset (%d) is out of the allowed range, "
|
||
|
@@ -3848,7 +3860,6 @@ nios2_elf32_relocate_section (bfd *output_bfd,
|
||
|
rel->r_offset, relocation,
|
||
|
rel->r_addend);
|
||
|
}
|
||
|
-
|
||
|
break;
|
||
|
case R_NIOS2_UJMP:
|
||
|
r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
|
||
|
--
|
||
|
2.4.3
|
||
|
|