bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Xcoff relocation types not supported?


From: Tom Rix
Subject: Re: Xcoff relocation types not supported?
Date: Fri, 03 May 2002 07:59:04 -0500

Nick Clifton wrote:

> Hi Alan, Hi Jason, Hi Tom,
>
> > Current CVS mainline binutils assembles your test file OK, but
> > objdump bombs when trying to display relocs.  :-(
> >
> > BFD: BFD 2.12.90 20020502 internal error, aborting at 
> > /src/binutils-current/bfd/coff-rs6000.c line 976 in _bfd_xcoff_rtype2howto
>
> Indeed it does.  This is because _bfd_xcoff_rtype2howto() selects the
> 32-bit R_BA reloc instead of the 16-bit one.  The patch below fixes
> this.
>
> Tom - any objections to my applying this patch (branch & mainline) ?
>

Thank you for the hard work but yes I do object.

This is a preliminary patch I that is being regression tested and will be 
applied later today.   I have discussed this with Jason and
Alan offline yesterday and have sent them this patch last night.

Your patch does fix the problem but my patch does some other things in addition 
to fixing the problem like:

A sanity check of objdump -r of libc.a's shr.o turned up a 16 bit R_RBR.
Makes objdump -r a little more meaningful by adding better howto names and 
fills in the addend address.
Reorder's the 64bit howto to put 64 bit pos as first entry.   Remove 64 bit 
from xcoff
Pulls swap_reloc into the xcoff, removes from coffcode.h

Tom

--
Tom Rix
GCC Engineer
address@hidden


diff -up bfd/coff-rs6000.c.old bfd/coff-rs6000.c
--- bfd/coff-rs6000.c.old 
+++ bfd/coff-rs6000.c 
@@ -54,9 +54,11 @@ extern void _bfd_xcoff_swap_sym_in PARAM
 extern unsigned int _bfd_xcoff_swap_sym_out PARAMS ((bfd *, PTR, PTR));
 extern void _bfd_xcoff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, 
PTR));
 extern unsigned int _bfd_xcoff_swap_aux_out PARAMS ((bfd *, PTR, int, int, 
int, int, PTR));
+static void xcoff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
+static unsigned int xcoff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
 
-/* Forward declare _bfd_xcoff_rtype2howto for coffcode.h macro.  */
-void _bfd_xcoff_rtype2howto PARAMS ((arelent *, struct internal_reloc *));
+/* Forward declare xcoff_rtype2howto for coffcode.h macro.  */
+void xcoff_rtype2howto PARAMS ((arelent *, struct internal_reloc *));
 
 /* coffcode.h needs these to be defined.  */
 #define RS6000COFF_C 1
