]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* readelf.c (debug_apply_rela_addends): Reorder r_info as
authorMaciej W. Rozycki <macro@linux-mips.org>
Mon, 4 Apr 2005 15:07:34 +0000 (15:07 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Mon, 4 Apr 2005 15:07:34 +0000 (15:07 +0000)
necessary for 64-bit MIPS.

binutils/ChangeLog
binutils/readelf.c

index 95c188e11123a78257156576211b51098189b17b..8889c426a2d18737224d86a8e97e006a1adc69d3 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-04  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * readelf.c (debug_apply_rela_addends): Reorder r_info as
+       necessary for 64-bit MIPS.
+
 2005-04-04  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * doc/binutils.texi (readelf): Remove a duplicate paragraph.
index 31fd3fa0e9278cb6ed0ebc020ce4c83440932c4c..018728b3a21c6f7dd955d9924e40a9ed2e2559c4 100644 (file)
@@ -7329,6 +7329,18 @@ debug_apply_rela_addends (FILE *file,
            }
          else
            {
+             /* In MIPS little-endian objects, r_info isn't really a
+                64-bit little-endian value: it has a 32-bit little-endian
+                symbol index followed by four individual byte fields.
+                Reorder INFO accordingly.  */
+             if (elf_header.e_machine == EM_MIPS
+                 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
+               rp->r_info = (((rp->r_info & 0xffffffff) << 32)
+                             | ((rp->r_info >> 56) & 0xff)
+                             | ((rp->r_info >> 40) & 0xff00)
+                             | ((rp->r_info >> 24) & 0xff0000)
+                             | ((rp->r_info >> 8) & 0xff000000));
+
              sym = symtab + ELF64_R_SYM (rp->r_info);
 
              if (ELF64_R_SYM (rp->r_info) != 0