"propogate" -> "propagate"
[binutils-gdb.git] / bfd / coff-rs6000.c
index c07981bfee35defe72b668a8baa5812e03939488..ba879d2f43e57345ca62890fea2a37d26667efc3 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for IBM RS/6000 "XCOFF" files.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
    FIXME: Can someone provide a transliteration of this name into ASCII?
    Using the following chars caused a compiler warning on HIUX (so I replaced
    them with octal escapes), and isn't useful without an understanding of what
@@ -31,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "bfd.h"
 #include "sysdep.h"
 #include "libbfd.h"
-#include "obstack.h"
 #include "coff/internal.h"
 #include "coff/rs6000.h"
 #include "libcoff.h"
@@ -40,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 static boolean xcoff_mkobject PARAMS ((bfd *));
 static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean xcoff_is_local_label_name PARAMS ((bfd *, const char *));
 static void xcoff_rtype2howto
   PARAMS ((arelent *, struct internal_reloc *));
 static reloc_howto_type *xcoff_reloc_type_lookup
@@ -94,6 +94,7 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
      bfd *obfd;
 {
   struct xcoff_tdata *ix, *ox;
+  asection *sec;
 
   if (ibfd->xvec != obfd->xvec)
     return true;
@@ -101,14 +102,26 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox = xcoff_data (obfd);
   ox->full_aouthdr = ix->full_aouthdr;
   ox->toc = ix->toc;
-  if (ix->toc_section == NULL)
-    ox->toc_section = NULL;
+  if (ix->sntoc == 0)
+    ox->sntoc = 0;
   else
-    ox->toc_section = ix->toc_section->output_section;
-  if (ix->entry_section == NULL)
-    ox->entry_section = NULL;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
+      if (sec == NULL)
+       ox->sntoc = 0;
+      else
+       ox->sntoc = sec->output_section->target_index;
+    }
+  if (ix->snentry == 0)
+    ox->snentry = 0;
   else
-    ox->entry_section = ix->entry_section->output_section;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->snentry);
+      if (sec == NULL)
+       ox->snentry = 0;
+      else
+       ox->snentry = sec->output_section->target_index;
+    }
   ox->text_align_power = ix->text_align_power;
   ox->data_align_power = ix->data_align_power;
   ox->modtype = ix->modtype;
@@ -117,6 +130,19 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox->maxstack = ix->maxstack;
   return true;
 }
+
+/* I don't think XCOFF really has a notion of local labels based on
+   name.  This will mean that ld -X doesn't actually strip anything.
+   The AIX native linker does not have a -X option, and it ignores the
+   -x option.  */
+
+static boolean
+xcoff_is_local_label_name (abfd, name)
+     bfd *abfd;
+     const char *name;
+{
+  return false;
+}
 \f
 /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
    bitsize and whether they are signed or not, along with a
@@ -528,6 +554,7 @@ xcoff_reloc_type_lookup (abfd, code)
 
 #define coff_mkobject xcoff_mkobject
 #define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data
+#define coff_bfd_is_local_label_name xcoff_is_local_label_name
 #define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup
 #define coff_relocate_section _bfd_ppc_xcoff_relocate_section
 
@@ -1384,7 +1411,7 @@ const bfd_target
      BFD_JUMP_TABLE_RELOCS (coff),
      BFD_JUMP_TABLE_WRITE (coff),
      BFD_JUMP_TABLE_LINK (_bfd_xcoff),
-     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+     BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
 
   COFF_SWAP_TABLE,
 };