Add ARM v5t, v5te and XScale support
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index 3f155b85e094d3ef884e02bbfb9d1dc0a9227b75..c5025fb52d1bd14a3917a3506e9b71a5a57401f4 100644 (file)
@@ -1466,8 +1466,8 @@ static const unsigned int coff_section_alignment_table_size =
 
 static boolean
 coff_new_section_hook (abfd, section)
-     bfd *abfd;
-     asection *section;
+     bfd * abfd;
+     asection * section;
 {
   combined_entry_type *native;
 
@@ -1607,6 +1607,23 @@ coff_set_alignment_hook (abfd, section, scnhdr)
   pei_section_data (abfd, section)->pe_flags = hdr->s_flags;
 
   section->lma = hdr->s_vaddr;
+
+  /* check for extended relocs */
+  if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL)
+    {
+      struct external_reloc dst;
+      struct internal_reloc n;
+      int oldpos = bfd_tell (abfd);
+      bfd_seek (abfd, hdr->s_relptr, 0);
+      if (bfd_read ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
+         != bfd_coff_relsz (abfd))
+       return;
+      
+      coff_swap_reloc_in (abfd, &dst, &n);
+      bfd_seek (abfd, oldpos, 0);
+      section->reloc_count =
+       hdr->s_nreloc = n.r_vaddr;
+    }
 }
 #undef ALIGN_SET
 #undef ELIFALIGN_SET
@@ -1966,32 +1983,33 @@ coff_set_arch_mach_hook (abfd, filehdr)
               (because that's how they were bootstrapped originally),
               but they are always PowerPC architecture.  */
            arch = bfd_arch_powerpc;
-           machine = 0;
+           machine = bfd_mach_ppc;
 #else
-           arch = bfd_arch_rs6000;
 #ifdef XCOFF64
-           machine = 620;
+           arch = bfd_arch_powerpc;
+           machine = bfd_mach_ppc_620;
 #else
-           machine = 6000;
+           arch = bfd_arch_rs6000;
+           machine = bfd_mach_rs6k;
 #endif
 #endif /* POWERMAC */
            break;
 
          case 1:
            arch = bfd_arch_powerpc;
-           machine = 601;
+           machine = bfd_mach_ppc_601;
            break;
          case 2: /* 64 bit PowerPC */
            arch = bfd_arch_powerpc;
-           machine = 620;
+           machine = bfd_mach_ppc_620;
            break;
          case 3:
            arch = bfd_arch_powerpc;
-           machine = 0;
+           machine = bfd_mach_ppc;
            break;
          case 4:
            arch = bfd_arch_rs6000;
-           machine = 6000;
+           machine = bfd_mach_rs6k;
            break;
          }
       }
@@ -2149,7 +2167,7 @@ symname_in_debug_hook (abfd, sym)
 #ifdef XCOFF64
 #define FORCE_SYMNAMES_IN_STRINGS
 #endif
-  
+
 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
 
 static boolean coff_pointerize_aux_hook
@@ -2335,6 +2353,22 @@ coff_write_relocs (abfd, first_undef)
 
       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
        return false;
+
+#ifdef COFF_WITH_PE
+      if (s->reloc_count > 0xffff)
+       {
+         /* encode real count here as first reloc */
+         struct internal_reloc n;
+         memset ((PTR) & n, 0, sizeof (n));
+         /* add one to count *this* reloc (grr) */
+         n.r_vaddr = s->reloc_count + 1;
+         coff_swap_reloc_out (abfd, &n, &dst);
+         if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
+             != bfd_coff_relsz (abfd))
+           return false;
+       }
+#endif
+
       for (i = 0; i < s->reloc_count; i++)
        {
          struct internal_reloc n;
@@ -2562,7 +2596,10 @@ coff_set_flags (abfd, magicp, flagsp)
        case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
        case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
        case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
-       case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break; /* XXX - we do not have an F_ARM_5T */
+         /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.  */
+       case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break;
+       case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
+       case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
        }
       return true;
 #endif
@@ -2698,7 +2735,8 @@ coff_set_flags (abfd, magicp, flagsp)
     case bfd_arch_powerpc:
 #endif
 #ifdef XCOFF64
