diff options
Diffstat (limited to 'bfd/coff-rs6000.c')
-rw-r--r-- | bfd/coff-rs6000.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 8389060..ba879d2 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -1,5 +1,5 @@ /* BFD back-end for IBM RS/6000 "XCOFF" files. - Copyright 1990, 91, 92, 93, 94, 95, 1996 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; +} /* 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, }; |