binutils/
* objdump.c (dump_reloc_set): Output R_SPARC_OLO10 relocations accurately, rather than how they are represented internally.
This commit is contained in:
parent
e5c0506503
commit
bf03e63286
2 changed files with 42 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue