* dwarf.c (is_relocatable): Remove definition.
authorNick Clifton <nickc@redhat.com>
Wed, 31 Oct 2007 16:09:53 +0000 (16:09 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 31 Oct 2007 16:09:53 +0000 (16:09 +0000)
  (display_debug_frames): Remove check in is_relocatable.
* dwarf.h (is_relocatable): Remove declaration.
* objdump.c (is_relocatable): New static definition.
* readelf.c (dump_relocations): Make the function void.
  (is_32bit_abs_reloc): Add support for x86, Arc, Arm, D10V, Dlx, OR32 and Score.
  (is_32bit_pcrel_reloc): Add support for x86 and Arm.
  (is_16bit_abs_reloc): Add support for D10V.
  (debug_apply_rela_addends): Rename to debug_apply_relocations.
  Add code to support rel relocations.
  (load_debug_section): Fix call to debug_apply_relocations.
  (get_file_header): Remove setting of is_relocatable.
* gas/cfi/cfi-common-6.d: Allow for possible relocation of the .debug.eh_frame section.

binutils/ChangeLog
binutils/dwarf.c
binutils/dwarf.h
binutils/objdump.c
binutils/readelf.c
gas/testsuite/ChangeLog
gas/testsuite/gas/cfi/cfi-common-6.d

index abd9a96d872b6714369ecb519e7ad60d0f505436..137b3731edeef88a5b8ab9aef81545c1987971ed 100644 (file)
@@ -1,3 +1,19 @@
+2007-10-31  Nick Clifton  <nickc@redhat.com>
+
+       * dwarf.c (is_relocatable): Remove definition.
+       (display_debug_frames): Remove check in is_relocatable.
+       * dwarf.h (is_relocatable): Remove declaration.
+       * objdump.c (is_relocatable): New static definition.
+       * readelf.c (dump_relocations): Make the function void.
+       (is_32bit_abs_reloc): Add support for x86, Arc, Arm, D10V, Dlx,
+       OR32 and Score.
+       (is_32bit_pcrel_reloc): Add support for x86 and Arm.
+       (is_16bit_abs_reloc): Add support for D10V.
+       (debug_apply_rela_addends): Rename to debug_apply_relocations.
+       Add code to support rel relocations.
+       (load_debug_section): Fix call to debug_apply_relocations.
+       (get_file_header): Remove setting of is_relocatable.
+
 2007-10-31  Alan Modra  <amodra@bigpond.net.au>
 
        * readelf.c (debug_apply_rela_addends): Clarify FIXME.
index e3231d830146f495861b05c53311c663d38da54e..9a021c5f3bf9c5562d897dec7687f05ad651b6d0 100644 (file)
@@ -36,7 +36,6 @@ static unsigned int num_debug_info_entries = 0;
 static debug_info *debug_information = NULL;
 
 dwarf_vma eh_addr_size;
-int is_relocatable;
 
 int do_debug_info;
 int do_debug_abbrevs;
@@ -3184,11 +3183,7 @@ display_debug_frames (struct dwarf_section *section,
            encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
 
          fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
-         if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
-             /* Don't adjust for relocatable file since there's
-                invariably a pcrel reloc here, which we haven't
-                applied.  */
-             && !is_relocatable)
+         if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
            fc->pc_begin += section->address + (start - section_start);
          start += encoded_ptr_size;
          fc->pc_range = byte_get (start, encoded_ptr_size);
@@ -3391,8 +3386,7 @@ display_debug_frames (struct dwarf_section *section,
 
            case DW_CFA_set_loc:
              vma = get_encoded_value (start, fc->fde_encoding);
-             if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
-                 && !is_relocatable)
+             if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
                vma += section->address + (start - section_start);
              start += encoded_ptr_size;
              if (do_debug_frames_interp)
index 7f815c8b2a67df5885d660e42d777ec2653085a8..113a8f907721d0397cbd87f3d99601b5459109cf 100644 (file)
@@ -92,7 +92,6 @@ extern dwarf_vma byte_get_little_endian (unsigned char *, int);
 extern dwarf_vma byte_get_big_endian (unsigned char *, int);
 
 extern dwarf_vma eh_addr_size;
-extern int is_relocatable;
 
 extern int do_debug_info;
 extern int do_debug_abbrevs;
index ee5530b1464f3131ff53914803160d90f6ca7847..5a2ea6ddf3703cc9421fd3a4f4bd16cdd54ad486 100644 (file)
@@ -171,6 +171,8 @@ static bfd_size_type stab_size;
 
 static char *strtab;
 static bfd_size_type stabstr_size;
+
+static bfd_boolean is_relocatable = FALSE;
 \f
 static void
 usage (FILE *stream, int status)
index 9ae077935ea9cfcf6842ab5f9da3586477b398b7..b64f77538775df517df9491e190b4dd8a9ab5dba 100644 (file)
@@ -879,7 +879,7 @@ get_reloc_symindex (bfd_vma reloc_info)
 /* Display the contents of the relocation data found at the specified
    offset.  */
 
-static int
+static void
 dump_relocations (FILE *file,
                  unsigned long rel_offset,
                  unsigned long rel_size,
@@ -899,12 +899,12 @@ dump_relocations (FILE *file,
   if (is_rela)
     {
       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
-       return 0;
+       return;
     }
   else
     {
       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
-       return 0;
+       return;
     }
 
   if (is_32bit_elf)
@@ -1367,8 +1367,6 @@ dump_relocations (FILE *file,
     }
 
   free (rels);
-
-  return 1;
 }
 
 static const char *
@@ -5034,8 +5032,7 @@ slurp_ia64_unwind_table (FILE *file,
     }
   free (table);
 
-  /* Third, apply any relocations to the unwind table: */
-
+  /* Third, apply any relocations to the unwind table:  */
   for (relsec = section_headers;
        relsec < section_headers + elf_header.e_shnum;
        ++relsec)
@@ -5439,7 +5436,6 @@ slurp_hppa_unwind_table (FILE *file,
   free (table);
 
   /* Third, apply any relocations to the unwind table.  */
-
   for (relsec = section_headers;
        relsec < section_headers + elf_header.e_shnum;
        ++relsec)
@@ -7946,12 +7942,19 @@ is_32bit_abs_reloc (unsigned int reloc_type)
 {
   switch (elf_header.e_machine)
     {
+    case EM_386:
+    case EM_486:
+      return reloc_type == 1; /* R_386_32.  */
     case EM_68K:
       return reloc_type == 1; /* R_68K_32.  */
     case EM_860:
       return reloc_type == 1; /* R_860_32.  */
     case EM_ALPHA:
       return reloc_type == 1; /* XXX Is this right ?  */
+    case EM_ARC:
+      return reloc_type == 1; /* R_ARC_32.  */
+    case EM_ARM:
+      return reloc_type == 2; /* R_ARM_ABS32 */
     case EM_AVR_OLD: 
     case EM_AVR:
       return reloc_type == 1;
@@ -7965,9 +7968,14 @@ is_32bit_abs_reloc (unsigned int reloc_type)
       return reloc_type == 15; /* R_CRX_NUM32.  */
     case EM_CYGNUS_FRV:
       return reloc_type == 1;
+    case EM_CYGNUS_D10V:
+    case EM_D10V:
+      return reloc_type == 6; /* R_D10V_32.  */
     case EM_CYGNUS_D30V:
     case EM_D30V:
       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
+    case EM_DLX:
+      return reloc_type == 3; /* R_DLX_RELOC_32.  */
     case EM_CYGNUS_FR30:
     case EM_FR30:
       return reloc_type == 3; /* R_FR30_32.  */
@@ -8005,6 +8013,9 @@ is_32bit_abs_reloc (unsigned int reloc_type)
       return reloc_type == 1; /* R_MSP43_32.  */
     case EM_MT:
       return reloc_type == 2; /* R_MT_32.  */
+    case EM_OPENRISC:
+    case EM_OR32:
+      return reloc_type == 1; /* R_OR32_32.  */
     case EM_PARISC:
       return reloc_type == 1; /* R_PARISC_DIR32.  */
     case EM_PJ:
@@ -8019,6 +8030,8 @@ is_32bit_abs_reloc (unsigned int reloc_type)
     case EM_S390_OLD:
     case EM_S390:
       return reloc_type == 4; /* R_S390_32.  */
+    case EM_SCORE:
+      return reloc_type == 8; /* R_SCORE_ABS32.  */
     case EM_SH:
       return reloc_type == 1; /* R_SH_DIR32.  */
     case EM_SPARC32PLUS:
@@ -8058,10 +8071,15 @@ is_32bit_pcrel_reloc (unsigned int reloc_type)
 {
   switch (elf_header.e_machine)
     {
+    case EM_386:
+    case EM_486:
+      return reloc_type == 2; /* R_386_PC32.  */
     case EM_68K:
       return reloc_type == 4; /* R_68K_PC32.  */
     case EM_ALPHA:
       return reloc_type == 10; /* R_ALPHA_SREL32.  */
+    case EM_ARM:
+      return reloc_type == 3; /* R_ARM_REL32 */
     case EM_PARISC:
       return reloc_type == 0; /* R_PARISC_NONE.  *//* FIXME: This reloc is generated, but it may be a bug.  */
     case EM_PPC:
@@ -8083,8 +8101,8 @@ is_32bit_pcrel_reloc (unsigned int reloc_type)
       /* Do not abort or issue an error message here.  Not all targets use
         pc-relative 32-bit relocs in their DWARF debug information and we
         have already tested for target coverage in is_32bit_abs_reloc.  A
-        more helpful warning message will be generated by debug_apply_rela_addends
-        anyway, so just return.  */
+        more helpful warning message will be generated by
+        debug_apply_relocations anyway, so just return.  */
       return FALSE;
     }
 }
@@ -8125,6 +8143,9 @@ is_16bit_abs_reloc (unsigned int reloc_type)
     case EM_AVR_OLD:
     case EM_AVR:
       return reloc_type == 4; /* R_AVR_16.  */
+    case EM_CYGNUS_D10V:
+    case EM_D10V:
+      return reloc_type == 3; /* R_D10V_16.  */
     case EM_H8S:
     case EM_H8_300:
     case EM_H8_300H:
@@ -8140,52 +8161,66 @@ is_16bit_abs_reloc (unsigned int reloc_type)
     }
 }
 
-/* Apply addends of RELA relocations.  */
+/* Apply relocations to a debug section.  */
 
-static int
-debug_apply_rela_addends (void *file,
-                         Elf_Internal_Shdr *section,
-                         unsigned char *start)
+static void
+debug_apply_relocations (void *file,
+                        Elf_Internal_Shdr *section,
+                        unsigned char *start)
 {
   Elf_Internal_Shdr *relsec;
   unsigned char *end = start + section->sh_size;
 
-  if (!is_relocatable)
-    return 1;
-
-  /* SH uses RELA but uses in place value instead of the addend field.  */
-  if (elf_header.e_machine == EM_SH)
-    return 0;
+  if (elf_header.e_type != ET_REL)
+    return;
 
+  /* Find the reloc section associated with the debug section.  */
   for (relsec = section_headers;
        relsec < section_headers + elf_header.e_shnum;
        ++relsec)
     {
-      unsigned long nrelas;
-      Elf_Internal_Rela *rela, *rp;
+      bfd_boolean is_rela;
+      unsigned long num_relocs;
+      Elf_Internal_Rela *relocs, *rp;
       Elf_Internal_Shdr *symsec;
       Elf_Internal_Sym *symtab;
       Elf_Internal_Sym *sym;
 
-      if (relsec->sh_type != SHT_RELA
+      if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
          || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
          || SECTION_HEADER (relsec->sh_info) != section
          || relsec->sh_size == 0
          || SECTION_HEADER_INDEX (relsec->sh_link) >= elf_header.e_shnum)
        continue;
 
-      if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
-                             &rela, &nrelas))
-       return 0;
+      is_rela = relsec->sh_type == SHT_RELA;
+
+      if (is_rela)
+       {
+         if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
+                                 & relocs, & num_relocs))
+           return;
+       }
+      else
+       {
+         if (!slurp_rel_relocs (file, relsec->sh_offset, relsec->sh_size,
+                                & relocs, & num_relocs))
+           return;
+       }
+
+      /* SH uses RELA but uses in place value instead of the addend field.  */
+      if (elf_header.e_machine == EM_SH)
+       is_rela = FALSE;
 
       symsec = SECTION_HEADER (relsec->sh_link);
       symtab = GET_ELF_SYMBOLS (file, symsec);
 
-      for (rp = rela; rp < rela + nrelas; ++rp)
+      for (rp = relocs; rp < relocs + num_relocs; ++rp)
        {
-         unsigned int reloc_type;
-         unsigned int reloc_size;
-         unsigned char *loc;
+         bfd_vma         addend;
+         unsigned int    reloc_type;
+         unsigned int    reloc_size;
+         unsigned char * loc;
 
          /* In MIPS little-endian objects, r_info isn't really a
             64-bit little-endian value: it has a 32-bit little-endian
@@ -8200,8 +8235,8 @@ debug_apply_rela_addends (void *file,
                          | ((rp->r_info >> 24) & 0xff0000)
                          | ((rp->r_info >> 8) & 0xff000000));
 
-         sym = symtab + get_reloc_symindex (rp->r_info);
          reloc_type = get_reloc_type (rp->r_info);
+
          if (is_32bit_abs_reloc (reloc_type)
              || is_32bit_pcrel_reloc (reloc_type))
            reloc_size = 4;
@@ -8211,7 +8246,7 @@ debug_apply_rela_addends (void *file,
            reloc_size = 2;
          else
            {
-             warn (_("skipping unsupported reloc type %d in section .rela%s\n"),
+             warn (_("unable to apply unsupported reloc type %d to section %s\n"),
                    reloc_type, SECTION_NAME (section));
              continue;
            }
@@ -8225,6 +8260,10 @@ debug_apply_rela_addends (void *file,
              continue;
            }
 
+         sym = symtab + get_reloc_symindex (rp->r_info);
+
+         /* If the reloc has a symbol associated with it,
+            make sure that it is of an appropriate type.  */
          if (sym != symtab
              && ELF_ST_TYPE (sym->st_info) != STT_SECTION
              /* Relocations against symbols without type can happen.
@@ -8236,26 +8275,26 @@ debug_apply_rela_addends (void *file,
                 example of this see the _clz.o binary in libgcc.a.  */
              && ELF_ST_TYPE (sym->st_info) != STT_OBJECT)
            {
-             warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
+             warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
                    get_symbol_type (ELF_ST_TYPE (sym->st_info)),
-                   SECTION_NAME (section));
+                   rp - relocs,
+                   SECTION_NAME (relsec));
              continue;
            }
 
