Fixes for use of ARM_26D reloc in arm-wince toolchain.
authorNick Clifton <nickc@redhat.com>
Fri, 5 Dec 2003 11:30:18 +0000 (11:30 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 5 Dec 2003 11:30:18 +0000 (11:30 +0000)
bfd/ChangeLog
bfd/coff-arm.c
ld/ChangeLog
ld/pe-dll.c

index ed92ab4..371f4a8 100644 (file)
@@ -1,3 +1,12 @@
+2003-12-05  Dmitry Semyonov  <Dmitry.Semyonov@oktet.ru>
+
+       * coff-arm.c (aoutarm_std_reloc_howto [ARM_WINCE]): Set
+       partial_inplace for these relocs to FALSE for comptability with
+       the MS linker.
+       Remap ARM_26D relocation from 5 to 0. This fixes "bad fixup" error
+       generated by MS linker, and brings the relocation in line the MS
+       PE documentation.
+
 2003-12-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-ppc.c (ppc_elf_relax_section): Don't check relax_finalizing.
index ba8a736..9b26123 100644 (file)
@@ -252,11 +252,11 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 #undef  ARM_THUMB12
 #undef  ARM_26D
 
+#define ARM_26D      0
 #define ARM_32       1
 #define ARM_RVA32    2
 #define ARM_26      3
 #define ARM_THUMB12  4
-#define ARM_26D      5
 #define ARM_SECTION  14
 #define ARM_SECREL   15
 #endif
@@ -264,7 +264,19 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 static reloc_howto_type aoutarm_std_reloc_howto[] =
   {
 #ifdef ARM_WINCE
-    EMPTY_HOWTO (-1),
+    HOWTO (ARM_26D,
+          2,
+          2,
+          24,
+          FALSE,
+          0,
+          complain_overflow_dont,
+          aoutarm_fix_pcrel_26_done,
+          "ARM_26D",
+          FALSE,
+          0x00ffffff,
+          0x0,
+          FALSE),
     HOWTO (ARM_32,
           0,
           2,
@@ -274,7 +286,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           complain_overflow_bitfield,
           coff_arm_reloc,
           "ARM_32",
-          TRUE,
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
@@ -287,7 +299,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           complain_overflow_bitfield,
           coff_arm_reloc,
           "ARM_RVA32",
-          TRUE,
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
@@ -317,19 +329,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0x000007ff,
           0x000007ff,
           PCRELOFFSET),
-    HOWTO (ARM_26D,
-          2,
-          2,
-          24,
-          FALSE,
-          0,
-          complain_overflow_dont,
-          aoutarm_fix_pcrel_26_done,
-          "ARM_26D",
-          TRUE,
-          0x00ffffff,
-          0x0,
-          FALSE),
+    EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
@@ -346,8 +346,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0,
           complain_overflow_bitfield,
           coff_arm_reloc,
-          "ARM_16",
-          TRUE,
+          "ARM_SECTION",
+          FALSE,
           0x0000ffff,
           0x0000ffff,
           PCRELOFFSET),
@@ -359,8 +359,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0,
           complain_overflow_bitfield,
           coff_arm_reloc,
-          "ARM_32",
-          TRUE,
+          "ARM_SECREL",
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
index bf844d1..de662ea 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-05  Dmitry Semyonov  <Dmitry.Semyonov@oktet.ru>
+
+       * pe-dll.c (generate_reloc): Remap ARM_26D relocation from 5 to
+       0.  This fixes "bad fixup" error generated by MS linker.
+
 2003-12-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        * emultempl/ia64elf.em (gld${EMULATION_NAME}_after_parse): Set
index ebd3711..0542ace 100644 (file)
@@ -1155,7 +1155,12 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                      total_relocs++;
                      break;
                    case BITS_AND_SHIFT (24, 2):
-                     if (relocs[i]->howto->type == 5)
+                     /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
+                        Those ARM_xxx definitions should go in proper
+                        header someday.  */
+                     if (relocs[i]->howto->type == 0
+                         /* Older GNU linkers used 5 instead of 0 for this reloc.  */
+                         || relocs[i]->howto->type == 5)
                        /* This is an ARM_26D reloc, which is an ARM_26 reloc
                           that has already been fully processed during a
                           previous link stage, so ignore it here.  */