-      if (bfd_get_mach (abfd) == 620 && !strncmp (abfd->xvec->name,"aix", 3))
+      if (bfd_get_mach (abfd) == bfd_mach_ppc_620
+         && !strncmp (abfd->xvec->name,"aix", 3))
        *magicp = U803XTOCMAGIC; 
       else
 #else
@@ -2714,9 +2752,15 @@ coff_set_flags (abfd, magicp, flagsp)
       return true;
 #endif
       
-    default:                   /* Unknown architecture */
-      /* return false;  -- fall through to "return false" below, to avoid
-       "statement never reached" errors on the one below. */
+#ifdef W65MAGIC
+    case bfd_arch_w65:
+      *magicp = W65MAGIC;
+      return true;
+#endif
+
+    default:                   /* Unknown architecture.  */
+      /* Fall through to "return false" below, to avoid
+        "statement never reached" errors on the one below.  */
       break;
     }
 
@@ -3168,7 +3212,7 @@ coff_write_object_contents (abfd)
   file_ptr reloc_base;
   file_ptr lineno_base;
   file_ptr sym_base;
-  unsigned long reloc_size = 0;
+  unsigned long reloc_size = 0, reloc_count = 0;
   unsigned long lnno_size = 0;
   boolean long_section_names;
   asection *text_sec = NULL;
@@ -3199,7 +3243,16 @@ coff_write_object_contents (abfd)
 
   for (current = abfd->sections; current != NULL; current =
        current->next)
-    reloc_size += current->reloc_count * bfd_coff_relsz (abfd);
+    {
+#ifdef COFF_WITH_PE
+      /* we store the actual reloc count in the first reloc's addr */
+      if (current->reloc_count > 0xffff)
+       reloc_count ++;
+#endif
+      reloc_count += current->reloc_count;
+    }
+
+  reloc_size = reloc_count * bfd_coff_relsz (abfd);
 
   lineno_base = reloc_base + reloc_size;
   sym_base = lineno_base + lnno_size;
@@ -3222,6 +3275,11 @@ coff_write_object_contents (abfd)
        {
          current->rel_filepos = reloc_base;
          reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
+#ifdef COFF_WITH_PE
+         /* extra reloc to hold real count */
+         if (current->reloc_count > 0xffff)
+           reloc_base += bfd_coff_relsz (abfd);
+#endif
        }
       else
        {
@@ -3340,7 +3398,7 @@ coff_write_object_contents (abfd)
          && ! is_reloc_section)
        hasdebug = true;
 
-#ifdef RS6000COFF_C 
+#ifdef RS6000COFF_C
 #ifndef XCOFF64
       /* Indicate the use of an XCOFF overflow section header.  */
       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
@@ -3393,7 +3451,7 @@ coff_write_object_contents (abfd)
          SCNHDR buff;
          if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
              || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
-                  != bfd_coff_scnhsz (abfd))
+             != bfd_coff_scnhsz (abfd))
            return false;
        }
 
@@ -3515,7 +3573,7 @@ coff_write_object_contents (abfd)
          scnhdr.s_flags = STYP_OVRFLO;
          if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
              || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
-                  != bfd_coff_scnhsz (abfd))
+             != bfd_coff_scnhsz (abfd))
            return false;
        }
     }
@@ -4436,7 +4494,7 @@ coff_slurp_symbol_table (abfd)
 #endif
 
            case C_BLOCK:       /* ".bb" or ".eb"                */
-           case C_FCN:         /* ".bf" or ".ef" (or PE ".lf")  */
+           case C_FCN:         /* ".bf" or ".ef" (or PE ".lf")  */
            case C_EFCN:        /* physical end of function      */
 #if defined COFF_WITH_PE
              /* PE sets the symbol to a value relative to the start
@@ -5042,7 +5100,7 @@ static const bfd_coff_backend_data bfd_coff_std_swap_table =
 #else
   false,
 #endif
-  COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 
+  COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
   true,
 #else
This page took 0.026524 seconds and 4 git commands to generate.