@@ -74,7 +76,7 @@ void _bfd_xcoff_rtype2howto PARAMS ((are
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
 #define COFF_LONG_FILENAMES
 #define NO_COFF_SYMBOLS
-#define RTYPE2HOWTO(cache_ptr, dst) _bfd_xcoff_rtype2howto (cache_ptr, dst)
+#define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst)
 #define coff_mkobject _bfd_xcoff_mkobject
 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
@@ -105,6 +107,9 @@ extern int rs6000coff_core_file_failing_
 #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
 #define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
 #define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
+#define coff_swap_reloc_in xcoff_swap_reloc_in
+#define coff_swap_reloc_out xcoff_swap_reloc_out
+#define NO_COFF_RELOCS
 
 #include "coffcode.h"
 
@@ -696,7 +701,7 @@ reloc_howto_type xcoff_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_BA",                /* name */
+        "R_BA_26",             /* name */
         true,                  /* partial_inplace */
         0x3fffffc,             /* src_mask */
         0x3fffffc,             /* dst_mask */
@@ -900,7 +905,7 @@ reloc_howto_type xcoff_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_RBR",               /* name */
+        "R_RBR_26",            /* name */
         true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
@@ -921,50 +926,58 @@ reloc_howto_type xcoff_howto_table[] =
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
-  HOWTO (R_POS,                 /* type */
-         0,                     /* rightshift */
-         4,                     /* size (0 = byte, 1 = short, 2 = long) */
-         64,                    /* bitsize */
-         false,                 /* pc_relative */
-         0,                     /* bitpos */
-         complain_overflow_bitfield, /* complain_on_overflow */
-         0,                     /* special_function */
-         "R_POS",               /* name */
-         true,                  /* partial_inplace */
-         MINUS_ONE,             /* src_mask */
-        MINUS_ONE,             /* dst_mask */
-        false),                /* pcrel_offset */
-
   /* 16 bit Non modifiable absolute branch.  */
   HOWTO (R_BA,                 /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
         false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_BA",                /* name */
+        "R_BA_16",             /* name */
         true,                  /* partial_inplace */
         0xfffc,                /* src_mask */
         0xfffc,                /* dst_mask */
         false),                /* pcrel_offset */
+
+  /* Modifiable branch relative.  */
+  HOWTO (R_RBR,                        /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        0,                     /* special_function */
+        "R_RBR_16",            /* name */
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
+
 };
 
 void
-_bfd_xcoff_rtype2howto (relent, internal)
+xcoff_rtype2howto (relent, internal)
      arelent *relent;
      struct internal_reloc *internal;
 {
-  relent->howto = xcoff_howto_table + internal->r_type;
-
-  /* Check for relocs we don't know of.  */
-  if (internal->r_type
-      >= sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]))
-    abort ();
-  if (internal->r_type != relent->howto->type)
+  if (internal->r_type > R_RBRC)
     abort ();
 
+  /* Default howto layout works most of the time */
+  relent->howto = &xcoff_howto_table[internal->r_type];
+  
+  /* Special case some 16 bit reoloc */
+  if (15 == (internal->r_size & 0x1f))
+    {
+      if (R_BA == internal->r_type) 
+       relent->howto = &xcoff_howto_table[0x1c];
+      else if (R_RBR == internal->r_type) 
+       relent->howto = &xcoff_howto_table[0x1d];
+    }
+  
   /* The r_size field of an XCOFF reloc encodes the bitsize of the
      relocation, as well as indicating whether it is signed or not.
      Doublecheck that the relocation information gathered from the
@@ -972,14 +985,12 @@ _bfd_xcoff_rtype2howto (relent, internal
      for R_REF relocs.  */
   if (relent->howto->dst_mask != 0
       && (relent->howto->bitsize
-         != ((unsigned int) internal->r_size & 0x3f) + 1))
-    abort ();
-#if 0
-  if ((internal->r_size & 0x80) != 0
-      ? (relent->howto->complain_on_overflow != complain_overflow_signed)
-      : (relent->howto->complain_on_overflow != complain_overflow_bitfield))
+         != ((unsigned int) internal->r_size & 0x1f) + 1))
     abort ();
-#endif
+
+  /* Put a meaningful value in addend */
+  relent->addend = (internal->r_size & 0x80) ? - internal->r_vaddr 
+    : internal->r_vaddr;
 }
 
 reloc_howto_type *
@@ -992,7 +1003,7 @@ _bfd_xcoff_reloc_type_lookup (abfd, code
     case BFD_RELOC_PPC_B26:
       return &xcoff_howto_table[0xa];
     case BFD_RELOC_PPC_BA16:
-      return &xcoff_howto_table[0x1d];
+      return &xcoff_howto_table[0x1c];
     case BFD_RELOC_PPC_BA26:
       return &xcoff_howto_table[8];
     case BFD_RELOC_PPC_TOC16:
@@ -1000,8 +1011,6 @@ _bfd_xcoff_reloc_type_lookup (abfd, code
     case BFD_RELOC_32:
     case BFD_RELOC_CTOR:
       return &xcoff_howto_table[0];
-    case BFD_RELOC_64:
-      return &xcoff_howto_table[0x1c];
     default:
       return NULL;
     }
@@ -2650,6 +2659,40 @@ xcoff_swap_ldsym_out (abfd, src, d)
   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
 }
 