-         /* FIXME.  We apply pcrel relocs as if they were absolute,
-            ie. without subtracting the pc.  This is to suit
-            display_debug_frames which does not add the pc even
-            though it ought to for DW_EH_PE_pcrel FDEs.  Removing
-            the hack in display_debug_frames will require that we
-            apply rel relocs too.  */
-         byte_put (loc, rp->r_addend + sym->st_value, reloc_size);
+         addend = is_rela ? rp->r_addend : byte_get (loc, reloc_size);
+         
+         if (is_32bit_pcrel_reloc (reloc_type))
+           byte_put (loc, (addend + sym->st_value) - rp->r_offset,
+                     reloc_size);
+         else
+           byte_put (loc, addend + sym->st_value, reloc_size);
        }
 
       free (symtab);
-      free (rela);
+      free (relocs);
       break;
     }
-  return 1;
 }
 
 int
@@ -8281,7 +8320,7 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
                             sec->sh_size, buf);
 
   if (debug_displays [debug].relocate)
-    debug_apply_rela_addends (file, sec, section->start);
+    debug_apply_relocations (file, sec, section->start);
 
   return section->start != NULL;
 }
@@ -9886,8 +9925,6 @@ get_file_header (FILE *file)
        get_64bit_section_headers (file, 1);
     }
 
