aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2011-04-04 00:34:26 +0000
committerDavid S. Miller <davem@redhat.com>2011-04-04 00:34:26 +0000
commitbf03e63286761fab84f2f80f5be7f0be40df112d (patch)
tree11770ac5fd4b822d6ad4f693266d3abf3618f220
parente5c05065031f61b07a9d7ba1ffe20059635e3c6e (diff)
downloadgdb-bf03e63286761fab84f2f80f5be7f0be40df112d.zip
gdb-bf03e63286761fab84f2f80f5be7f0be40df112d.tar.gz
gdb-bf03e63286761fab84f2f80f5be7f0be40df112d.tar.bz2
binutils/
* objdump.c (dump_reloc_set): Output R_SPARC_OLO10 relocations accurately, rather than how they are represented internally.
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/objdump.c38
2 files changed, 42 insertions, 1 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 8b4086c..ade1cda 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-03 David S. Miller <davem@davemloft.net>
+
+ * objdump.c (dump_reloc_set): Output R_SPARC_OLO10 relocations
+ accurately, rather than how they are represented internally.
+
2011-03-31 Tristan Gingold <gingold@adacore.com>
* makefile.vms (readelf.exe): New target.
diff --git a/binutils/objdump.c b/binutils/objdump.c
index c2ce7ae..8b6bc28 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -2829,6 +2829,7 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
unsigned int linenumber;
const char *sym_name;
const char *section_name;
+ bfd_vma addend2 = 0;
if (start_address != (bfd_vma) -1
&& q->address < start_address)
@@ -2884,7 +2885,37 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
if (q->howto == NULL)
printf (" *unknown* ");
else if (q->howto->name)
- printf (" %-16s ", q->howto->name);
+ {
+ const char *name = q->howto->name;
+
+ /* R_SPARC_OLO10 relocations contain two addends.
+ But because 'arelent' lacks enough storage to
+ store them both, the 64-bit ELF Sparc backend
+ records this as two relocations. One R_SPARC_LO10
+ and one R_SPARC_13, both pointing to the same
+ address. This is merely so that we have some
+ place to store both addend fields.
+
+ Undo this transformation, otherwise the output
+ will be confusing. */
+ if (abfd->xvec->flavour == bfd_target_elf_flavour
+ && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
+ && relcount > 1
+ && !strcmp (q->howto->name, "R_SPARC_LO10"))
+ {
+ arelent *q2 = *(p + 1);
+ if (q2 != NULL
+ && q2->howto
+ && q->address == q2->address
+ && !strcmp (q2->howto->name, "R_SPARC_13"))
+ {
+ name = "R_SPARC_OLO10";
+ addend2 = q2->addend;
+ p++;
+ }
+ }
+ printf (" %-16s ", name);
+ }
else
printf (" %-16d ", q->howto->type);
@@ -2904,6 +2935,11 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
printf ("+0x");
bfd_printf_vma (abfd, q->addend);
}
+ if (addend2)
+ {
+ printf ("+0x");
+ bfd_printf_vma (abfd, addend2);
+ }
printf ("\n");
}