+static void
+xcoff_swap_reloc_in (abfd, s, d)
+     bfd *abfd;
+     PTR s;
+     PTR d;
+{
+  struct external_reloc *src = (struct external_reloc *) s;
+  struct internal_reloc *dst = (struct internal_reloc *) d;
+
+  memset (dst, 0, sizeof (struct internal_reloc));
+
+  dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
+  dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
+  dst->r_size = bfd_get_8 (abfd, src->r_size);
+  dst->r_type = bfd_get_8 (abfd, src->r_type);
+}
+
+static unsigned int
+xcoff_swap_reloc_out (abfd, s, d)
+     bfd *abfd;
+     PTR s;
+     PTR d;
+{
+  struct internal_reloc *src = (struct internal_reloc *) s;
+  struct external_reloc *dst = (struct external_reloc *) d;
+
+  bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
+  bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
+  bfd_put_8 (abfd, src->r_type, dst->r_type);
+  bfd_put_8 (abfd, src->r_size, dst->r_size);
+
+  return bfd_coff_relsz (abfd);
+}
+
 /* Swap in the ldrel structure.  */
 
 static void
@@ -3911,7 +3954,7 @@ static const struct xcoff_backend_data_r
       _bfd_xcoff_swap_aux_out,          /* _bfd_swap_aux_out */
       _bfd_xcoff_swap_sym_out,          /* _bfd_swap_sym_out */
       coff_swap_lineno_out,             /* _bfd_swap_lineno_out */
-      coff_swap_reloc_out,              /* _bfd_swap_reloc_out */
+      xcoff_swap_reloc_out,             /* _bfd_swap_reloc_out */
       coff_swap_filehdr_out,            /* _bfd_swap_filehdr_out */
       coff_swap_aouthdr_out,            /* _bfd_swap_aouthdr_out */
       coff_swap_scnhdr_out,             /* _bfd_swap_scnhdr_out */
@@ -3931,7 +3974,7 @@ static const struct xcoff_backend_data_r
       coff_swap_filehdr_in,             /* _bfd_coff_swap_filehdr_in */
       coff_swap_aouthdr_in,             /* _bfd_swap_aouthdr_in */
       coff_swap_scnhdr_in,              /* _bfd_swap_scnhdr_in */
-      coff_swap_reloc_in,               /* _bfd_reloc_in */
+      xcoff_swap_reloc_in,              /* _bfd_reloc_in */
       coff_bad_format_hook,             /* _bfd_bad_format_hook */
       coff_set_arch_mach_hook,          /* _bfd_set_arch_mach_hook */
       coff_mkobject_hook,               /* _bfd_mkobject_hook */
@@ -4168,7 +4211,7 @@ static const struct xcoff_backend_data_r
     _bfd_xcoff_swap_aux_out,          /* _bfd_swap_aux_out */
     _bfd_xcoff_swap_sym_out,          /* _bfd_swap_sym_out */
     coff_swap_lineno_out,             /* _bfd_swap_lineno_out */
-    coff_swap_reloc_out,              /* _bfd_swap_reloc_out */
+    xcoff_swap_reloc_out,             /* _bfd_swap_reloc_out */
     coff_swap_filehdr_out,            /* _bfd_swap_filehdr_out */
     coff_swap_aouthdr_out,            /* _bfd_swap_aouthdr_out */
     coff_swap_scnhdr_out,             /* _bfd_swap_scnhdr_out */
@@ -4188,7 +4231,7 @@ static const struct xcoff_backend_data_r
     coff_swap_filehdr_in,             /* _bfd_coff_swap_filehdr_in */
     coff_swap_aouthdr_in,             /* _bfd_swap_aouthdr_in */
     coff_swap_scnhdr_in,              /* _bfd_swap_scnhdr_in */