-  is_relocatable = elf_header.e_type == ET_REL;
-
   return 1;
 }
 
index 8e2a12d56583f9087aee1ae6508ac3993fd9eb49..67faa16c645511d99985d51eab45145db7a5a540 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-31  Nick Clifton  <nickc@redhat.com>
+
+       * gas/cfi/cfi-common-6.d: Allow for possible relocation of the
+       .debug.eh_frame section.
+
 2007-10-30  Nick Clifton  <nickc@redhat.com>
 
        * gas/all/gas.exp: Do not run diff1.s test for mn10300.
index dcc7b79b969723ba1637d4baa8db78bb3acac73d..3ae356e48d9c79ca45bd1ea108d28d20d40fb405 100644 (file)
@@ -14,7 +14,7 @@ The section .eh_frame contains:
   DW_CFA_nop
   DW_CFA_nop
 
-0000001c 00000018 00000020 FDE cie=00000000 pc=00000000..00000004
+0000001c 00000018 00000020 FDE cie=00000000 pc=000000(00|24)..000000(04|28)
   Augmentation data:     (00 00 00 00 de ad be ef|ef be ad de 00 00 00 00)
 
   DW_CFA_nop
@@ -31,14 +31,14 @@ The section .eh_frame contains:
 
   DW_CFA_nop
 
