bfd/
[deliverable/binutils-gdb.git] / bfd / elf32-m68k.c
index 50b962dad3fc213528d036910869d2deeb6c8b98..ad7e56f1ded7f8f48889d352cecf131739d24de4 100644 (file)
@@ -429,40 +429,42 @@ elf32_m68k_object_p (bfd *abfd)
   unsigned features = 0;
   flagword eflags = elf_elfheader (abfd)->e_flags;
 
-  if (eflags & EF_M68K_M68000)
+  if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
     features |= m68000;
-  else if (eflags & EF_M68K_CPU32)
+  else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
     features |= cpu32;
-  else if (eflags & EF_M68K_ISA_MASK)
+  else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
+    features |= fido_a;
+  else
     {
-      switch (eflags & EF_M68K_ISA_MASK)
+      switch (eflags & EF_M68K_CF_ISA_MASK)
        {
-       case EF_M68K_ISA_A_NODIV:
+       case EF_M68K_CF_ISA_A_NODIV:
          features |= mcfisa_a;
          break;
-       case EF_M68K_ISA_A:
+       case EF_M68K_CF_ISA_A:
          features |= mcfisa_a|mcfhwdiv;
          break;
-       case EF_M68K_ISA_A_PLUS:
+       case EF_M68K_CF_ISA_A_PLUS:
          features |= mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp;
          break;
-       case EF_M68K_ISA_B_NOUSP:
+       case EF_M68K_CF_ISA_B_NOUSP:
          features |= mcfisa_a|mcfisa_b|mcfhwdiv;
          break;
-       case EF_M68K_ISA_B:
+       case EF_M68K_CF_ISA_B:
          features |= mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp;
          break;
        }
-      switch (eflags & EF_M68K_MAC_MASK)
+      switch (eflags & EF_M68K_CF_MAC_MASK)
        {
-       case EF_M68K_MAC:
+       case EF_M68K_CF_MAC:
          features |= mcfmac;
          break;
-       case EF_M68K_EMAC:
+       case EF_M68K_CF_EMAC:
          features |= mcfemac;
          break;
        }
-      if (eflags & EF_M68K_FLOAT)
+      if (eflags & EF_M68K_CF_FLOAT)
        features |= cfloat;
     }
 
