HPPA64 .PARISC.unwind entries
authorAlan Modra <amodra@gmail.com>
Wed, 10 Oct 2018 02:44:56 +0000 (13:14 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 10 Oct 2018 03:02:18 +0000 (13:32 +1030)
.PARISC.unwind has 32-bit addresses in both 32-bit ELF and 64-bit ELF.
Well, strictly speaking, the 32-bit "start" and "end" fields are
segment relative offsets.  (The 64-bit ABI says so, while the 32-bit
ABI says they are addresses but it appears they are segment relative
offsets in practice.  Likely the 32-bit ABI lacks an update.)

* readelf.c (hppa_process_unwind): Don't use eh_addr_size to
calculate number of entries.
(slurp_hppa_unwind_table): Don't use eh_addr_size here either.

binutils/ChangeLog
binutils/readelf.c

index 09436cc..fd56834 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-10  Helge Deller <deller@gmx.de>
+           Alan Modra  <amodra@gmail.com>
+
+       * readelf.c (hppa_process_unwind): Don't use eh_addr_size to
+       calculate number of entries.
+       (slurp_hppa_unwind_table): Don't use eh_addr_size here either.
+
 2018-10-10  Alan Modra  <amodra@gmail.com>
 
        * objdump.c (dump_dwarf): Set s12z eh_addr_size to 4.
index 2748664..41f55ee 100644 (file)
@@ -8065,7 +8065,7 @@ slurp_hppa_unwind_table (Filedata *                  filedata,
 
          i = rp->r_offset / unw_ent_size;
 
-         switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
+         switch ((rp->r_offset % unw_ent_size) / 4)
            {
            case 0:
              aux->table[i].start.section = sym->st_shndx;
@@ -8133,7 +8133,7 @@ hppa_process_unwind (Filedata * filedata)
     {
       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
        {
-         unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
+         unsigned long num_unwind = sec->sh_size / 16;
 
          printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
                            "contains %lu entry:\n",