-    coff_swap_reloc_in,               /* _bfd_reloc_in */
+    xcoff_swap_reloc_in,              /* _bfd_reloc_in */
     coff_bad_format_hook,             /* _bfd_bad_format_hook */
     coff_set_arch_mach_hook,          /* _bfd_set_arch_mach_hook */
     coff_mkobject_hook,               /* _bfd_mkobject_hook */
diff -up bfd/coff64-rs6000.c.old bfd/coff64-rs6000.c
--- bfd/coff64-rs6000.c.old 
+++ bfd/coff64-rs6000.c 
@@ -96,6 +96,8 @@ static void _bfd_xcoff64_swap_aux_in
   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
 static unsigned int _bfd_xcoff64_swap_aux_out
   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
+static void xcoff64_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
+static unsigned int xcoff64_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
 extern boolean _bfd_xcoff_mkobject PARAMS ((bfd *));
 extern boolean _bfd_xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *));
 extern boolean _bfd_xcoff_is_local_label_name PARAMS ((bfd *, const char *));
@@ -199,7 +201,9 @@ extern int rs6000coff_core_file_failing_
 #define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out
 #define coff_SWAP_aux_in _bfd_xcoff64_swap_aux_in
 #define coff_SWAP_aux_out _bfd_xcoff64_swap_aux_out
-
+#define coff_swap_reloc_in xcoff64_swap_reloc_in
+#define coff_swap_reloc_out xcoff64_swap_reloc_out
+#define NO_COFF_RELOCS
 
 #include "coffcode.h"
 
@@ -614,6 +618,40 @@ xcoff64_swap_ldsym_out (abfd, src, d)
   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
 }
 
+static void
+xcoff64_swap_reloc_in (abfd, s, d)
+     bfd *abfd;
+     PTR s;
+     PTR d;
+{
+  struct external_reloc *src = (struct external_reloc *) s;
+  struct internal_reloc *dst = (struct internal_reloc *) d;
+
+  memset (dst, 0, sizeof (struct internal_reloc));
+
+  dst->r_vaddr = bfd_get_64 (abfd, src->r_vaddr);
+  dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
+  dst->r_size = bfd_get_8 (abfd, src->r_size);
+  dst->r_type = bfd_get_8 (abfd, src->r_type);
+}
+
+static unsigned int
+xcoff64_swap_reloc_out (abfd, s, d)
+     bfd *abfd;
+     PTR s;
+     PTR d;
+{
+  struct internal_reloc *src = (struct internal_reloc *) s;
+  struct external_reloc *dst = (struct external_reloc *) d;
+
+  bfd_put_64 (abfd, src->r_vaddr, dst->r_vaddr);
+  bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
+  bfd_put_8 (abfd, src->r_type, dst->r_type);
+  bfd_put_8 (abfd, src->r_size, dst->r_size);
+
+  return bfd_coff_relsz (abfd);
+}
+
 /* Swap in the ldrel structure.  */
 
 static void
@@ -1203,7 +1241,7 @@ reloc_howto_type xcoff64_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_POS",               /* name */
+        "R_POS_64",            /* name */
         true,                  /* partial_inplace */
         MINUS_ONE,             /* src_mask */
         MINUS_ONE,             /* dst_mask */
@@ -1310,7 +1348,7 @@ reloc_howto_type xcoff64_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_BA",                /* name */
+        "R_BA_26",             /* name */
         true,                  /* partial_inplace */
         0x3fffffc,             /* src_mask */
         0x3fffffc,             /* dst_mask */
@@ -1514,7 +1552,7 @@ reloc_howto_type xcoff64_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_RBR",               /* name */
+        "R_RBR_26",            /* name */
         true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
