/* 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, 97, 98, 1999
+ 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
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
-#include "obstack.h"
#include "coff/internal.h"
#include "coff/rs6000.h"
#include "libcoff.h"
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
static boolean xcoff_write_armap
PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
static boolean xcoff_write_archive_contents PARAMS ((bfd *));
+static int _bfd_xcoff_sizeof_headers PARAMS ((bfd *, boolean));
\f
/* We use our own tdata type. Its first field is the COFF tdata type,
so the COFF routines are compatible. */
bfd *obfd;
{
struct xcoff_tdata *ix, *ox;
+ asection *sec;
if (ibfd->xvec != obfd->xvec)
return true;
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;
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 ATTRIBUTE_UNUSED;
+ const char *name ATTRIBUTE_UNUSED;
+{
+ return false;
+}
\f
/* The XCOFF reloc table. Actually, XCOFF relocations specify the
bitsize and whether they are signed or not, along with a
0xffff, /* dst_mask */
false), /* pcrel_offset */
- { 7 },
+ EMPTY_HOWTO (7),
/* Non modifiable absolute branch. */
HOWTO (8, /* type */
0x3fffffc, /* dst_mask */
false), /* pcrel_offset */
- { 9 },
+ EMPTY_HOWTO (9),
/* Non modifiable relative branch. */
HOWTO (0xa, /* type */
0x3fffffc, /* dst_mask */
false), /* pcrel_offset */
- { 0xb },
+ EMPTY_HOWTO (0xb),
/* Indirect load. */
HOWTO (0xc, /* type */
0xffff, /* dst_mask */
false), /* pcrel_offset */
- { 0xe },
+ EMPTY_HOWTO (0xe),
/* Non-relocating reference. */
HOWTO (0xf, /* type */
0, /* dst_mask */
false), /* pcrel_offset */
- { 0x10 },
- { 0x11 },
+ EMPTY_HOWTO (0x10),
+ EMPTY_HOWTO (0x11),
/* TOC relative indirect load. */
HOWTO (0x12, /* type */
static reloc_howto_type *
xcoff_reloc_type_lookup (abfd, code)
- bfd *abfd;
+ bfd *abfd ATTRIBUTE_UNUSED;
bfd_reloc_code_real_type code;
{
switch (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
return NULL;
namlen = strtol (hdr.namlen, (char **) NULL, 10);
- hdrp = bfd_alloc (abfd, SIZEOF_AR_HDR + namlen + 1);
+ hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, SIZEOF_AR_HDR + namlen + 1);
if (hdrp == NULL)
return NULL;
memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
static boolean
xcoff_write_armap (abfd, elength, map, orl_count, stridx)
bfd *abfd;
- unsigned int elength;
+ unsigned int elength ATTRIBUTE_UNUSED;
struct orl *map;
unsigned int orl_count;
int stridx;
if (sub->arelt_data == NULL)
{
- sub->arelt_data = ((struct areltdata *)
- bfd_alloc (sub, sizeof (struct areltdata)));
+ sub->arelt_data = bfd_alloc (sub, sizeof (struct areltdata));
if (sub->arelt_data == NULL)
return false;
}
static int
_bfd_xcoff_sizeof_headers (abfd, reloc)
bfd *abfd;
- boolean reloc;
+ boolean reloc ATTRIBUTE_UNUSED;
{
int size;
#define _bfd_xcoff_bfd_get_relocated_section_contents \
coff_bfd_get_relocated_section_contents
#define _bfd_xcoff_bfd_relax_section coff_bfd_relax_section
+#define _bfd_xcoff_bfd_gc_sections coff_bfd_gc_sections
#define _bfd_xcoff_bfd_link_split_section coff_bfd_link_split_section
/* The transfer vector that leads the outside world to all of the above. */
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,
+ NULL,
+
+ COFF_SWAP_TABLE
};