This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] Fix objdump output of R_SPARC_OLO10
- From: David Miller <davem at davemloft dot net>
- To: amodra at gmail dot com
- Cc: hp at bitrange dot com, binutils at sourceware dot org, richm at oldelvet dot org dot uk
- Date: Sun, 03 Apr 2011 00:51:01 -0700 (PDT)
- Subject: Re: [PATCH] Fix objdump output of R_SPARC_OLO10
- References: <20110119.233922.267967439.davem@davemloft.net> <alpine.BSF.2.00.1101201241080.6806@dair.pair.com> <20110120231546.GG11694@bubble.grove.modra.org>
From: Alan Modra <amodra@gmail.com>
Date: Fri, 21 Jan 2011 09:45:47 +1030
> I'm happy enough with David's original approach, except that the patch
> ought to first check for a sparc object file. (bfd->xvec->flavour,
> elf_tdata(bfd)->elf_header->e_machine is one way of doing that.)
So I tried over and over to find a reasonable way to make my other
patch, which adds a secondary addend to arelent, work without
negatively impacting other platforms, and I haven't been able to do so
yet.
Therefore I would like to propose that for now we use my original
approach, using the feedback Alan gave here.
Ok to commit?
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.
diff --git a/binutils/objdump.c b/binutils/objdump.c
index c2ce7ae..38e03cf 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
+ && !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");
}