@@ -1537,32 +1575,47 @@ reloc_howto_type xcoff64_howto_table[] =
 
   HOWTO (R_POS,                        /* type */
         0,                     /* rightshift */
-        4,                     /* size (0 = byte, 1 = short, 2 = long) */
-        64,                    /* bitsize */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
         false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_POS",               /* name */
+        "R_POS_32",            /* name */
         true,                  /* partial_inplace */
-        MINUS_ONE,             /* src_mask */
-        MINUS_ONE,             /* dst_mask */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
   /* 16 bit Non modifiable absolute branch.  */
   HOWTO (R_BA,                 /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
         false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_BA",                /* name */
+        "R_BA_16",             /* name */
         true,                  /* partial_inplace */
         0xfffc,                /* src_mask */
         0xfffc,                /* dst_mask */
         false),                /* pcrel_offset */
+
+  /* Modifiable branch relative.  */
+  HOWTO (R_RBR,                        /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        0,                     /* special_function */
+        "R_RBR_16",            /* name */
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
 };
 
 void
@@ -1570,15 +1623,27 @@ xcoff64_rtype2howto (relent, internal)
      arelent *relent;
      struct internal_reloc *internal;
 {
-  relent->howto = xcoff64_howto_table + internal->r_type;
-
-  /* Check for relocs we don't know of.  */
-  if (internal->r_type
-      >= sizeof (xcoff64_howto_table) / sizeof (xcoff64_howto_table[0]))
-    abort ();
-  if (internal->r_type != relent->howto->type)
+  if (internal->r_type > R_RBRC)
     abort ();
 
+  /* Default howto layout works most of the time */
+  relent->howto = &xcoff64_howto_table[internal->r_type];
+  
+  /* Special case some 16 bit reoloc */
+  if (15 == (internal->r_size & 0x3f))
+    {
+      if (R_BA == internal->r_type) 
+       relent->howto = &xcoff64_howto_table[0x1d];
+      else if (R_RBR == internal->r_type) 
+       relent->howto = &xcoff64_howto_table[0x1e];
+    }
+  /* Special case 32 bit */
+  else if (31 == (internal->r_size & 0x3f))
+    {
+      if (R_POS == internal->r_type) 
+       relent->howto = &xcoff64_howto_table[0x1c];
+    }
+  
   /* The r_size field of an XCOFF reloc encodes the bitsize of the
      relocation, as well as indicating whether it is signed or not.
      Doublecheck that the relocation information gathered from the
@@ -1588,12 +1653,10 @@ xcoff64_rtype2howto (relent, internal)
       && (relent->howto->bitsize
          != ((unsigned int) internal->r_size & 0x3f) + 1))
     abort ();
-#if 0
-  if ((internal->r_size & 0x80) != 0
-      ? (relent->howto->complain_on_overflow != complain_overflow_signed)
-      : (relent->howto->complain_on_overflow != complain_overflow_bitfield))
-    abort ();
-#endif
+
+  /* Put a meaningful value in addend */
+  relent->addend = (internal->r_size & 0x80) ? - internal->r_vaddr 
+    : internal->r_vaddr;
 }
 
 reloc_howto_type *
@@ -1613,9 +1676,9 @@ xcoff64_reloc_type_lookup (abfd, code)
       return &xcoff64_howto_table[3];
     case BFD_RELOC_32:
     case BFD_RELOC_CTOR:
-      return &xcoff64_howto_table[0];
-    case BFD_RELOC_64:
       return &xcoff64_howto_table[0x1c];
+    case BFD_RELOC_64:
+      return &xcoff64_howto_table[0];
     default:
       return NULL;
     }
@@ -2314,7 +2377,7 @@ static const struct xcoff_backend_data_r
     _bfd_xcoff64_swap_aux_out,         /* _bfd_swap_aux_out */
     _bfd_xcoff64_swap_sym_out,         /* _bfd_swap_sym_out */
     _bfd_xcoff64_swap_lineno_out,      /* _bfd_swap_lineno_out */
