This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)
 	{

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]