@@ -518,10 +520,27 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd)
   else
     {
       out_flags = elf_elfheader (obfd)->e_flags;
-      in_isa = (in_flags & EF_M68K_ISA_MASK);
-      out_isa = (out_flags & EF_M68K_ISA_MASK);
+      unsigned int variant_mask;
+
+      if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
+       variant_mask = 0;
+      else if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
+       variant_mask = 0;
+      else if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
+       variant_mask = 0;
+      else
+       variant_mask = EF_M68K_CF_ISA_MASK;
+
+      in_isa = (in_flags & variant_mask);
+      out_isa = (out_flags & variant_mask);
       if (in_isa > out_isa)
        out_flags ^= in_isa ^ out_isa;
+      if (((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32
+          && (out_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
+         || ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO
+             && (out_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32))
+       out_flags = EF_M68K_FIDO;
+      else
       out_flags |= in_flags ^ in_isa;
     }
   elf_elfheader (obfd)->e_flags = out_flags;
@@ -548,58 +567,61 @@ elf32_m68k_print_private_bfd_data (abfd, ptr)
   /* xgettext:c-format */
   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
 
-  if (eflags & EF_M68K_CPU32)
-    fprintf (file, " [cpu32]");
-
-  if (eflags & EF_M68K_M68000)
+  if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
     fprintf (file, " [m68000]");
-
-  if (eflags & EF_M68K_CFV4E)
-    fprintf (file, " [cfv4e]");
-
-  if (eflags & EF_M68K_ISA_MASK)
+  else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
+    fprintf (file, " [cpu32]");
+  else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
+    fprintf (file, " [fido]");
+  else
     {
-      char const *isa = _("unknown");
-      char const *mac = _("unknown");
-      char const *additional = "";
-      
-      switch (eflags & EF_M68K_ISA_MASK)
-       {
-       case EF_M68K_ISA_A_NODIV:
-         isa = "A";
-         additional = " [nodiv]";
-         break;
-       case EF_M68K_ISA_A:
-         isa = "A";
-         break;
-       case EF_M68K_ISA_A_PLUS:
-         isa = "A+";
-         break;
-       case EF_M68K_ISA_B_NOUSP:
-         isa = "B";
-         additional = " [nousp]";
-         break;
-       case EF_M68K_ISA_B:
-         isa = "B";
-         break;
-       }
-      fprintf (file, " [isa %s]%s", isa, additional);
-      if (eflags & EF_M68K_FLOAT)
-       fprintf (file, " [float]");
-      switch (eflags & EF_M68K_MAC_MASK)
+      if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CFV4E)
+       fprintf (file, " [cfv4e]");
+
+      if (eflags & EF_M68K_CF_ISA_MASK)
        {
-       case 0:
-         mac = NULL;
-         break;
-       case EF_M68K_MAC:
-         mac = "mac";
-         break;
-       case EF_M68K_EMAC:
-         mac = "emac";
-         break;
+         char const *isa = _("unknown");
+         char const *mac = _("unknown");
+         char const *additional = "";
+      
+         switch (eflags & EF_M68K_CF_ISA_MASK)
+           {
+           case EF_M68K_CF_ISA_A_NODIV:
+             isa = "A";
+             additional = " [nodiv]";
+             break;
+           case EF_M68K_CF_ISA_A:
+             isa = "A";
+             break;
+           case EF_M68K_CF_ISA_A_PLUS:
+             isa = "A+";
+             break;
+           case EF_M68K_CF_ISA_B_NOUSP:
+             isa = "B";
+             additional = " [nousp]";
+             break;
+           case EF_M68K_CF_ISA_B:
+             isa = "B";
+             break;
+           }
+         fprintf (file, " [isa %s]%s", isa, additional);
+         if (eflags & EF_M68K_CF_FLOAT)
+           fprintf (file, " [float]");
+         switch (eflags & EF_M68K_CF_MAC_MASK)
+           {
+           case 0:
+             mac = NULL;
+             break;
+           case EF_M68K_CF_MAC:
+             mac = "mac";
+             break;
+           case EF_M68K_CF_EMAC:
+             mac = "emac";
+             break;
+           }
+         if (mac)
+           fprintf (file, " [%s]", mac);
        }
-      if (mac)
-       fprintf (file, " [%s]", mac);
     }
   
   fputc ('\n', file);
@@ -1833,11 +1855,12 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
              else
                {
                  /* This symbol is local, or marked to become local.  */
+                 outrel.r_addend = relocation + rel->r_addend;
+
                  if (r_type == R_68K_32)
                    {
                      relocate = TRUE;
                      outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
-                     outrel.r_addend = relocation + rel->r_addend;
                    }
                  else
                    {
@@ -1854,13 +1877,24 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
                        {
                          asection *osec;
 
+                         /* We are turning this relocation into one
+                            against a section symbol.  It would be
+                            proper to subtract the symbol's value,
+                            osec->vma, from the emitted reloc addend,
+                            but ld.so expects buggy relocs.  */
                          osec = sec->output_section;
                          indx = elf_section_data (osec)->dynindx;
-                         BFD_ASSERT (indx > 0);
+                         if (indx == 0)
+                           {
+                             struct elf_link_hash_table *htab;
+                             htab = elf_hash_table (info);
+                             osec = htab->text_index_section;
+                             indx = elf_section_data (osec)->dynindx;
+                           }
+                         BFD_ASSERT (indx != 0);
                        }
 
                      outrel.r_info = ELF32_R_INFO (indx, r_type);
-                     outrel.r_addend = relocation + rel->r_addend;
                    }
                }
 
@@ -2418,6 +2452,7 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt,
                                        elf_m68k_adjust_dynamic_symbol
 #define elf_backend_size_dynamic_sections \
                                        elf_m68k_size_dynamic_sections
+#define elf_backend_init_index_section _bfd_elf_init_1_index_section
 #define elf_backend_relocate_section   elf_m68k_relocate_section
 #define elf_backend_finish_dynamic_symbol \
                                        elf_m68k_finish_dynamic_symbol
This page took 0.031304 seconds and 4 git commands to generate.