-    coff_swap_reloc_out,               /* _bfd_swap_reloc_out */
+    xcoff64_swap_reloc_out,            /* _bfd_swap_reloc_out */
     coff_swap_filehdr_out,             /* _bfd_swap_filehdr_out */
     coff_swap_aouthdr_out,             /* _bfd_swap_aouthdr_out */
     coff_swap_scnhdr_out,              /* _bfd_swap_scnhdr_out */
@@ -2334,7 +2397,7 @@ static const struct xcoff_backend_data_r
     coff_swap_filehdr_in,              /* _bfd_coff_swap_filehdr_in */
     coff_swap_aouthdr_in,              /* _bfd_swap_aouthdr_in */
     coff_swap_scnhdr_in,               /* _bfd_swap_scnhdr_in */
-    coff_swap_reloc_in,                        /* _bfd_reloc_in */
+    xcoff64_swap_reloc_in,             /* _bfd_reloc_in */
     xcoff64_bad_format_hook,           /* _bfd_bad_format_hook */
     coff_set_arch_mach_hook,           /* _bfd_set_arch_mach_hook */
     coff_mkobject_hook,                        /* _bfd_mkobject_hook */
@@ -2569,7 +2632,7 @@ static const struct xcoff_backend_data_r
     _bfd_xcoff64_swap_aux_out,         /* _bfd_swap_aux_out */
     _bfd_xcoff64_swap_sym_out,         /* _bfd_swap_sym_out */
     _bfd_xcoff64_swap_lineno_out,      /* _bfd_swap_lineno_out */
-    coff_swap_reloc_out,               /* _bfd_swap_reloc_out */
+    xcoff64_swap_reloc_out,            /* _bfd_swap_reloc_out */
     coff_swap_filehdr_out,             /* _bfd_swap_filehdr_out */
     coff_swap_aouthdr_out,             /* _bfd_swap_aouthdr_out */
     coff_swap_scnhdr_out,              /* _bfd_swap_scnhdr_out */
@@ -2589,7 +2652,7 @@ static const struct xcoff_backend_data_r
     coff_swap_filehdr_in,              /* _bfd_coff_swap_filehdr_in */
     coff_swap_aouthdr_in,              /* _bfd_swap_aouthdr_in */
     coff_swap_scnhdr_in,               /* _bfd_swap_scnhdr_in */
-    coff_swap_reloc_in,                        /* _bfd_reloc_in */
+    xcoff64_swap_reloc_in,             /* _bfd_reloc_in */
     xcoff64_bad_format_hook,           /* _bfd_bad_format_hook */
     coff_set_arch_mach_hook,           /* _bfd_set_arch_mach_hook */
     coff_mkobject_hook,                        /* _bfd_mkobject_hook */
diff -up bfd/coffswap.h.old bfd/coffswap.h
--- bfd/coffswap.h.old 
+++ bfd/coffswap.h 
@@ -244,13 +244,7 @@ coff_swap_reloc_in (abfd, src, dst)
 
   reloc_dst->r_vaddr = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
   reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
-
-#ifdef RS6000COFF_C
-  reloc_dst->r_type = H_GET_8 (abfd, reloc_src->r_type);
-  reloc_dst->r_size = H_GET_8 (abfd, reloc_src->r_size);
-#else
   reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type);
-#endif
 
 #ifdef SWAP_IN_RELOC_OFFSET
   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
@@ -267,13 +261,7 @@ coff_swap_reloc_out (abfd, src, dst)
   struct external_reloc *reloc_dst = (struct external_reloc *) dst;
   PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
   H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
-
-#ifdef RS6000COFF_C
-  H_PUT_8 (abfd, reloc_src->r_type, reloc_dst->r_type);
-  H_PUT_8 (abfd, reloc_src->r_size, reloc_dst->r_size);
-#else
   H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
-#endif
 
 #ifdef SWAP_OUT_RELOC_OFFSET
   SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);

reply via email to

[Prev in Thread] Current Thread [Next in Thread]