This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[patch] print additional mips elf 64 reloc type info in readelf
- From: Timothy Daly <remote_bob at yahoo dot com>
- To: binutils at sources dot redhat dot com
- Date: Sun, 17 Feb 2002 08:05:40 -0800 (PST)
- Subject: [patch] print additional mips elf 64 reloc type info in readelf
Hi all,
In MIPS Elf-64, a reloc can have up to three types. Attached is a
patch to make readelf -r display this information in a similar manner
to the native SGI elfdump -r. I've also inlined the patch below, but
I'm pretty sure that yahoo's gonna eat it.
-Tim
[src/binutils/ChangeLog]
2002-02-17 Timothy Daly <remote_bob@yahoo.com>
* readelf.c (dump_relocations): Display 2nd and 3rd reloc
types for 64-bit MIPS.
Index: readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.151
diff -u -p -r1.151 readelf.c
--- readelf.c 2002/02/13 18:14:42 1.151
+++ readelf.c 2002/02/17 15:28:13
@@ -851,6 +851,15 @@ dump_relocations (file, rel_offset, rel_
printf
(_(" Offset Info Type Symbol's Value Symbol's
Name\n"));
}
+ else if (elf_header.e_machine == EM_MIPS)
+ {
+ if (is_rela)
+ printf
+ (_(" Offset Info Type
Type2 Type3 Symbol's Value Symbol's Name
Addend\n"));
+ else
+ printf
+ (_(" Offset Info Type
Type2 Type3 Symbol's Value Symbol's
Name\n"));
+ }
else
{
if (is_rela)
@@ -864,10 +873,14 @@ dump_relocations (file, rel_offset, rel_
for (i = 0; i < rel_size; i++)
{
const char * rtype;
+ const char * rtype2 = NULL;
+ const char * rtype3 = NULL;
bfd_vma offset;
bfd_vma info;
bfd_vma symtab_index;
bfd_vma type;
+ bfd_vma type2 = NULL;
+ bfd_vma type3 = NULL;
if (is_rela)
{
@@ -889,6 +902,12 @@ dump_relocations (file, rel_offset, rel_
{
if (elf_header.e_machine == EM_SPARCV9)
type = ELF64_R_TYPE_ID (info);
+ else if (elf_header.e_machine == EM_MIPS)
+ {
+ type = ELF64_MIPS_R_TYPE (info);
+ type2 = ELF64_MIPS_R_TYPE2 (info);
+ type3 = ELF64_MIPS_R_TYPE3 (info);
+ }
else
type = ELF64_R_TYPE (info);
/* The #ifdef BFD64 below is to prevent a compile time warning.
@@ -1006,6 +1025,10 @@ dump_relocations (file, rel_offset, rel_
case EM_MIPS:
case EM_MIPS_RS3_LE:
rtype = elf_mips_reloc_type (type);
+ if (!is_32bit_elf) {
+ rtype2 = elf_mips_reloc_type (type2);
+ rtype3 = elf_mips_reloc_type (type3);
+ }
break;
case EM_ALPHA:
@@ -1071,8 +1094,14 @@ dump_relocations (file, rel_offset, rel_
#else
printf (_("unrecognised: %-7lx"), type);
#endif
- else
- printf ("%-21.21s", rtype);
+ else
+ {
+ printf ("%-21.21s", rtype);
+ if (rtype2 != NULL)
+ printf ("%-21.21s", rtype2);
+ if (rtype3 != NULL)
+ printf ("%-21.21s", rtype3);
+ }
if (symtab_index)
{
__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com
Index: readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.151
diff -u -p -r1.151 readelf.c
--- readelf.c 2002/02/13 18:14:42 1.151
+++ readelf.c 2002/02/17 15:28:13
@@ -851,6 +851,15 @@ dump_relocations (file, rel_offset, rel_
printf
(_(" Offset Info Type Symbol's Value Symbol's Name\n"));
}
+ else if (elf_header.e_machine == EM_MIPS)
+ {
+ if (is_rela)
+ printf
+ (_(" Offset Info Type Type2 Type3 Symbol's Value Symbol's Name Addend\n"));
+ else
+ printf
+ (_(" Offset Info Type Type2 Type3 Symbol's Value Symbol's Name\n"));
+ }
else
{
if (is_rela)
@@ -864,10 +873,14 @@ dump_relocations (file, rel_offset, rel_
for (i = 0; i < rel_size; i++)
{
const char * rtype;
+ const char * rtype2 = NULL;
+ const char * rtype3 = NULL;
bfd_vma offset;
bfd_vma info;
bfd_vma symtab_index;
bfd_vma type;
+ bfd_vma type2 = NULL;
+ bfd_vma type3 = NULL;
if (is_rela)
{
@@ -889,6 +902,12 @@ dump_relocations (file, rel_offset, rel_
{
if (elf_header.e_machine == EM_SPARCV9)
type = ELF64_R_TYPE_ID (info);
+ else if (elf_header.e_machine == EM_MIPS)
+ {
+ type = ELF64_MIPS_R_TYPE (info);
+ type2 = ELF64_MIPS_R_TYPE2 (info);
+ type3 = ELF64_MIPS_R_TYPE3 (info);
+ }
else
type = ELF64_R_TYPE (info);
/* The #ifdef BFD64 below is to prevent a compile time warning.
@@ -1006,6 +1025,10 @@ dump_relocations (file, rel_offset, rel_
case EM_MIPS:
case EM_MIPS_RS3_LE:
rtype = elf_mips_reloc_type (type);
+ if (!is_32bit_elf) {
+ rtype2 = elf_mips_reloc_type (type2);
+ rtype3 = elf_mips_reloc_type (type3);
+ }
break;
case EM_ALPHA:
@@ -1071,8 +1094,14 @@ dump_relocations (file, rel_offset, rel_
#else
printf (_("unrecognised: %-7lx"), type);
#endif
- else
- printf ("%-21.21s", rtype);
+ else
+ {
+ printf ("%-21.21s", rtype);
+ if (rtype2 != NULL)
+ printf ("%-21.21s", rtype2);
+ if (rtype3 != NULL)
+ printf ("%-21.21s", rtype3);
+ }
if (symtab_index)
{