2004-10-25 David Mosberger <davidm@hpl.hp.com>
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 25 Oct 2004 15:24:25 +0000 (15:24 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 25 Oct 2004 15:24:25 +0000 (15:24 +0000)
* readelf.c (slurp_ia64_unwind_table): Support relocations against
non-section symbols by adding in the symbol value.

binutils/ChangeLog
binutils/readelf.c

index 665e83f..936792c 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-25  David Mosberger  <davidm@hpl.hp.com>
+
+       * readelf.c (slurp_ia64_unwind_table): Support relocations against
+       non-section symbols by adding in the symbol value.
+
 2004-10-25  Nick Clifton  <nickc@redhat.com>
 
        PR 465
index b2a2689..7944c2a 100644 (file)
@@ -4421,25 +4421,11 @@ slurp_ia64_unwind_table (FILE *file,
            {
              relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
              sym = aux->symtab + ELF32_R_SYM (rp->r_info);
-
-             if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
-               {
-                 warn (_("Skipping unexpected symbol type %u\n"),
-                       ELF32_ST_TYPE (sym->st_info));
-                 continue;
-               }
            }
          else
            {
              relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
              sym = aux->symtab + ELF64_R_SYM (rp->r_info);
-
-             if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
-               {
-                 warn (_("Skipping unexpected symbol type %u\n"),
-                       ELF64_ST_TYPE (sym->st_info));
-                 continue;
-               }
            }
 
          if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
@@ -4454,15 +4440,15 @@ slurp_ia64_unwind_table (FILE *file,
            {
            case 0:
              aux->table[i].start.section = sym->st_shndx;
-             aux->table[i].start.offset += rp->r_addend;
+             aux->table[i].start.offset += rp->r_addend + sym->st_value;
              break;
            case 1:
              aux->table[i].end.section   = sym->st_shndx;
-             aux->table[i].end.offset   += rp->r_addend;
+             aux->table[i].end.offset   += rp->r_addend + sym->st_value;
              break;
            case 2:
              aux->table[i].info.section  = sym->st_shndx;
-             aux->table[i].info.offset  += rp->r_addend;
+             aux->table[i].info.offset  += rp->r_addend + sym->st_value;
              break;
            default:
              break;