From bf03e63286761fab84f2f80f5be7f0be40df112d Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 4 Apr 2011 00:34:26 +0000 Subject: [PATCH] binutils/ * objdump.c (dump_reloc_set): Output R_SPARC_OLO10 relocations accurately, rather than how they are represented internally. --- binutils/ChangeLog | 5 +++++ binutils/objdump.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 8b4086c998c..ade1cda8f3a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2011-04-03 David S. Miller + + * objdump.c (dump_reloc_set): Output R_SPARC_OLO10 relocations + accurately, rather than how they are represented internally. + 2011-03-31 Tristan Gingold * makefile.vms (readelf.exe): New target. diff --git a/binutils/objdump.c b/binutils/objdump.c index c2ce7ae4a40..8b6bc28c10c 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"); } -- 2.30.2