-0000004c 00000018 00000018 FDE cie=00000038 pc=00000004..00000008
+0000004c 00000018 00000018 FDE cie=00000038 pc=000000(04|58)..000000(08|5c)
   Augmentation data:     (00 00 00 00 de ad be ef|ef be ad de 00 00 00 00)
 
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-00000068 00000018 0000006c FDE cie=00000000 pc=00000008..0000000c
+00000068 00000018 0000006c FDE cie=00000000 pc=000000(08|78)..000000(0c|7c)
   Augmentation data:     (00 00 00 00 be ef de ad|ad de ef be 00 00 00 00)
 
   DW_CFA_nop
@@ -57,14 +57,14 @@ The section .eh_frame contains:
   DW_CFA_nop
   DW_CFA_nop
 
-000000a0 00000014 00000020 FDE cie=00000084 pc=0000000c..00000010
+000000a0 00000014 00000020 FDE cie=00000084 pc=000000(0c|b4)..000000(10|b8)
   Augmentation data:     .. .. .. ..
 
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-000000b8 00000014 00000038 FDE cie=00000084 pc=00000010..00000014
+000000b8 00000014 00000038 FDE cie=00000084 pc=000000(10|d0)..000000(14|d4)
   Augmentation data:     .. .. .. ..
 
   DW_CFA_nop