Back to index

cell-binutils  2.17cvs20070401
Defines | Functions | Variables
coff-rs6000.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "bfdlink.h"
#include "libbfd.h"
#include "coff/internal.h"
#include "coff/xcoff.h"
#include "coff/rs6000.h"
#include "libcoff.h"
#include "libxcoff.h"
#include "coffcode.h"

Go to the source code of this file.

Defines

#define RS6000COFF_C   1
#define SELECT_RELOC(internal, howto)
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER   (3)
#define COFF_LONG_FILENAMES
#define NO_COFF_SYMBOLS
#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
#define coff_bfd_reloc_type_lookup   _bfd_xcoff_reloc_type_lookup
#define coff_bfd_reloc_name_lookup   _bfd_xcoff_reloc_name_lookup
#define CORE_FILE_P   _bfd_dummy_target
#define coff_core_file_failing_command   _bfd_nocore_core_file_failing_command
#define coff_core_file_failing_signal   _bfd_nocore_core_file_failing_signal
#define coff_core_file_matches_executable_p   _bfd_nocore_core_file_matches_executable_p
#define coff_SWAP_sym_in   _bfd_xcoff_swap_sym_in
#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
#define FMT20   "%-20lld"
#define FMT12   "%-12d"
#define FMT12_OCTAL   "%-12o"
#define FMT4   "%-4d"
#define PRINT20(d, v)
#define PRINT12(d, v)
#define PRINT12_OCTAL(d, v)
#define PRINT4(d, v)
#define READ20(d, v)

Functions

bfd_boolean _bfd_xcoff_mkobject PARAMS ((bfd *))
bfd_boolean
_bfd_xcoff_copy_private_bfd_data 
PARAMS ((bfd *, bfd *))
bfd_boolean
_bfd_xcoff_is_local_label_name 
PARAMS ((bfd *, const char *))
reloc_howto_type
*_bfd_xcoff_reloc_type_lookup 
PARAMS ((bfd *, bfd_reloc_code_real_type))
int _bfd_xcoff_stat_arch_elt PARAMS ((bfd *, struct stat *))
bfd_boolean _bfd_xcoff_write_armap PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))
int _bfd_xcoff_sizeof_headers PARAMS ((bfd *, struct bfd_link_info *))
void _bfd_xcoff_swap_sym_in PARAMS ((bfd *, PTR, PTR))
void _bfd_xcoff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, PTR))
void xcoff_rtype2howto PARAMS ((arelent *, struct internal_reloc *))
static void xcoff_swap_ldhdr_in PARAMS ((bfd *, const PTR, struct internal_ldhdr *))
static void xcoff_swap_ldhdr_out PARAMS ((bfd *, const struct internal_ldhdr *, PTR))
static void xcoff_swap_ldsym_in PARAMS ((bfd *, const PTR, struct internal_ldsym *))
static void xcoff_swap_ldsym_out PARAMS ((bfd *, const struct internal_ldsym *, PTR))
static void xcoff_swap_ldrel_in PARAMS ((bfd *, const PTR, struct internal_ldrel *))
static void xcoff_swap_ldrel_out PARAMS ((bfd *, const struct internal_ldrel *, PTR))
static bfd_boolean
xcoff_ppc_relocate_section 
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, struct internal_reloc *, struct internal_syment *, asection **))
static bfd_boolean
_bfd_xcoff_put_ldsymbol_name 
PARAMS ((bfd *, struct xcoff_loader_info *, struct internal_ldsym *, const char *))
static asection
*xcoff_create_csect_from_smclas 
PARAMS ((bfd *, union internal_auxent *, const char *))
static bfd_boolean
xcoff_is_lineno_count_overflow 
PARAMS ((bfd *, bfd_vma))
static bfd_vma
xcoff_loader_symbol_offset 
PARAMS ((bfd *, struct internal_ldhdr *))
static bfd_boolean
xcoff_generate_rtinit 
PARAMS ((bfd *, const char *, const char *, bfd_boolean))
static bfd_boolean do_pad PARAMS ((bfd *, unsigned int))
static bfd_boolean
do_shared_object_padding 
PARAMS ((bfd *, bfd *, file_ptr *, int))
static bfd_boolean
xcoff_reloc_type_br 
PARAMS ((XCOFF_RELOC_FUNCTION_ARGS))
static bfd_boolean
xcoff_complain_overflow_dont_func 
PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS))
bfd_boolean _bfd_xcoff_mkobject (bfd *abfd)
bfd_boolean _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
bfd_boolean _bfd_xcoff_is_local_label_name (abfd, name)
void _bfd_xcoff_swap_sym_in (bfd *abfd, PTR ext1, PTR in1)
unsigned int _bfd_xcoff_swap_sym_out (bfd *abfd, PTR inp, PTR extp)
void _bfd_xcoff_swap_aux_in (bfd *abfd, PTR ext1, int type, int class, int indx, int numaux, PTR in1)
unsigned int _bfd_xcoff_swap_aux_out (bfd *abfd, PTR inp, int type, int class, indx, numaux, PTR extp)
void xcoff_rtype2howto (arelent *relent, struct internal_reloc *internal)
reloc_howto_type * _bfd_xcoff_reloc_type_lookup (abfd, bfd_reloc_code_real_type code)
static reloc_howto_type * _bfd_xcoff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
bfd_boolean bfd_xcoff_ar_archive_set_magic (abfd, magic)
bfd_boolean _bfd_xcoff_slurp_armap (bfd *abfd)
const bfd_target_bfd_xcoff_archive_p (bfd *abfd)
PTR _bfd_xcoff_read_ar_hdr (bfd *abfd)
bfd_bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
int _bfd_xcoff_stat_arch_elt (bfd *abfd, struct stat *s)
static const char * normalize_filename (bfd *abfd)
static bfd_boolean xcoff_write_armap_old (bfd *abfd, elength, struct orl *map, unsigned int orl_count, int stridx)
static bfd_boolean do_pad (bfd *abfd, unsigned int number)
static bfd_boolean do_copy (bfd *out_bfd, bfd *in_bfd)
static bfd_boolean do_shared_object_padding (bfd *out_bfd, bfd *in_bfd, file_ptr *offset, int ar_header_size)
static bfd_boolean xcoff_write_armap_big (bfd *abfd, elength, struct orl *map, unsigned int orl_count, int stridx)
bfd_boolean _bfd_xcoff_write_armap (bfd *abfd, elength, struct orl *map, unsigned int orl_count, int stridx)
static bfd_boolean xcoff_write_archive_contents_old (bfd *abfd)
static bfd_boolean xcoff_write_archive_contents_big (bfd *abfd)
bfd_boolean _bfd_xcoff_write_archive_contents (bfd *abfd)
int _bfd_xcoff_sizeof_headers (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
static void xcoff_swap_ldhdr_in (bfd *abfd, const PTR s, struct internal_ldhdr *dst)
static void xcoff_swap_ldhdr_out (bfd *abfd, const struct internal_ldhdr *src, PTR d)
static void xcoff_swap_ldsym_in (bfd *abfd, const PTR s, struct internal_ldsym *dst)
static void xcoff_swap_ldsym_out (bfd *abfd, const struct internal_ldsym *src, PTR d)
static void xcoff_swap_reloc_in (bfd *abfd, PTR s, PTR d)
static unsigned int xcoff_swap_reloc_out (bfd *abfd, PTR s, PTR d)
static void xcoff_swap_ldrel_in (bfd *abfd, const PTR s, struct internal_ldrel *dst)
static void xcoff_swap_ldrel_out (bfd *abfd, const struct internal_ldrel *src, PTR d)
bfd_boolean xcoff_reloc_type_noop (input_bfd, input_section, output_bfd, rel, sym, howto, val, addend, relocation, contents)
bfd_boolean xcoff_reloc_type_fail (bfd *input_bfd, input_section, output_bfd, struct internal_reloc *rel, sym, howto, val, addend, relocation, contents)
bfd_boolean xcoff_reloc_type_pos (input_bfd, input_section, output_bfd, rel, sym, howto, bfd_vma val, bfd_vma addend, bfd_vma *relocation, contents)
bfd_boolean xcoff_reloc_type_neg (input_bfd, input_section, output_bfd, rel, sym, howto, bfd_vma val, bfd_vma addend, bfd_vma *relocation, contents)
bfd_boolean xcoff_reloc_type_rel (input_bfd, asection *input_section, output_bfd, rel, sym, struct reloc_howto_struct *howto, bfd_vma val, bfd_vma addend, bfd_vma *relocation, contents)
bfd_boolean xcoff_reloc_type_toc (bfd *input_bfd, input_section, bfd *output_bfd, struct internal_reloc *rel, struct internal_syment *sym, howto, bfd_vma val, addend, bfd_vma *relocation, contents)
bfd_boolean xcoff_reloc_type_ba (input_bfd, input_section, output_bfd, rel, sym, struct reloc_howto_struct *howto, bfd_vma val, bfd_vma addend, bfd_vma *relocation, contents)
static bfd_boolean xcoff_reloc_type_br (bfd *input_bfd, asection *input_section, output_bfd, struct internal_reloc *rel, sym, struct reloc_howto_struct *howto, bfd_vma val, bfd_vma addend, bfd_vma *relocation, bfd_byte *contents)
bfd_boolean xcoff_reloc_type_crel (input_bfd, asection *input_section, output_bfd, rel, sym, struct reloc_howto_struct *howto, val, bfd_vma addend, bfd_vma *relocation, contents)
static bfd_boolean xcoff_complain_overflow_dont_func (input_bfd, val, relocation, howto)
static bfd_boolean xcoff_complain_overflow_bitfield_func (bfd *input_bfd, bfd_vma val, bfd_vma relocation, struct reloc_howto_struct *howto)
static bfd_boolean xcoff_complain_overflow_signed_func (bfd *input_bfd, bfd_vma val, bfd_vma relocation, struct reloc_howto_struct *howto)
static bfd_boolean xcoff_complain_overflow_unsigned_func (bfd *input_bfd, bfd_vma val, bfd_vma relocation, struct reloc_howto_struct *howto)
bfd_boolean xcoff_ppc_relocate_section (bfd *output_bfd, struct bfd_link_info *info, bfd *input_bfd, asection *input_section, bfd_byte *contents, struct internal_reloc *relocs, struct internal_syment *syms, asection **sections)
static bfd_boolean _bfd_xcoff_put_ldsymbol_name (abfd, struct xcoff_loader_info *ldinfo, struct internal_ldsym *ldsym, const char *name)
static bfd_boolean _bfd_xcoff_put_symbol_name (bfd *abfd, struct bfd_strtab_hash *strtab, struct internal_syment *sym, const char *name)
static asectionxcoff_create_csect_from_smclas (bfd *abfd, union internal_auxent *aux, const char *symbol_name)
static bfd_boolean xcoff_is_lineno_count_overflow (abfd, bfd_vma value)
static bfd_boolean xcoff_is_reloc_count_overflow (abfd, bfd_vma value)
static bfd_vma xcoff_loader_symbol_offset (bfd *abfd, ldhdr)
static bfd_vma xcoff_loader_reloc_offset (bfd *abfd, struct internal_ldhdr *ldhdr)
static bfd_boolean xcoff_generate_rtinit (bfd *abfd, const char *init, const char *fini, bfd_boolean rtld)

Variables

reloc_howto_type xcoff_howto_table []
static char buff20 [XCOFFARMAGBIG_ELEMENT_SIZE+1]
static reloc_howto_type xcoff_dynamic_reloc
static unsigned long xcoff_glink_code [9]
static struct xcoff_backend_data_rec
const bfd_target rs6000coff_vec
const bfd_target pmac_xcoff_vec

Define Documentation

Definition at line 98 of file coff-rs6000.c.

Definition at line 99 of file coff-rs6000.c.

Definition at line 101 of file coff-rs6000.c.

Definition at line 100 of file coff-rs6000.c.

Definition at line 120 of file coff-rs6000.c.

Definition at line 122 of file coff-rs6000.c.

Definition at line 124 of file coff-rs6000.c.

Definition at line 93 of file coff-rs6000.c.

Definition at line 94 of file coff-rs6000.c.

Definition at line 97 of file coff-rs6000.c.

Definition at line 129 of file coff-rs6000.c.

Definition at line 130 of file coff-rs6000.c.

Definition at line 131 of file coff-rs6000.c.

Definition at line 132 of file coff-rs6000.c.

Definition at line 127 of file coff-rs6000.c.

Definition at line 128 of file coff-rs6000.c.

Definition at line 119 of file coff-rs6000.c.

#define FMT12   "%-12d"

Definition at line 1685 of file coff-rs6000.c.

#define FMT12_OCTAL   "%-12o"

Definition at line 1686 of file coff-rs6000.c.

#define FMT20   "%-20lld"

Definition at line 1684 of file coff-rs6000.c.

#define FMT4   "%-4d"

Definition at line 1687 of file coff-rs6000.c.

#define NO_COFF_RELOCS

Definition at line 133 of file coff-rs6000.c.

#define NO_COFF_SYMBOLS

Definition at line 95 of file coff-rs6000.c.

#define PRINT12 (   d,
  v 
)
Value:
sprintf (buff20, FMT12, (int)(v)), \
  memcpy ((void *) (d), buff20, 12)

Definition at line 1692 of file coff-rs6000.c.

#define PRINT12_OCTAL (   d,
  v 
)
Value:
sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
  memcpy ((void *) (d), buff20, 12)

Definition at line 1696 of file coff-rs6000.c.

#define PRINT20 (   d,
  v 
)
Value:
sprintf (buff20, FMT20, (long long)(v)), \
  memcpy ((void *) (d), buff20, 20)

Definition at line 1688 of file coff-rs6000.c.

#define PRINT4 (   d,
  v 
)
Value:
sprintf (buff20, FMT4, (int)(v)), \
  memcpy ((void *) (d), buff20, 4)

Definition at line 1700 of file coff-rs6000.c.

#define READ20 (   d,
  v 
)
Value:
buff20[20] = 0, \
  memcpy (buff20, (d), 20), \
  (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)

Definition at line 1704 of file coff-rs6000.c.

#define RS6000COFF_C   1

Definition at line 81 of file coff-rs6000.c.

#define RTYPE2HOWTO (   cache_ptr,
  dst 
)    xcoff_rtype2howto (cache_ptr, dst)

Definition at line 96 of file coff-rs6000.c.

#define SELECT_RELOC (   internal,
  howto 
)
Value:
{                                                              \
    internal.r_type = howto->type;                             \
    internal.r_size =                                                 \
      ((howto->complain_on_overflow == complain_overflow_signed              \
       ? 0x80                                                  \
       : 0)                                                    \
       | (howto->bitsize - 1));                                       \
  }

Definition at line 83 of file coff-rs6000.c.


Function Documentation

Definition at line 1285 of file coff-rs6000.c.

{
  struct artdata *tdata_hold;
  char magic[SXCOFFARMAG];
  bfd_size_type amt = SXCOFFARMAG;

  if (bfd_bread ((PTR) magic, amt, abfd) != amt)
    {
      if (bfd_get_error () != bfd_error_system_call)
       bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  if (strncmp (magic, XCOFFARMAG, SXCOFFARMAG) != 0
      && strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  tdata_hold = bfd_ardata (abfd);

  amt = sizeof (struct artdata);
  bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
  if (bfd_ardata (abfd) == (struct artdata *) NULL)
    goto error_ret_restore;

  /* Cleared by bfd_zalloc above.
     bfd_ardata (abfd)->cache = NULL;
     bfd_ardata (abfd)->archive_head = NULL;
     bfd_ardata (abfd)->symdefs = NULL;
     bfd_ardata (abfd)->extended_names = NULL;
     bfd_ardata (abfd)->extended_names_size = 0;  */

  /* Now handle the two formats.  */
  if (magic[1] != 'b')
    {
      /* This is the old format.  */
      struct xcoff_ar_file_hdr hdr;

      /* Copy over the magic string.  */
      memcpy (hdr.magic, magic, SXCOFFARMAG);

      /* Now read the rest of the file header.  */
      amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
      if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
       {
         if (bfd_get_error () != bfd_error_system_call)
           bfd_set_error (bfd_error_wrong_format);
         goto error_ret;
       }

      bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff,
                                                (char **) NULL, 10);

      amt = SIZEOF_AR_FILE_HDR;
      bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
      if (bfd_ardata (abfd)->tdata == NULL)
       goto error_ret;

      memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
    }
  else
    {
      /* This is the new format.  */
      struct xcoff_ar_file_hdr_big hdr;

      /* Copy over the magic string.  */
      memcpy (hdr.magic, magic, SXCOFFARMAG);

      /* Now read the rest of the file header.  */
      amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
      if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
       {
         if (bfd_get_error () != bfd_error_system_call)
           bfd_set_error (bfd_error_wrong_format);
         goto error_ret;
       }

      bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
                                                     (const char **) 0,
                                                     10);

      amt = SIZEOF_AR_FILE_HDR_BIG;
      bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
      if (bfd_ardata (abfd)->tdata == NULL)
       goto error_ret;

      memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
    }

  if (! _bfd_xcoff_slurp_armap (abfd))
    {
    error_ret:
      bfd_release (abfd, bfd_ardata (abfd));
    error_ret_restore:
      bfd_ardata (abfd) = tdata_hold;
      return NULL;
    }

  return abfd->xvec;
}

Here is the call graph for this function:

Definition at line 278 of file coff-rs6000.c.

{
  struct xcoff_tdata *ix, *ox;
  asection *sec;

  if (ibfd->xvec != obfd->xvec)
    return TRUE;
  ix = xcoff_data (ibfd);
  ox = xcoff_data (obfd);
  ox->full_aouthdr = ix->full_aouthdr;
  ox->toc = ix->toc;
  if (ix->sntoc == 0)
    ox->sntoc = 0;
  else
    {
      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
    {
      sec = coff_section_from_bfd_index (ibfd, ix->snentry);
      if (sec == NULL)
       ox->snentry = 0;
      else
       ox->snentry = sec->output_section->target_index;
    }
  bfd_xcoff_text_align_power (obfd) = bfd_xcoff_text_align_power (ibfd);
  bfd_xcoff_data_align_power (obfd) = bfd_xcoff_data_align_power (ibfd);
  ox->modtype = ix->modtype;
  ox->cputype = ix->cputype;
  ox->maxdata = ix->maxdata;
  ox->maxstack = ix->maxstack;
  return TRUE;
}

Here is the call graph for this function:

Definition at line 326 of file coff-rs6000.c.

{
  return FALSE;
}

Definition at line 245 of file coff-rs6000.c.

{
  coff_data_type *coff;
  bfd_size_type amt = sizeof (struct xcoff_tdata);

  abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
  if (abfd->tdata.xcoff_obj_data == NULL)
    return FALSE;
  coff = coff_data (abfd);
  coff->symbols = (coff_symbol_type *) NULL;
  coff->conversion_table = (unsigned int *) NULL;
  coff->raw_syments = (struct coff_ptr_struct *) NULL;
  coff->relocbase = 0;

  xcoff_data (abfd)->modtype = ('1' << 8) | 'L';

  /* We set cputype to -1 to indicate that it has not been
     initialized.  */
  xcoff_data (abfd)->cputype = -1;

  xcoff_data (abfd)->csects = NULL;
  xcoff_data (abfd)->debug_indices = NULL;

  /* text section alignment is different than the default */
  bfd_xcoff_text_align_power (abfd) = 2;

  return TRUE;
}

Here is the call graph for this function:

bfd* _bfd_xcoff_openr_next_archived_file ( bfd archive,
bfd last_file 
)

Definition at line 1481 of file coff-rs6000.c.

{
  file_ptr filestart;

  if (xcoff_ardata (archive) == NULL)
    {
      bfd_set_error (bfd_error_invalid_operation);
      return NULL;
    }

  if (! xcoff_big_format_p (archive))
    {
      if (last_file == NULL)
       filestart = bfd_ardata (archive)->first_file_filepos;
      else
       filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL,
                         10);

      if (filestart == 0
         || filestart == strtol (xcoff_ardata (archive)->memoff,
                              (char **) NULL, 10)
         || filestart == strtol (xcoff_ardata (archive)->symoff,
                              (char **) NULL, 10))
       {
         bfd_set_error (bfd_error_no_more_archived_files);
         return NULL;
       }
    }
  else
    {
      if (last_file == NULL)
       filestart = bfd_ardata (archive)->first_file_filepos;
      else
       /* XXX These actually have to be a calls to strtoll (at least
          on 32-bit machines) since the fields's width is 20 and
          there numbers with more than 32 bits can be represented.  */
       filestart = strtol (arch_xhdr_big (last_file)->nextoff, (char **) NULL,
                         10);

      /* XXX These actually have to be calls to strtoll (at least on 32-bit
        machines) since the fields's width is 20 and there numbers with more
        than 32 bits can be represented.  */
      if (filestart == 0
         || filestart == strtol (xcoff_ardata_big (archive)->memoff,
                              (char **) NULL, 10)
         || filestart == strtol (xcoff_ardata_big (archive)->symoff,
                              (char **) NULL, 10))
       {
         bfd_set_error (bfd_error_no_more_archived_files);
         return NULL;
       }
    }

  return _bfd_get_elt_at_filepos (archive, filestart);
}

Here is the call graph for this function:

static bfd_boolean _bfd_xcoff_put_ldsymbol_name ( abfd  ,
struct xcoff_loader_info ldinfo,
struct internal_ldsym ldsym,
const char *  name 
) [static]

Definition at line 3528 of file coff-rs6000.c.

{
  size_t len;
  len = strlen (name);

  if (len <= SYMNMLEN)
    strncpy (ldsym->_l._l_name, name, SYMNMLEN);
  else
    {
      if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
       {
         bfd_size_type newalc;
         char *newstrings;

         newalc = ldinfo->string_alc * 2;
         if (newalc == 0)
           newalc = 32;
         while (ldinfo->string_size + len + 3 > newalc)
           newalc *= 2;

         newstrings = bfd_realloc (ldinfo->strings, newalc);
         if (newstrings == NULL)
           {
             ldinfo->failed = TRUE;
             return FALSE;
           }
         ldinfo->string_alc = newalc;
         ldinfo->strings = newstrings;
       }

      bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
                ldinfo->strings + ldinfo->string_size);
      strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
      ldsym->_l._l_l._l_zeroes = 0;
      ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
      ldinfo->string_size += len + 3;
    }

  return TRUE;
}

Here is the call graph for this function:

static bfd_boolean _bfd_xcoff_put_symbol_name ( bfd abfd,
struct bfd_strtab_hash strtab,
struct internal_syment sym,
const char *  name 
) [static]

Definition at line 3574 of file coff-rs6000.c.

{
  if (strlen (name) <= SYMNMLEN)
    {
      strncpy (sym->_n._n_name, name, SYMNMLEN);
    }
  else
    {
      bfd_boolean hash;
      bfd_size_type indx;

      hash = TRUE;
      if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
       hash = FALSE;
      indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
      if (indx == (bfd_size_type) -1)
       return FALSE;
      sym->_n._n_n._n_zeroes = 0;
      sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
    }
  return TRUE;
}

Here is the call graph for this function:

Definition at line 1392 of file coff-rs6000.c.

{
  bfd_size_type namlen;
  struct areltdata *ret;
  bfd_size_type amt = sizeof (struct areltdata);

  ret = (struct areltdata *) bfd_alloc (abfd, amt);
  if (ret == NULL)
    return NULL;

  if (! xcoff_big_format_p (abfd))
    {
      struct xcoff_ar_hdr hdr;
      struct xcoff_ar_hdr *hdrp;

      if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
         != SIZEOF_AR_HDR)
       {
         free (ret);
         return NULL;
       }

      namlen = strtol (hdr.namlen, (char **) NULL, 10);
      amt = SIZEOF_AR_HDR + namlen + 1;
      hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, amt);
      if (hdrp == NULL)
       {
         free (ret);
         return NULL;
       }
      memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
      if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
       {
         free (ret);
         return NULL;
       }
      ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';

      ret->arch_header = (char *) hdrp;
      ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
      ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
    }
  else
    {
      struct xcoff_ar_hdr_big hdr;
      struct xcoff_ar_hdr_big *hdrp;

      if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
         != SIZEOF_AR_HDR_BIG)
       {
         free (ret);
         return NULL;
       }

      namlen = strtol (hdr.namlen, (char **) NULL, 10);
      amt = SIZEOF_AR_HDR_BIG + namlen + 1;
      hdrp = (struct xcoff_ar_hdr_big *) bfd_alloc (abfd, amt);
      if (hdrp == NULL)
       {
         free (ret);
         return NULL;
       }
      memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
      if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
       {
         free (ret);
         return NULL;
       }
      ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';

      ret->arch_header = (char *) hdrp;
      /* XXX This actually has to be a call to strtoll (at least on 32-bit
        machines) since the field width is 20 and there numbers with more
        than 32 bits can be represented.  */
      ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
      ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
    }

  /* Skip over the XCOFFARFMAG at the end of the file name.  */
  if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
    return NULL;

  return (PTR) ret;
}

Here is the call graph for this function:

static reloc_howto_type* _bfd_xcoff_reloc_name_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
const char *  r_name 
) [static]

Definition at line 1056 of file coff-rs6000.c.

{
  unsigned int i;

  for (i = 0;
       i < sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]);
       i++)
    if (xcoff_howto_table[i].name != NULL
       && strcasecmp (xcoff_howto_table[i].name, r_name) == 0)
      return &xcoff_howto_table[i];

  return NULL;
}

Here is the call graph for this function:

reloc_howto_type* _bfd_xcoff_reloc_type_lookup ( abfd  ,
bfd_reloc_code_real_type  code 
)

Definition at line 1033 of file coff-rs6000.c.

{
  switch (code)
    {
    case BFD_RELOC_PPC_B26:
      return &xcoff_howto_table[0xa];
    case BFD_RELOC_PPC_BA16:
      return &xcoff_howto_table[0x1c];
    case BFD_RELOC_PPC_BA26:
      return &xcoff_howto_table[8];
    case BFD_RELOC_PPC_TOC16:
      return &xcoff_howto_table[3];
    case BFD_RELOC_32:
    case BFD_RELOC_CTOR:
      return &xcoff_howto_table[0];
    default:
      return NULL;
    }
}
int _bfd_xcoff_sizeof_headers ( bfd abfd,
struct bfd_link_info *info  ATTRIBUTE_UNUSED 
)

Definition at line 2592 of file coff-rs6000.c.

{
  int size;

  size = FILHSZ;
  if (xcoff_data (abfd)->full_aouthdr)
    size += AOUTSZ;
  else
    size += SMALL_AOUTSZ;
  size += abfd->section_count * SCNHSZ;
  return size;
}

Definition at line 1131 of file coff-rs6000.c.

{
  file_ptr off;
  size_t namlen;
  bfd_size_type sz;
  bfd_byte *contents, *cend;
  bfd_vma c, i;
  carsym *arsym;
  bfd_byte *p;

  if (xcoff_ardata (abfd) == NULL)
    {
      bfd_has_map (abfd) = FALSE;
      return TRUE;
    }

  if (! xcoff_big_format_p (abfd))
    {
      /* This is for the old format.  */
      struct xcoff_ar_hdr hdr;

      off = strtol (xcoff_ardata (abfd)->symoff, (char **) NULL, 10);
      if (off == 0)
       {
         bfd_has_map (abfd) = FALSE;
         return TRUE;
       }

      if (bfd_seek (abfd, off, SEEK_SET) != 0)
       return FALSE;

      /* The symbol table starts with a normal archive header.  */
      if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
         != SIZEOF_AR_HDR)
       return FALSE;

      /* Skip the name (normally empty).  */
      namlen = strtol (hdr.namlen, (char **) NULL, 10);
      off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
      if (bfd_seek (abfd, off, SEEK_CUR) != 0)
       return FALSE;

      sz = strtol (hdr.size, (char **) NULL, 10);

      /* Read in the entire symbol table.  */
      contents = (bfd_byte *) bfd_alloc (abfd, sz);
      if (contents == NULL)
       return FALSE;
      if (bfd_bread ((PTR) contents, sz, abfd) != sz)
       return FALSE;

      /* The symbol table starts with a four byte count.  */
      c = H_GET_32 (abfd, contents);

      if (c * 4 >= sz)
       {
         bfd_set_error (bfd_error_bad_value);
         return FALSE;
       }

      bfd_ardata (abfd)->symdefs =
       ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
      if (bfd_ardata (abfd)->symdefs == NULL)
       return FALSE;

      /* After the count comes a list of four byte file offsets.  */
      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
          i < c;
          ++i, ++arsym, p += 4)
       arsym->file_offset = H_GET_32 (abfd, p);
    }
  else
    {
      /* This is for the new format.  */
      struct xcoff_ar_hdr_big hdr;

      off = strtol (xcoff_ardata_big (abfd)->symoff, (char **) NULL, 10);
      if (off == 0)
       {
         bfd_has_map (abfd) = FALSE;
         return TRUE;
       }

      if (bfd_seek (abfd, off, SEEK_SET) != 0)
       return FALSE;

      /* The symbol table starts with a normal archive header.  */
      if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
         != SIZEOF_AR_HDR_BIG)
       return FALSE;

      /* Skip the name (normally empty).  */
      namlen = strtol (hdr.namlen, (char **) NULL, 10);
      off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
      if (bfd_seek (abfd, off, SEEK_CUR) != 0)
       return FALSE;

      /* XXX This actually has to be a call to strtoll (at least on 32-bit
        machines) since the field width is 20 and there numbers with more
        than 32 bits can be represented.  */
      sz = strtol (hdr.size, (char **) NULL, 10);

      /* Read in the entire symbol table.  */
      contents = (bfd_byte *) bfd_alloc (abfd, sz);
      if (contents == NULL)
       return FALSE;
      if (bfd_bread ((PTR) contents, sz, abfd) != sz)
       return FALSE;

      /* The symbol table starts with an eight byte count.  */
      c = H_GET_64 (abfd, contents);

      if (c * 8 >= sz)
       {
         bfd_set_error (bfd_error_bad_value);
         return FALSE;
       }

      bfd_ardata (abfd)->symdefs =
       ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
      if (bfd_ardata (abfd)->symdefs == NULL)
       return FALSE;

      /* After the count comes a list of eight byte file offsets.  */
      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
          i < c;
          ++i, ++arsym, p += 8)
       arsym->file_offset = H_GET_64 (abfd, p);
    }

  /* After the file offsets come null terminated symbol names.  */
  cend = contents + sz;
  for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
       i < c;
       ++i, ++arsym, p += strlen ((char *) p) + 1)
    {
      if (p >= cend)
       {
         bfd_set_error (bfd_error_bad_value);
         return FALSE;
       }
      arsym->name = (char *) p;
    }

  bfd_ardata (abfd)->symdef_count = c;
  bfd_has_map (abfd) = TRUE;

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int _bfd_xcoff_stat_arch_elt ( bfd abfd,
struct stat s 
)

Definition at line 1542 of file coff-rs6000.c.

{
  if (abfd->arelt_data == NULL)
    {
      bfd_set_error (bfd_error_invalid_operation);
      return -1;
    }

  if (! xcoff_big_format_p (abfd->my_archive))
    {
      struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);

      s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
      s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
      s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
      s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
      s->st_size = arch_eltdata (abfd)->parsed_size;
    }
  else
    {
      struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);

      s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
      s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
      s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
      s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
      s->st_size = arch_eltdata (abfd)->parsed_size;
    }

  return 0;
}

Here is the call graph for this function:

void _bfd_xcoff_swap_aux_in ( bfd abfd,
PTR  ext1,
int  type,
int  class,
int  indx,
int  numaux,
PTR  in1 
)

Definition at line 387 of file coff-rs6000.c.

{
  AUXENT * ext = (AUXENT *)ext1;
  union internal_auxent *in = (union internal_auxent *)in1;

  switch (class)
    {
    case C_FILE:
      if (ext->x_file.x_fname[0] == 0)
       {
         in->x_file.x_n.x_zeroes = 0;
         in->x_file.x_n.x_offset =
           H_GET_32 (abfd, ext->x_file.x_n.x_offset);
       }
      else
       {
         if (numaux > 1)
           {
             if (indx == 0)
              memcpy (in->x_file.x_fname, ext->x_file.x_fname,
                     numaux * sizeof (AUXENT));
           }
         else
           {
             memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
           }
       }
      goto end;

      /* RS/6000 "csect" auxents */
    case C_EXT:
    case C_HIDEXT:
      if (indx + 1 == numaux)
       {
         in->x_csect.x_scnlen.l = H_GET_32 (abfd, ext->x_csect.x_scnlen);
         in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
         in->x_csect.x_snhash   = H_GET_16 (abfd, ext->x_csect.x_snhash);
         /* We don't have to hack bitfields in x_smtyp because it's
            defined by shifts-and-ands, which are equivalent on all
            byte orders.  */
         in->x_csect.x_smtyp    = H_GET_8 (abfd, ext->x_csect.x_smtyp);
         in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
         in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
         in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
         goto end;
       }
      break;

    case C_STAT:
    case C_LEAFSTAT:
    case C_HIDDEN:
      if (type == T_NULL)
       {
         in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
         in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
         in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
         /* PE defines some extra fields; we zero them out for
            safety.  */
         in->x_scn.x_checksum = 0;
         in->x_scn.x_associated = 0;
         in->x_scn.x_comdat = 0;

         goto end;
       }
      break;
    }

  in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
  in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);

  if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
    {
      in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
      in->x_sym.x_fcnary.x_fcn.x_endndx.l =
       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
    }
  else
    {
      in->x_sym.x_fcnary.x_ary.x_dimen[0] =
       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
      in->x_sym.x_fcnary.x_ary.x_dimen[1] =
       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
      in->x_sym.x_fcnary.x_ary.x_dimen[2] =
       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
      in->x_sym.x_fcnary.x_ary.x_dimen[3] =
       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    }

  if (ISFCN (type))
    {
      in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
    }
  else
    {
      in->x_sym.x_misc.x_lnsz.x_lnno =
       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
      in->x_sym.x_misc.x_lnsz.x_size =
       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
    }

 end: ;
  /* The semicolon is because MSVC doesn't like labels at
     end of block.  */
}
unsigned int _bfd_xcoff_swap_aux_out ( bfd abfd,
PTR  inp,
int  type,
int  class,
indx  ,
numaux  ,
PTR  extp 
)

Definition at line 505 of file coff-rs6000.c.

{
  union internal_auxent *in = (union internal_auxent *)inp;
  AUXENT *ext = (AUXENT *)extp;

  memset ((PTR)ext, 0, bfd_coff_auxesz (abfd));
  switch (class)
    {
    case C_FILE:
      if (in->x_file.x_fname[0] == 0)
       {
         H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
         H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
       }
      else
       {
         memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
       }
      goto end;

      /* RS/6000 "csect" auxents */
    case C_EXT:
    case C_HIDEXT:
      if (indx + 1 == numaux)
       {
         H_PUT_32 (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
         H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
         H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
         /* We don't have to hack bitfields in x_smtyp because it's
            defined by shifts-and-ands, which are equivalent on all
            byte orders.  */
         H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
         H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
         H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
         H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
         goto end;
       }
      break;

    case C_STAT:
    case C_LEAFSTAT:
    case C_HIDDEN:
      if (type == T_NULL)
       {
         H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
         H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
         H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
         goto end;
       }
      break;
    }

  H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
  H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);

  if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
    {
      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
              ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
              ext->x_sym.x_fcnary.x_fcn.x_endndx);
    }
  else
    {
      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
              ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
              ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
              ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
              ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    }

  if (ISFCN (type))
    H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
  else
    {
      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
              ext->x_sym.x_misc.x_lnsz.x_lnno);
      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
              ext->x_sym.x_misc.x_lnsz.x_size);
    }

end:
  return bfd_coff_auxesz (abfd);
}

Here is the call graph for this function:

void _bfd_xcoff_swap_sym_in ( bfd abfd,
PTR  ext1,
PTR  in1 
)

Definition at line 334 of file coff-rs6000.c.

{
  SYMENT *ext = (SYMENT *)ext1;
  struct internal_syment * in = (struct internal_syment *)in1;

  if (ext->e.e_name[0] != 0)
    {
      memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
    }
  else
    {
      in->_n._n_n._n_zeroes = 0;
      in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
    }

  in->n_value = H_GET_32 (abfd, ext->e_value);
  in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
  in->n_type = H_GET_16 (abfd, ext->e_type);
  in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
  in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
}
unsigned int _bfd_xcoff_swap_sym_out ( bfd abfd,
PTR  inp,
PTR  extp 
)

Definition at line 360 of file coff-rs6000.c.

{
  struct internal_syment *in = (struct internal_syment *)inp;
  SYMENT *ext =(SYMENT *)extp;

  if (in->_n._n_name[0] != 0)
    {
      memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
    }
  else
    {
      H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
      H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
    }

  H_PUT_32 (abfd, in->n_value, ext->e_value);
  H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
  H_PUT_16 (abfd, in->n_type, ext->e_type);
  H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
  H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
  return bfd_coff_symesz (abfd);
}

Definition at line 2579 of file coff-rs6000.c.

{
  if (! xcoff_big_format_p (abfd))
    return xcoff_write_archive_contents_old (abfd);
  else
    return xcoff_write_archive_contents_big (abfd);
}

Here is the call graph for this function:

bfd_boolean _bfd_xcoff_write_armap ( bfd abfd,
elength  ,
struct orl map,
unsigned int  orl_count,
int  stridx 
)

Definition at line 2067 of file coff-rs6000.c.

{
  if (! xcoff_big_format_p (abfd))
    return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
  else
    return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
}

Here is the call graph for this function:

Definition at line 1119 of file coff-rs6000.c.

{
  /* Not supported yet.  */
  return FALSE;
 /* bfd_xcoff_archive_set_magic (abfd, magic); */
}
static bfd_boolean do_copy ( bfd out_bfd,
bfd in_bfd 
) [static]

Definition at line 1728 of file coff-rs6000.c.

{
  bfd_size_type remaining;
  bfd_byte buffer[DEFAULT_BUFFERSIZE];

  if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
    return FALSE;

  remaining = arelt_size (in_bfd);

  while (remaining >= DEFAULT_BUFFERSIZE)
    {
      if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
         || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
       return FALSE;

      remaining -= DEFAULT_BUFFERSIZE;
    }

  if (remaining)
    {
      if (bfd_bread (buffer, remaining, in_bfd) != remaining
         || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
       return FALSE;
    }

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean do_pad ( bfd abfd,
unsigned int  number 
) [static]

Definition at line 1710 of file coff-rs6000.c.

{
  bfd_byte b = 0;

  /* Limit pad to <= 4096.  */
  if (number > 4096)
    return FALSE;

  while (number--)
    if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
      return FALSE;

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean do_shared_object_padding ( bfd out_bfd,
bfd in_bfd,
file_ptr offset,
int  ar_header_size 
) [static]

Definition at line 1760 of file coff-rs6000.c.

{
  if (bfd_check_format (in_bfd, bfd_object)
      && bfd_get_flavour (in_bfd) == bfd_target_xcoff_flavour
      && (in_bfd->flags & DYNAMIC) != 0)
    {
      bfd_size_type pad = 0;
      int text_align_power;

      text_align_power = bfd_xcoff_text_align_power (in_bfd);

      pad = 1 << text_align_power;
      pad -= (*offset + ar_header_size) & (pad - 1);

      if (! do_pad (out_bfd, pad))
       return FALSE;

      *offset += pad;
    }

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static const char* normalize_filename ( bfd abfd) [static]

Definition at line 1579 of file coff-rs6000.c.

{
  const char *file;
  const char *filename;

  file = bfd_get_filename (abfd);
  filename = strrchr (file, '/');
  if (filename != NULL)
    filename++;
  else
    filename = file;
  return filename;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void xcoff_swap_ldhdr_in PARAMS ( (bfd *, const PTR, struct internal_ldhdr *)  ) [static]
static void xcoff_swap_ldhdr_out PARAMS ( (bfd *, const struct internal_ldhdr *, PTR ) [static]
static void xcoff_swap_ldsym_in PARAMS ( (bfd *, const PTR, struct internal_ldsym *)  ) [static]
static void xcoff_swap_ldsym_out PARAMS ( (bfd *, const struct internal_ldsym *, PTR ) [static]
static void xcoff_swap_ldrel_in PARAMS ( (bfd *, const PTR, struct internal_ldrel *)  ) [static]
static void xcoff_swap_ldrel_out PARAMS ( (bfd *, const struct internal_ldrel *, PTR ) [static]
static asection* xcoff_create_csect_from_smclas PARAMS ( (bfd *, union internal_auxent *, const char *)  ) [static]
static bfd_boolean xcoff_generate_rtinit PARAMS ( (bfd *, const char *, const char *, bfd_boolean ) [static]
static bfd_boolean do_pad PARAMS ( (bfd *, unsigned int ) [static]
static bfd_boolean do_shared_object_padding PARAMS ( (bfd *, bfd *, file_ptr *, int ) [static]
static bfd_boolean xcoff_complain_overflow_bitfield_func ( bfd input_bfd,
bfd_vma  val,
bfd_vma  relocation,
struct reloc_howto_struct howto 
) [static]

Definition at line 3049 of file coff-rs6000.c.

{
  bfd_vma addrmask, fieldmask, signmask, ss;
  bfd_vma a, b, sum;

  /* Get the values to be added together.  For signed and unsigned
     relocations, we assume that all values should be truncated to
     the size of an address.  For bitfields, all the bits matter.
     See also bfd_check_overflow.  */
  fieldmask = N_ONES (howto->bitsize);
  addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
  a = relocation;
  b = val & howto->src_mask;

  /* Much like unsigned, except no trimming with addrmask.  In
     addition, the sum overflows if there is a carry out of
     the bfd_vma, i.e., the sum is less than either input
     operand.  */
  a >>= howto->rightshift;
  b >>= howto->bitpos;

  /* Bitfields are sometimes used for signed numbers; for
     example, a 13-bit field sometimes represents values in
     0..8191 and sometimes represents values in -4096..4095.
     If the field is signed and a is -4095 (0x1001) and b is
     -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
     0x1fff is 0x3000).  It's not clear how to handle this
     everywhere, since there is not way to know how many bits
     are significant in the relocation, but the original code
     assumed that it was fully sign extended, and we will keep
     that assumption.  */
  signmask = (fieldmask >> 1) + 1;

  if ((a & ~ fieldmask) != 0)
    {
      /* Some bits out of the field are set.  This might not
        be a problem: if this is a signed bitfield, it is OK
        iff all the high bits are set, including the sign
        bit.  We'll try setting all but the most significant
        bit in the original relocation value: if this is all
        ones, we are OK, assuming a signed bitfield.  */
      ss = (signmask << howto->rightshift) - 1;
      if ((ss | relocation) != ~ (bfd_vma) 0)
       return TRUE;
      a &= fieldmask;
    }

  /* We just assume (b & ~ fieldmask) == 0.  */

  /* We explicitly permit wrap around if this relocation
     covers the high bit of an address.  The Linux kernel
     relies on it, and it is the only way to write assembler
     code which can run when loaded at a location 0x80000000
     away from the location at which it is linked.  */
  if (howto->bitsize + howto->rightshift
      == bfd_arch_bits_per_address (input_bfd))
    return FALSE;

  sum = a + b;
  if (sum < a || (sum & ~ fieldmask) != 0)
    {
      /* There was a carry out, or the field overflow.  Test
        for signed operands again.  Here is the overflow test
        is as for complain_overflow_signed.  */
      if (((~ (a ^ b)) & (a ^ sum)) & signmask)
       return TRUE;
    }

  return FALSE;
}

Here is the call graph for this function:

static bfd_boolean xcoff_complain_overflow_dont_func ( input_bfd  ,
val  ,
relocation  ,
howto   
) [static]

Definition at line 3039 of file coff-rs6000.c.

{
  return FALSE;
}
static bfd_boolean xcoff_complain_overflow_signed_func ( bfd input_bfd,
bfd_vma  val,
bfd_vma  relocation,
struct reloc_howto_struct howto 
) [static]

Definition at line 3125 of file coff-rs6000.c.

{
  bfd_vma addrmask, fieldmask, signmask, ss;
  bfd_vma a, b, sum;

  /* Get the values to be added together.  For signed and unsigned
     relocations, we assume that all values should be truncated to
     the size of an address.  For bitfields, all the bits matter.
     See also bfd_check_overflow.  */
  fieldmask = N_ONES (howto->bitsize);
  addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
  a = relocation;
  b = val & howto->src_mask;

  a = (a & addrmask) >> howto->rightshift;

  /* If any sign bits are set, all sign bits must be set.
     That is, A must be a valid negative address after
     shifting.  */
  signmask = ~ (fieldmask >> 1);
  ss = a & signmask;
  if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
    return TRUE;

  /* We only need this next bit of code if the sign bit of B
     is below the sign bit of A.  This would only happen if
     SRC_MASK had fewer bits than BITSIZE.  Note that if
     SRC_MASK has more bits than BITSIZE, we can get into
     trouble; we would need to verify that B is in range, as
     we do for A above.  */
  signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
  if ((b & signmask) != 0)
    {
      /* Set all the bits above the sign bit.  */
      b -= signmask <<= 1;
    }

  b = (b & addrmask) >> howto->bitpos;

  /* Now we can do the addition.  */
  sum = a + b;

  /* See if the result has the correct sign.  Bits above the
     sign bit are junk now; ignore them.  If the sum is
     positive, make sure we did not have all negative inputs;
     if the sum is negative, make sure we did not have all
     positive inputs.  The test below looks only at the sign
     bits, and it really just
     SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
  */
  signmask = (fieldmask >> 1) + 1;
  if (((~ (a ^ b)) & (a ^ sum)) & signmask)
    return TRUE;

  return FALSE;
}

Here is the call graph for this function:

static bfd_boolean xcoff_complain_overflow_unsigned_func ( bfd input_bfd,
bfd_vma  val,
bfd_vma  relocation,
struct reloc_howto_struct howto 
) [static]

Definition at line 3187 of file coff-rs6000.c.

{
  bfd_vma addrmask, fieldmask;
  bfd_vma a, b, sum;

  /* Get the values to be added together.  For signed and unsigned
     relocations, we assume that all values should be truncated to
     the size of an address.  For bitfields, all the bits matter.
     See also bfd_check_overflow.  */
  fieldmask = N_ONES (howto->bitsize);
  addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
  a = relocation;
  b = val & howto->src_mask;

  /* Checking for an unsigned overflow is relatively easy:
     trim the addresses and add, and trim the result as well.
     Overflow is normally indicated when the result does not
     fit in the field.  However, we also need to consider the
     case when, e.g., fieldmask is 0x7fffffff or smaller, an
     input is 0x80000000, and bfd_vma is only 32 bits; then we
     will get sum == 0, but there is an overflow, since the
     inputs did not fit in the field.  Instead of doing a
     separate test, we can check for this by or-ing in the
     operands when testing for the sum overflowing its final
     field.  */
  a = (a & addrmask) >> howto->rightshift;
  b = (b & addrmask) >> howto->bitpos;
  sum = (a + b) & addrmask;
  if ((a | b | sum) & ~ fieldmask)
    return TRUE;

  return FALSE;
}

Here is the call graph for this function:

static asection* xcoff_create_csect_from_smclas ( bfd abfd,
union internal_auxent aux,
const char *  symbol_name 
) [static]

Definition at line 3600 of file coff-rs6000.c.

{
  asection *return_value = NULL;

  /* .sv64 = x_smclas == 17
     This is an invalid csect for 32 bit apps.  */
  static const char *names[19] =
  {
    ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
    ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
    ".td", NULL, ".sv3264"
  };

  if ((19 >= aux->x_csect.x_smclas)
      && (NULL != names[aux->x_csect.x_smclas]))
    {
      return_value = bfd_make_section_anyway
       (abfd, names[aux->x_csect.x_smclas]);
    }
  else
    {
      (*_bfd_error_handler)
       (_("%B: symbol `%s' has unrecognized smclas %d"),
        abfd, symbol_name, aux->x_csect.x_smclas);
      bfd_set_error (bfd_error_bad_value);
    }

  return return_value;
}

Here is the call graph for this function:

static bfd_boolean xcoff_generate_rtinit ( bfd abfd,
const char *  init,
const char *  fini,
bfd_boolean  rtld 
) [static]

Definition at line 3672 of file coff-rs6000.c.

{
  bfd_byte filehdr_ext[FILHSZ];
  bfd_byte scnhdr_ext[SCNHSZ];
  bfd_byte syment_ext[SYMESZ * 10];
  bfd_byte reloc_ext[RELSZ * 3];
  bfd_byte *data_buffer;
  bfd_size_type data_buffer_size;
  bfd_byte *string_table = NULL, *st_tmp = NULL;
  bfd_size_type string_table_size;
  bfd_vma val;
  size_t initsz, finisz;
  struct internal_filehdr filehdr;
  struct internal_scnhdr scnhdr;
  struct internal_syment syment;
  union internal_auxent auxent;
  struct internal_reloc reloc;

  char *data_name = ".data";
  char *rtinit_name = "__rtinit";
  char *rtld_name = "__rtld";

  if (! bfd_xcoff_rtinit_size (abfd))
    return FALSE;

  initsz = (init == NULL ? 0 : 1 + strlen (init));
  finisz = (fini == NULL ? 0 : 1 + strlen (fini));

  /* file header */
  memset (filehdr_ext, 0, FILHSZ);
  memset (&filehdr, 0, sizeof (struct internal_filehdr));
  filehdr.f_magic = bfd_xcoff_magic_number (abfd);
  filehdr.f_nscns = 1;
  filehdr.f_timdat = 0;
  filehdr.f_nsyms = 0;  /* at least 6, no more than 10 */
  filehdr.f_symptr = 0; /* set below */
  filehdr.f_opthdr = 0;
  filehdr.f_flags = 0;

  /* section header */
  memset (scnhdr_ext, 0, SCNHSZ);
  memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
  memcpy (scnhdr.s_name, data_name, strlen (data_name));
  scnhdr.s_paddr = 0;
  scnhdr.s_vaddr = 0;
  scnhdr.s_size = 0;    /* set below */
  scnhdr.s_scnptr = FILHSZ + SCNHSZ;
  scnhdr.s_relptr = 0;  /* set below */
  scnhdr.s_lnnoptr = 0;
  scnhdr.s_nreloc = 0;  /* either 1 or 2 */
  scnhdr.s_nlnno = 0;
  scnhdr.s_flags = STYP_DATA;

  /* .data
     0x0000         0x00000000 : rtl
     0x0004         0x00000010 : offset to init, or 0
     0x0008         0x00000028 : offset to fini, or 0
     0x000C         0x0000000C : size of descriptor
     0x0010         0x00000000 : init, needs a reloc
     0x0014         0x00000040 : offset to init name
     0x0018         0x00000000 : flags, padded to a word
     0x001C         0x00000000 : empty init
     0x0020         0x00000000 :
     0x0024         0x00000000 :
     0x0028         0x00000000 : fini, needs a reloc
     0x002C         0x00000??? : offset to fini name
     0x0030         0x00000000 : flags, padded to a word
     0x0034         0x00000000 : empty fini
     0x0038         0x00000000 :
     0x003C         0x00000000 :
     0x0040         init name
     0x0040 + initsz  fini name */

  data_buffer_size = 0x0040 + initsz + finisz;
  data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
  data_buffer = NULL;
  data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
  if (data_buffer == NULL)
    return FALSE;

  if (initsz)
    {
      val = 0x10;
      bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
      val = 0x40;
      bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
      memcpy (&data_buffer[val], init, initsz);
    }

  if (finisz)
    {
      val = 0x28;
      bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
      val = 0x40 + initsz;
      bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
      memcpy (&data_buffer[val], fini, finisz);
    }

  val = 0x0C;
  bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);

  scnhdr.s_size = data_buffer_size;

  /* string table */
  string_table_size = 0;
  if (initsz > 9)
    string_table_size += initsz;
  if (finisz > 9)
    string_table_size += finisz;
  if (string_table_size)
    {
      string_table_size += 4;
      string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
      if (string_table == NULL)
       return FALSE;

      val = string_table_size;
      bfd_h_put_32 (abfd, val, &string_table[0]);
      st_tmp = string_table + 4;
    }

  /* symbols
     0. .data csect
     2. __rtinit
     4. init function
     6. fini function
     8. __rtld  */
  memset (syment_ext, 0, 10 * SYMESZ);
  memset (reloc_ext, 0, 3 * RELSZ);

  /* .data csect */
  memset (&syment, 0, sizeof (struct internal_syment));
  memset (&auxent, 0, sizeof (union internal_auxent));
  memcpy (syment._n._n_name, data_name, strlen (data_name));
  syment.n_scnum = 1;
  syment.n_sclass = C_HIDEXT;
  syment.n_numaux = 1;
  auxent.x_csect.x_scnlen.l = data_buffer_size;
  auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
  auxent.x_csect.x_smclas = XMC_RW;
  bfd_coff_swap_sym_out (abfd, &syment,
                      &syment_ext[filehdr.f_nsyms * SYMESZ]);
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
                      syment.n_numaux,
                      &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
  filehdr.f_nsyms += 2;

  /* __rtinit */
  memset (&syment, 0, sizeof (struct internal_syment));
  memset (&auxent, 0, sizeof (union internal_auxent));
  memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
  syment.n_scnum = 1;
  syment.n_sclass = C_EXT;
  syment.n_numaux = 1;
  auxent.x_csect.x_smtyp = XTY_LD;
  auxent.x_csect.x_smclas = XMC_RW;
  bfd_coff_swap_sym_out (abfd, &syment,
                      &syment_ext[filehdr.f_nsyms * SYMESZ]);
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
                      syment.n_numaux,
                      &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
  filehdr.f_nsyms += 2;

  /* init */
  if (initsz)
    {
      memset (&syment, 0, sizeof (struct internal_syment));
      memset (&auxent, 0, sizeof (union internal_auxent));

      if (initsz > 9)
       {
         syment._n._n_n._n_offset = st_tmp - string_table;
         memcpy (st_tmp, init, initsz);
         st_tmp += initsz;
       }
      else
       memcpy (syment._n._n_name, init, initsz - 1);

      syment.n_sclass = C_EXT;
      syment.n_numaux = 1;
      bfd_coff_swap_sym_out (abfd, &syment,
                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
                          syment.n_numaux,
                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);

      /* reloc */
      memset (&reloc, 0, sizeof (struct internal_reloc));
      reloc.r_vaddr = 0x0010;
      reloc.r_symndx = filehdr.f_nsyms;
      reloc.r_type = R_POS;
      reloc.r_size = 31;
      bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);

      filehdr.f_nsyms += 2;
      scnhdr.s_nreloc += 1;
    }

  /* fini */
  if (finisz)
    {
      memset (&syment, 0, sizeof (struct internal_syment));
      memset (&auxent, 0, sizeof (union internal_auxent));

      if (finisz > 9)
       {
         syment._n._n_n._n_offset = st_tmp - string_table;
         memcpy (st_tmp, fini, finisz);
         st_tmp += finisz;
       }
      else
       memcpy (syment._n._n_name, fini, finisz - 1);

      syment.n_sclass = C_EXT;
      syment.n_numaux = 1;
      bfd_coff_swap_sym_out (abfd, &syment,
                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
                          syment.n_numaux,
                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);

      /* reloc */
      memset (&reloc, 0, sizeof (struct internal_reloc));
      reloc.r_vaddr = 0x0028;
      reloc.r_symndx = filehdr.f_nsyms;
      reloc.r_type = R_POS;
      reloc.r_size = 31;
      bfd_coff_swap_reloc_out (abfd, &reloc,
                            &reloc_ext[scnhdr.s_nreloc * RELSZ]);

      filehdr.f_nsyms += 2;
      scnhdr.s_nreloc += 1;
    }

  if (rtld)
    {
      memset (&syment, 0, sizeof (struct internal_syment));
      memset (&auxent, 0, sizeof (union internal_auxent));
      memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
      syment.n_sclass = C_EXT;
      syment.n_numaux = 1;
      bfd_coff_swap_sym_out (abfd, &syment,
                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
                          syment.n_numaux,
                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);

      /* reloc */
      memset (&reloc, 0, sizeof (struct internal_reloc));
      reloc.r_vaddr = 0x0000;
      reloc.r_symndx = filehdr.f_nsyms;
      reloc.r_type = R_POS;
      reloc.r_size = 31;
      bfd_coff_swap_reloc_out (abfd, &reloc,
                            &reloc_ext[scnhdr.s_nreloc * RELSZ]);

      filehdr.f_nsyms += 2;
      scnhdr.s_nreloc += 1;
    }

  scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
  filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;

  bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
  bfd_bwrite (filehdr_ext, FILHSZ, abfd);
  bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
  bfd_bwrite (scnhdr_ext, SCNHSZ, abfd);
  bfd_bwrite (data_buffer, data_buffer_size, abfd);
  bfd_bwrite (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
  bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
  bfd_bwrite (string_table, string_table_size, abfd);

  free (data_buffer);
  data_buffer = NULL;

  return TRUE;
}

Here is the call graph for this function:

static bfd_boolean xcoff_is_lineno_count_overflow ( abfd  ,
bfd_vma  value 
) [static]

Definition at line 3634 of file coff-rs6000.c.

{
  if (0xffff <= value)
    return TRUE;

  return FALSE;
}
static bfd_boolean xcoff_is_reloc_count_overflow ( abfd  ,
bfd_vma  value 
) [static]

Definition at line 3645 of file coff-rs6000.c.

{
  if (0xffff <= value)
    return TRUE;

  return FALSE;
}
static bfd_vma xcoff_loader_reloc_offset ( bfd abfd,
struct internal_ldhdr ldhdr 
) [static]

Definition at line 3664 of file coff-rs6000.c.

{
  return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
}
static bfd_vma xcoff_loader_symbol_offset ( bfd abfd,
ldhdr   
) [static]

Definition at line 3656 of file coff-rs6000.c.

{
  return bfd_xcoff_ldhdrsz (abfd);
}
bfd_boolean xcoff_ppc_relocate_section ( bfd output_bfd,
struct bfd_link_info info,
bfd input_bfd,
asection input_section,
bfd_byte contents,
struct internal_reloc relocs,
struct internal_syment syms,
asection **  sections 
)

Definition at line 3339 of file coff-rs6000.c.

{
  struct internal_reloc *rel;
  struct internal_reloc *relend;

  rel = relocs;
  relend = rel + input_section->reloc_count;
  for (; rel < relend; rel++)
    {
      long symndx;
      struct xcoff_link_hash_entry *h;
      struct internal_syment *sym;
      bfd_vma addend;
      bfd_vma val;
      struct reloc_howto_struct howto;
      bfd_vma relocation;
      bfd_vma value_to_relocate;
      bfd_vma address;
      bfd_byte *location;

      /* Relocation type R_REF is a special relocation type which is
        merely used to prevent garbage collection from occurring for
        the csect including the symbol which it references.  */
      if (rel->r_type == R_REF)
       continue;

      /* howto */
      howto.type = rel->r_type;
      howto.rightshift = 0;
      howto.bitsize = (rel->r_size & 0x1f) + 1;
      howto.size = howto.bitsize > 16 ? 2 : 1;
      howto.pc_relative = FALSE;
      howto.bitpos = 0;
      howto.complain_on_overflow = (rel->r_size & 0x80
                                ? complain_overflow_signed
                                : complain_overflow_bitfield);
      howto.special_function = NULL;
      howto.name = "internal";
      howto.partial_inplace = TRUE;
      howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
      howto.pcrel_offset = FALSE;

      /* symbol */
      val = 0;
      addend = 0;
      h = NULL;
      sym = NULL;
      symndx = rel->r_symndx;

      if (-1 != symndx)
       {
         asection *sec;

         h = obj_xcoff_sym_hashes (input_bfd)[symndx];
         sym = syms + symndx;
         addend = - sym->n_value;

         if (NULL == h)
           {
             sec = sections[symndx];
             /* Hack to make sure we use the right TOC anchor value
               if this reloc is against the TOC anchor.  */
             if (sec->name[3] == '0'
                && strcmp (sec->name, ".tc0") == 0)
              val = xcoff_data (output_bfd)->toc;
             else
              val = (sec->output_section->vma
                     + sec->output_offset
                     + sym->n_value
                     - sec->vma);
           }
         else
           {
             if (h->root.type == bfd_link_hash_defined
                || h->root.type == bfd_link_hash_defweak)
              {
                sec = h->root.u.def.section;
                val = (h->root.u.def.value
                      + sec->output_section->vma
                      + sec->output_offset);
              }
             else if (h->root.type == bfd_link_hash_common)
              {
                sec = h->root.u.c.p->section;
                val = (sec->output_section->vma
                      + sec->output_offset);

              }
             else if ((0 == (h->flags & (XCOFF_DEF_DYNAMIC | XCOFF_IMPORT)))
                     && ! info->relocatable)
              {
                if (! ((*info->callbacks->undefined_symbol)
                      (info, h->root.root.string, input_bfd, input_section,
                       rel->r_vaddr - input_section->vma, TRUE)))
                  return FALSE;

                /* Don't try to process the reloc.  It can't help, and
                   it may generate another error.  */
                continue;
              }
           }
       }

      if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
         || !((*xcoff_calculate_relocation[rel->r_type])
              (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
              addend, &relocation, contents)))
       return FALSE;

      /* address */
      address = rel->r_vaddr - input_section->vma;
      location = contents + address;

      if (address > input_section->size)
       abort ();

      /* Get the value we are going to relocate.  */
      if (1 == howto.size)
       value_to_relocate = bfd_get_16 (input_bfd, location);
      else
       value_to_relocate = bfd_get_32 (input_bfd, location);

      /* overflow.

        FIXME: We may drop bits during the addition
        which we don't check for.  We must either check at every single
        operation, which would be tedious, or we must do the computations
        in a type larger than bfd_vma, which would be inefficient.  */

      if ((unsigned int) howto.complain_on_overflow
         >= XCOFF_MAX_COMPLAIN_OVERFLOW)
       abort ();

      if (((*xcoff_complain_overflow[howto.complain_on_overflow])
          (input_bfd, value_to_relocate, relocation, &howto)))
       {
         const char *name;
         char buf[SYMNMLEN + 1];
         char reloc_type_name[10];

         if (symndx == -1)
           {
             name = "*ABS*";
           }
         else if (h != NULL)
           {
             name = NULL;
           }
         else
           {
             name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
             if (name == NULL)
              name = "UNKNOWN";
           }
         sprintf (reloc_type_name, "0x%02x", rel->r_type);

         if (! ((*info->callbacks->reloc_overflow)
               (info, (h ? &h->root : NULL), name, reloc_type_name,
                (bfd_vma) 0, input_bfd, input_section,
                rel->r_vaddr - input_section->vma)))
           return FALSE;
       }

      /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
      value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
                        | (((value_to_relocate & howto.src_mask)
                            + relocation) & howto.dst_mask));

      /* Put the value back in the object file.  */
      if (1 == howto.size)
       bfd_put_16 (input_bfd, value_to_relocate, location);
      else
       bfd_put_32 (input_bfd, value_to_relocate, location);
    }

  return TRUE;
}

Here is the call graph for this function:

bfd_boolean xcoff_reloc_type_ba ( input_bfd  ,
input_section  ,
output_bfd  ,
rel  ,
sym  ,
struct reloc_howto_struct howto,
bfd_vma  val,
bfd_vma  addend,
bfd_vma relocation,
contents   
)

Definition at line 2911 of file coff-rs6000.c.

{
  howto->src_mask &= ~3;
  howto->dst_mask = howto->src_mask;

  *relocation = val + addend;

  return TRUE;
}
static bfd_boolean xcoff_reloc_type_br ( bfd input_bfd,
asection input_section,
output_bfd  ,
struct internal_reloc rel,
sym  ,
struct reloc_howto_struct howto,
bfd_vma  val,
bfd_vma  addend,
bfd_vma relocation,
bfd_byte contents 
) [static]

Definition at line 2933 of file coff-rs6000.c.

{
  struct xcoff_link_hash_entry *h;

  if (0 > rel->r_symndx)
    return FALSE;

  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];

  /* If we see an R_BR or R_RBR reloc which is jumping to global
     linkage code, and it is followed by an appropriate cror nop
     instruction, we replace the cror with lwz r2,20(r1).  This
     restores the TOC after the glink code.  Contrariwise, if the
     call is followed by a lwz r2,20(r1), but the call is not
     going to global linkage code, we can replace the load with a
     cror.  */
  if (NULL != h
      && bfd_link_hash_defined == h->root.type
      && rel->r_vaddr - input_section->vma + 8 <= input_section->size)
    {
      bfd_byte *pnext;
      unsigned long next;

      pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
      next = bfd_get_32 (input_bfd, pnext);

      /* The _ptrgl function is magic.  It is used by the AIX
        compiler to call a function through a pointer.  */
      if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
       {
         if (next == 0x4def7b82                  /* cror 15,15,15 */
             || next == 0x4ffffb82               /* cror 31,31,31 */
             || next == 0x60000000)                     /* ori r0,r0,0 */
           bfd_put_32 (input_bfd, 0x80410014, pnext);   /* lwz r1,20(r1) */

       }
      else
       {
         if (next == 0x80410014)                 /* lwz r1,20(r1) */
           bfd_put_32 (input_bfd, 0x60000000, pnext);   /* ori r0,r0,0 */
       }
    }
  else if (NULL != h && bfd_link_hash_undefined == h->root.type)
    {
      /* Normally, this relocation is against a defined symbol.  In the
        case where this is a partial link and the output section offset
        is greater than 2^25, the linker will return an invalid error
        message that the relocation has been truncated.  Yes it has been
        truncated but no it not important.  For this case, disable the
        overflow checking. */

      howto->complain_on_overflow = complain_overflow_dont;
    }

  howto->pc_relative = TRUE;
  howto->src_mask &= ~3;
  howto->dst_mask = howto->src_mask;

  /* A PC relative reloc includes the section address.  */
  addend += input_section->vma;

  *relocation = val + addend;
  *relocation -= (input_section->output_section->vma
                + input_section->output_offset);
  return TRUE;
}

Here is the call graph for this function:

bfd_boolean xcoff_reloc_type_crel ( input_bfd  ,
asection input_section,
output_bfd  ,
rel  ,
sym  ,
struct reloc_howto_struct howto,
val  ,
bfd_vma  addend,
bfd_vma relocation,
contents   
)

Definition at line 3012 of file coff-rs6000.c.

{
  howto->pc_relative = TRUE;
  howto->src_mask &= ~3;
  howto->dst_mask = howto->src_mask;

  /* A PC relative reloc includes the section address.  */
  addend += input_section->vma;

  *relocation = val + addend;
  *relocation -= (input_section->output_section->vma
                + input_section->output_offset);
  return TRUE;
}
bfd_boolean xcoff_reloc_type_fail ( bfd input_bfd,
input_section  ,
output_bfd  ,
struct internal_reloc rel,
sym  ,
howto  ,
val  ,
addend  ,
relocation  ,
contents   
)

Definition at line 2786 of file coff-rs6000.c.

{
  (*_bfd_error_handler)
    (_("%s: unsupported relocation type 0x%02x"),
     bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
  bfd_set_error (bfd_error_bad_value);
  return FALSE;
}

Here is the call graph for this function:

bfd_boolean xcoff_reloc_type_neg ( input_bfd  ,
input_section  ,
output_bfd  ,
rel  ,
sym  ,
howto  ,
bfd_vma  val,
bfd_vma  addend,
bfd_vma relocation,
contents   
)

Definition at line 2825 of file coff-rs6000.c.

{
  *relocation = addend - val;
  return TRUE;
}
bfd_boolean xcoff_reloc_type_noop ( input_bfd  ,
input_section  ,
output_bfd  ,
rel  ,
sym  ,
howto  ,
val  ,
addend  ,
relocation  ,
contents   
)

Definition at line 2769 of file coff-rs6000.c.

{
  return TRUE;
}
bfd_boolean xcoff_reloc_type_pos ( input_bfd  ,
input_section  ,
output_bfd  ,
rel  ,
sym  ,
howto  ,
bfd_vma  val,
bfd_vma  addend,
bfd_vma relocation,
contents   
)

Definition at line 2807 of file coff-rs6000.c.

{
  *relocation = val + addend;
  return TRUE;
}
bfd_boolean xcoff_reloc_type_rel ( input_bfd  ,
asection input_section,
output_bfd  ,
rel  ,
sym  ,
struct reloc_howto_struct howto,
bfd_vma  val,
bfd_vma  addend,
bfd_vma relocation,
contents   
)

Definition at line 2843 of file coff-rs6000.c.

{
  howto->pc_relative = TRUE;

  /* A PC relative reloc includes the section address.  */
  addend += input_section->vma;

  *relocation = val + addend;
  *relocation -= (input_section->output_section->vma
                + input_section->output_offset);
  return TRUE;
}
bfd_boolean xcoff_reloc_type_toc ( bfd input_bfd,
input_section  ,
bfd output_bfd,
struct internal_reloc rel,
struct internal_syment sym,
howto  ,
bfd_vma  val,
addend  ,
bfd_vma relocation,
contents   
)

Definition at line 2868 of file coff-rs6000.c.

{
  struct xcoff_link_hash_entry *h;

  if (0 > rel->r_symndx)
    return FALSE;

  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];

  if (h != NULL && h->smclas != XMC_TD)
    {
      if (h->toc_section == NULL)
       {
         (*_bfd_error_handler)
           (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
            bfd_get_filename (input_bfd), rel->r_vaddr,
            h->root.root.string);
         bfd_set_error (bfd_error_bad_value);
         return FALSE;
       }

      BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
      val = (h->toc_section->output_section->vma
             + h->toc_section->output_offset);
    }

  *relocation = ((val - xcoff_data (output_bfd)->toc)
               - (sym->n_value - xcoff_data (input_bfd)->toc));
  return TRUE;
}

Here is the call graph for this function:

void xcoff_rtype2howto ( arelent relent,
struct internal_reloc internal 
)

Definition at line 1000 of file coff-rs6000.c.

{
  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 reloc */
  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];
      else if (R_RBA == internal->r_type)
       relent->howto = &xcoff_howto_table[0x1e];
    }

  /* 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
     type matches this information.  The bitsize is not significant
     for R_REF relocs.  */
  if (relent->howto->dst_mask != 0
      && (relent->howto->bitsize
         != ((unsigned int) internal->r_size & 0x1f) + 1))
    abort ();
}
static void xcoff_swap_ldhdr_in ( bfd abfd,
const PTR  s,
struct internal_ldhdr dst 
) [static]

Definition at line 2614 of file coff-rs6000.c.

{
  const struct external_ldhdr *src = (const struct external_ldhdr *) s;

  dst->l_version = bfd_get_32 (abfd, src->l_version);
  dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
  dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
  dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
  dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
  dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
  dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
  dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
}
static void xcoff_swap_ldhdr_out ( bfd abfd,
const struct internal_ldhdr src,
PTR  d 
) [static]

Definition at line 2634 of file coff-rs6000.c.

{
  struct external_ldhdr *dst = (struct external_ldhdr *) d;

  bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
  bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
  bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
  bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
  bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
  bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
  bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
  bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
}
static void xcoff_swap_ldrel_in ( bfd abfd,
const PTR  s,
struct internal_ldrel dst 
) [static]

Definition at line 2738 of file coff-rs6000.c.

{
  const struct external_ldrel *src = (const struct external_ldrel *) s;

  dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
  dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
  dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
  dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
}
static void xcoff_swap_ldrel_out ( bfd abfd,
const struct internal_ldrel src,
PTR  d 
) [static]

Definition at line 2754 of file coff-rs6000.c.

{
  struct external_ldrel *dst = (struct external_ldrel *) d;

  bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
  bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
  bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
  bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
}
static void xcoff_swap_ldsym_in ( bfd abfd,
const PTR  s,
struct internal_ldsym dst 
) [static]

Definition at line 2654 of file coff-rs6000.c.

{
  const struct external_ldsym *src = (const struct external_ldsym *) s;

  if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
    memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
  } else {
    dst->_l._l_l._l_zeroes = 0;
    dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
  }
  dst->l_value = bfd_get_32 (abfd, src->l_value);
  dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
  dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
  dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
  dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
  dst->l_parm = bfd_get_32 (abfd, src->l_parm);
}
static void xcoff_swap_ldsym_out ( bfd abfd,
const struct internal_ldsym src,
PTR  d 
) [static]

Definition at line 2678 of file coff-rs6000.c.

{
  struct external_ldsym *dst = (struct external_ldsym *) d;

  if (src->_l._l_l._l_zeroes != 0)
    memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
  else
    {
      bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
      bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
                dst->_l._l_l._l_offset);
    }
  bfd_put_32 (abfd, src->l_value, dst->l_value);
  bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
  bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
  bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
  bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
  bfd_put_32 (abfd, src->l_parm, dst->l_parm);
}
static void xcoff_swap_reloc_in ( bfd abfd,
PTR  s,
PTR  d 
) [static]

Definition at line 2702 of file coff-rs6000.c.

{
  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);
}

Here is the call graph for this function:

static unsigned int xcoff_swap_reloc_out ( bfd abfd,
PTR  s,
PTR  d 
) [static]

Definition at line 2719 of file coff-rs6000.c.

{
  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);
}
static bfd_boolean xcoff_write_archive_contents_big ( bfd abfd) [static]

Definition at line 2314 of file coff-rs6000.c.

{
  struct xcoff_ar_file_hdr_big fhdr;
  bfd_size_type count;
  bfd_size_type total_namlen;
  file_ptr *offsets;
  bfd_boolean makemap;
  bfd_boolean hasobjects;
  file_ptr prevoff, nextoff;
  bfd *current_bfd;
  size_t i;
  struct xcoff_ar_hdr_big *hdr, ahdr;
  bfd_size_type size;
  char *member_table, *mt;
  bfd_vma member_table_size;

  memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
  memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);

  if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
    return FALSE;

  /* Calculate count and total_namlen.  */
  makemap = bfd_has_map (abfd);
  hasobjects = FALSE;
  for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
       current_bfd != NULL;
       current_bfd = current_bfd->next, count++)
    {
      total_namlen += strlen (normalize_filename (current_bfd)) + 1;

      if (makemap
         && ! hasobjects
         && bfd_check_format (current_bfd, bfd_object))
       hasobjects = TRUE;
    }

  offsets = NULL;
  if (count)
    {
      offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
      if (offsets == NULL)
       return FALSE;
    }

  prevoff = 0;
  nextoff = SIZEOF_AR_FILE_HDR_BIG;
  for (current_bfd = abfd->archive_head, i = 0;
       current_bfd != NULL;
       current_bfd = current_bfd->next, i++)
    {
      const char *name;
      bfd_size_type namlen;
      struct xcoff_ar_hdr_big *ahdrp;
      bfd_size_type remaining;

      name = normalize_filename (current_bfd);
      namlen = strlen (name);

      if (current_bfd->arelt_data != NULL)
       ahdrp = arch_xhdr_big (current_bfd);
      else
       ahdrp = NULL;

      if (ahdrp == NULL)
       {
         struct stat s;

         ahdrp = &ahdr;
         /* XXX This should actually be a call to stat64 (at least on
            32-bit machines).
            XXX This call will fail if the original object is not found.  */
         if (stat (bfd_get_filename (current_bfd), &s) != 0)
           {
             bfd_set_error (bfd_error_system_call);
             return FALSE;
           }

         PRINT20 (ahdrp->size, s.st_size);
         PRINT12 (ahdrp->date, s.st_mtime);
         PRINT12 (ahdrp->uid,  s.st_uid);
         PRINT12 (ahdrp->gid,  s.st_gid);
         PRINT12_OCTAL (ahdrp->mode, s.st_mode);

         if (current_bfd->arelt_data == NULL)
           {
             size = sizeof (struct areltdata);
             current_bfd->arelt_data = bfd_alloc (current_bfd, size);
             if (current_bfd->arelt_data == NULL)
              return FALSE;
           }

         arch_eltdata (current_bfd)->parsed_size = s.st_size;
       }

      PRINT20 (ahdrp->prevoff, prevoff);
      PRINT4 (ahdrp->namlen, namlen);

      /* If the length of the name is odd, we write out the null byte
        after the name as well.  */
      namlen = (namlen + 1) &~ (bfd_size_type) 1;

      remaining = arelt_size (current_bfd);
      size = (SIZEOF_AR_HDR_BIG
             + namlen
             + SXCOFFARFMAG
             + remaining);

      BFD_ASSERT (nextoff == bfd_tell (abfd));

      /* Check for xcoff shared objects.
        Their text section needs to be aligned wrt the archive file position.
        This requires extra padding before the archive header.  */
      if (! do_shared_object_padding (abfd, current_bfd, & nextoff,
                                  SIZEOF_AR_HDR_BIG + namlen
                                  + SXCOFFARFMAG))
       return FALSE;

      offsets[i] = nextoff;

      prevoff = nextoff;
      nextoff += size + (size & 1);

      PRINT20 (ahdrp->nextoff, nextoff);

      if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
          != SIZEOF_AR_HDR_BIG)
         || bfd_bwrite ((PTR) name, (bfd_size_type) namlen, abfd) != namlen
         || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
                       abfd) != SXCOFFARFMAG))
       return FALSE;

      if (bfd_seek (current_bfd, (file_ptr) 0, SEEK_SET) != 0)
       return FALSE;

      if (! do_copy (abfd, current_bfd))
       return FALSE;

      if (! do_pad (abfd, size & 1))
       return FALSE;
    }

  if (count)
    {
      PRINT20 (fhdr.firstmemoff, offsets[0]);
      PRINT20 (fhdr.lastmemoff, prevoff);
    }

  /* Write out the member table.
     Layout :

     standard big archive header
     0x0000                ar_size [0x14]
     0x0014                ar_nxtmem [0x14]
     0x0028                ar_prvmem [0x14]
     0x003C                ar_date [0x0C]
     0x0048                ar_uid  [0x0C]
     0x0054                ar_gid  [0x0C]
     0x0060                ar_mod  [0x0C]
     0x006C                ar_namelen[0x04]
     0x0070                ar_fmag [0x02]

     Member table
     0x0072                count   [0x14]
     0x0086                offsets [0x14 * counts]
     0x0086 + 0x14 * counts   names       [??]
     ??                           pad to even bytes.
   */

  BFD_ASSERT (nextoff == bfd_tell (abfd));

  member_table_size = (SIZEOF_AR_HDR_BIG
                     + SXCOFFARFMAG
                     + XCOFFARMAGBIG_ELEMENT_SIZE
                     + count * XCOFFARMAGBIG_ELEMENT_SIZE
                     + total_namlen);

  member_table_size += member_table_size & 1;
  member_table = bfd_zmalloc (member_table_size);
  if (member_table == NULL)
    return FALSE;

  hdr = (struct xcoff_ar_hdr_big *) member_table;

  PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
                     + count * XCOFFARMAGBIG_ELEMENT_SIZE
                     + total_namlen + (total_namlen & 1)));
  if (makemap && hasobjects)
    PRINT20 (hdr->nextoff, nextoff + member_table_size);
  else
    PRINT20 (hdr->nextoff, 0);
  PRINT20 (hdr->prevoff, prevoff);
  PRINT12 (hdr->date, 0);
  PRINT12 (hdr->uid, 0);
  PRINT12 (hdr->gid, 0);
  PRINT12 (hdr->mode, 0);
  PRINT4 (hdr->namlen, 0);

  mt = member_table + SIZEOF_AR_HDR_BIG;
  memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
  mt += SXCOFFARFMAG;

  PRINT20 (mt, count);
  mt += XCOFFARMAGBIG_ELEMENT_SIZE;
  for (i = 0; i < (size_t) count; i++)
    {
      PRINT20 (mt, offsets[i]);
      mt += XCOFFARMAGBIG_ELEMENT_SIZE;
    }

  if (count)
    {
      free (offsets);
      offsets = NULL;
    }

  for (current_bfd = abfd->archive_head; current_bfd != NULL;
       current_bfd = current_bfd->next)
    {
      const char *name;
      size_t namlen;

      name = normalize_filename (current_bfd);
      namlen = sprintf (mt, "%s", name);
      mt += namlen + 1;
    }

  if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
    return FALSE;

  free (member_table);

  PRINT20 (fhdr.memoff, nextoff);

  prevoff = nextoff;
  nextoff += member_table_size;

  /* Write out the armap, if appropriate.  */

  if (! makemap || ! hasobjects)
    PRINT20 (fhdr.symoff, 0);
  else
    {
      BFD_ASSERT (nextoff == bfd_tell (abfd));

      /* Save nextoff in fhdr.symoff so the armap routine can use it.  */
      PRINT20 (fhdr.symoff, nextoff);

      bfd_ardata (abfd)->tdata = (PTR) &fhdr;
      if (! _bfd_compute_and_write_armap (abfd, 0))
       return FALSE;
    }

  /* Write out the archive file header.  */

  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
      || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
                    abfd) != SIZEOF_AR_FILE_HDR_BIG))
    return FALSE;

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean xcoff_write_archive_contents_old ( bfd abfd) [static]

Definition at line 2084 of file coff-rs6000.c.

{
  struct xcoff_ar_file_hdr fhdr;
  bfd_size_type count;
  bfd_size_type total_namlen;
  file_ptr *offsets;
  bfd_boolean makemap;
  bfd_boolean hasobjects;
  file_ptr prevoff, nextoff;
  bfd *sub;
  size_t i;
  struct xcoff_ar_hdr ahdr;
  bfd_size_type size;
  char *p;
  char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];

  memset (&fhdr, 0, sizeof fhdr);
  (void) strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
  sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
  sprintf (fhdr.freeoff, "%d", 0);

  count = 0;
  total_namlen = 0;
  for (sub = abfd->archive_head; sub != NULL; sub = sub->next)
    {
      ++count;
      total_namlen += strlen (normalize_filename (sub)) + 1;
    }
  offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
  if (offsets == NULL)
    return FALSE;

  if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
    return FALSE;

  makemap = bfd_has_map (abfd);
  hasobjects = FALSE;
  prevoff = 0;
  nextoff = SIZEOF_AR_FILE_HDR;
  for (sub = abfd->archive_head, i = 0; sub != NULL; sub = sub->next, i++)
    {
      const char *name;
      bfd_size_type namlen;
      struct xcoff_ar_hdr *ahdrp;
      bfd_size_type remaining;

      if (makemap && ! hasobjects)
       {
         if (bfd_check_format (sub, bfd_object))
           hasobjects = TRUE;
       }

      name = normalize_filename (sub);
      namlen = strlen (name);

      if (sub->arelt_data != NULL)
       ahdrp = arch_xhdr (sub);
      else
       ahdrp = NULL;

      if (ahdrp == NULL)
       {
         struct stat s;

         memset (&ahdr, 0, sizeof ahdr);
         ahdrp = &ahdr;
         if (stat (bfd_get_filename (sub), &s) != 0)
           {
             bfd_set_error (bfd_error_system_call);
             return FALSE;
           }

         sprintf (ahdrp->size, "%ld", (long) s.st_size);
         sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
         sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
         sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
         sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);

         if (sub->arelt_data == NULL)
           {
             size = sizeof (struct areltdata);
             sub->arelt_data = bfd_alloc (sub, size);
             if (sub->arelt_data == NULL)
              return FALSE;
           }

         arch_eltdata (sub)->parsed_size = s.st_size;
       }

      sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
      sprintf (ahdrp->namlen, "%ld", (long) namlen);

      /* If the length of the name is odd, we write out the null byte
        after the name as well.  */
      namlen = (namlen + 1) &~ (bfd_size_type) 1;

      remaining = arelt_size (sub);
      size = (SIZEOF_AR_HDR
             + namlen
             + SXCOFFARFMAG
             + remaining);

      BFD_ASSERT (nextoff == bfd_tell (abfd));

      offsets[i] = nextoff;

      prevoff = nextoff;
      nextoff += size + (size & 1);

      sprintf (ahdrp->nextoff, "%ld", (long) nextoff);

      /* We need spaces, not null bytes, in the header.  */
      for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
       if (*p == '\0')
         *p = ' ';

      if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR, abfd)
          != SIZEOF_AR_HDR)
         || bfd_bwrite ((PTR) name, namlen, abfd) != namlen
         || bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
                      abfd) != SXCOFFARFMAG)
       return FALSE;

      if (bfd_seek (sub, (file_ptr) 0, SEEK_SET) != 0)
       return FALSE;

      if (! do_copy (abfd, sub))
       return FALSE;

      if (! do_pad (abfd, size & 1))
       return FALSE;
    }

  sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);

  /* Write out the member table.  */

  BFD_ASSERT (nextoff == bfd_tell (abfd));
  sprintf (fhdr.memoff, "%ld", (long) nextoff);

  memset (&ahdr, 0, sizeof ahdr);
  sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
                                 + count * XCOFFARMAG_ELEMENT_SIZE
                                 + total_namlen));
  sprintf (ahdr.prevoff, "%ld", (long) prevoff);
  sprintf (ahdr.date, "%d", 0);
  sprintf (ahdr.uid, "%d", 0);
  sprintf (ahdr.gid, "%d", 0);
  sprintf (ahdr.mode, "%d", 0);
  sprintf (ahdr.namlen, "%d", 0);

  size = (SIZEOF_AR_HDR
         + XCOFFARMAG_ELEMENT_SIZE
         + count * XCOFFARMAG_ELEMENT_SIZE
         + total_namlen
         + SXCOFFARFMAG);

  prevoff = nextoff;
  nextoff += size + (size & 1);

  if (makemap && hasobjects)
    sprintf (ahdr.nextoff, "%ld", (long) nextoff);
  else
    sprintf (ahdr.nextoff, "%d", 0);

  /* We need spaces, not null bytes, in the header.  */
  for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
    if (*p == '\0')
      *p = ' ';

  if ((bfd_bwrite ((PTR) &ahdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
       != SIZEOF_AR_HDR)
      || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
         != SXCOFFARFMAG))
    return FALSE;

  sprintf (decbuf, "%-12ld", (long) count);
  if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
      != XCOFFARMAG_ELEMENT_SIZE)
    return FALSE;
  for (i = 0; i < (size_t) count; i++)
    {
      sprintf (decbuf, "%-12ld", (long) offsets[i]);
      if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
                    abfd) != XCOFFARMAG_ELEMENT_SIZE)
       return FALSE;
    }
  for (sub = abfd->archive_head; sub != NULL; sub = sub->next)
    {
      const char *name;
      bfd_size_type namlen;

      name = normalize_filename (sub);
      namlen = strlen (name);
      if (bfd_bwrite ((PTR) name, namlen + 1, abfd) != namlen + 1)
       return FALSE;
    }

  if (! do_pad (abfd, size & 1))
    return FALSE;

  /* Write out the armap, if appropriate.  */
  if (! makemap || ! hasobjects)
    sprintf (fhdr.symoff, "%d", 0);
  else
    {
      BFD_ASSERT (nextoff == bfd_tell (abfd));
      sprintf (fhdr.symoff, "%ld", (long) nextoff);
      bfd_ardata (abfd)->tdata = (PTR) &fhdr;
      if (! _bfd_compute_and_write_armap (abfd, 0))
       return FALSE;
    }

  /* Write out the archive file header.  */

  /* We need spaces, not null bytes, in the header.  */
  for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
    if (*p == '\0')
      *p = ' ';

  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
      || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
         != SIZEOF_AR_FILE_HDR))
    return FALSE;

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean xcoff_write_armap_big ( bfd abfd,
elength  ,
struct orl map,
unsigned int  orl_count,
int  stridx 
) [static]

Definition at line 1788 of file coff-rs6000.c.

{
  struct xcoff_ar_file_hdr_big *fhdr;
  bfd_vma i, sym_32, sym_64, str_32, str_64;
  const bfd_arch_info_type *arch_info = NULL;
  bfd *current_bfd;
  size_t string_length;
  file_ptr nextoff, prevoff;

  /* First, we look through the symbols and work out which are
     from 32-bit objects and which from 64-bit ones.  */
  sym_32 = sym_64 = str_32 = str_64 = 0;

  current_bfd = abfd->archive_head;
  if (current_bfd != NULL)
    arch_info = bfd_get_arch_info (current_bfd);
    i = 0;
    while (current_bfd != NULL && i < orl_count)
    {
      while (map[i].u.abfd == current_bfd)
       {
         string_length = strlen (*map[i].name) + 1;

         if (arch_info->bits_per_address == 64)
           {
             sym_64++;
             str_64 += string_length;
           }
         else
           {
             sym_32++;
             str_32 += string_length;
           }
         i++;
       }
      current_bfd = current_bfd->next;
      if (current_bfd != NULL)
       arch_info = bfd_get_arch_info (current_bfd);
    }

  /* A quick sanity check... */
  BFD_ASSERT (sym_64 + sym_32 == orl_count);
  /* Explicit cast to int for compiler.  */
  BFD_ASSERT ((int)(str_64 + str_32) == stridx);

  fhdr = xcoff_ardata_big (abfd);

  /* xcoff_write_archive_contents_big passes nextoff in symoff. */
  READ20 (fhdr->memoff, prevoff);
  READ20 (fhdr->symoff, nextoff);

  BFD_ASSERT (nextoff == bfd_tell (abfd));

  /* Write out the symbol table.
     Layout :

     standard big archive header
     0x0000                ar_size [0x14]
     0x0014                ar_nxtmem [0x14]
     0x0028                ar_prvmem [0x14]
     0x003C                ar_date [0x0C]
     0x0048                ar_uid  [0x0C]
     0x0054                ar_gid  [0x0C]
     0x0060                ar_mod  [0x0C]
     0x006C                ar_namelen[0x04]
     0x0070                ar_fmag [SXCOFFARFMAG]

     Symbol table
     0x0072                num_syms       [0x08], binary
     0x0078                offsets [0x08 * num_syms], binary
     0x0086 + 0x08 * num_syms names       [??]
     ??                           pad to even bytes.
  */

  if (sym_32)
    {
      struct xcoff_ar_hdr_big *hdr;
      char *symbol_table;
      char *st;
      file_ptr fileoff;

      bfd_vma symbol_table_size =
       SIZEOF_AR_HDR_BIG
       + SXCOFFARFMAG
       + 8
       + 8 * sym_32
       + str_32 + (str_32 & 1);

      symbol_table = bfd_zmalloc (symbol_table_size);
      if (symbol_table == NULL)
       return FALSE;

      hdr = (struct xcoff_ar_hdr_big *) symbol_table;

      PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));

      if (sym_64)
       PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
      else
       PRINT20 (hdr->nextoff, 0);

      PRINT20 (hdr->prevoff, prevoff);
      PRINT12 (hdr->date, 0);
      PRINT12 (hdr->uid, 0);
      PRINT12 (hdr->gid, 0);
      PRINT12 (hdr->mode, 0);
      PRINT4 (hdr->namlen, 0) ;

      st = symbol_table + SIZEOF_AR_HDR_BIG;
      memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
      st += SXCOFFARFMAG;

      bfd_h_put_64 (abfd, sym_32, st);
      st += 8;

      /* loop over the 32 bit offsets */
      current_bfd = abfd->archive_head;
      if (current_bfd != NULL)
       arch_info = bfd_get_arch_info (current_bfd);
      fileoff = SIZEOF_AR_FILE_HDR_BIG;
      i = 0;
      while (current_bfd != NULL && i < orl_count)
       {
         while (map[i].u.abfd == current_bfd)
           {
             if (arch_info->bits_per_address == 32)
              {
                bfd_h_put_64 (abfd, fileoff, st);
                st += 8;
              }
             i++;
           }
         string_length = strlen (normalize_filename (current_bfd));
         string_length += string_length & 1;
         fileoff += (SIZEOF_AR_HDR_BIG
                    + string_length
                    + SXCOFFARFMAG
                    + arelt_size (current_bfd));
         fileoff += fileoff & 1;
         current_bfd = current_bfd->next;
         if (current_bfd != NULL)
           arch_info = bfd_get_arch_info (current_bfd);
       }

      /* loop over the 32 bit symbol names */
      current_bfd = abfd->archive_head;
      if (current_bfd != NULL)
       arch_info = bfd_get_arch_info (current_bfd);
      i = 0;
      while (current_bfd != NULL && i < orl_count)
       {
         while (map[i].u.abfd == current_bfd)
           {
             if (arch_info->bits_per_address == 32)
              {
                string_length = sprintf (st, "%s", *map[i].name);
                st += string_length + 1;
              }
             i++;
           }
         current_bfd = current_bfd->next;
         if (current_bfd != NULL)
           arch_info = bfd_get_arch_info (current_bfd);
       }

      bfd_bwrite (symbol_table, symbol_table_size, abfd);

      free (symbol_table);

      prevoff = nextoff;
      nextoff = nextoff + symbol_table_size;
    }
  else
    PRINT20 (fhdr->symoff, 0);

  if (sym_64)
    {
      struct xcoff_ar_hdr_big *hdr;
      char *symbol_table;
      char *st;
      file_ptr fileoff;

      bfd_vma symbol_table_size =
       SIZEOF_AR_HDR_BIG
       + SXCOFFARFMAG
       + 8
       + 8 * sym_64
       + str_64 + (str_64 & 1);

      symbol_table = bfd_zmalloc (symbol_table_size);
      if (symbol_table == NULL)
       return FALSE;

      hdr = (struct xcoff_ar_hdr_big *) symbol_table;

      PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
      PRINT20 (hdr->nextoff, 0);
      PRINT20 (hdr->prevoff, prevoff);
      PRINT12 (hdr->date, 0);
      PRINT12 (hdr->uid, 0);
      PRINT12 (hdr->gid, 0);
      PRINT12 (hdr->mode, 0);
      PRINT4 (hdr->namlen, 0);

      st = symbol_table + SIZEOF_AR_HDR_BIG;
      memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
      st += SXCOFFARFMAG;

      bfd_h_put_64 (abfd, sym_64, st);
      st += 8;

      /* loop over the 64 bit offsets */
      current_bfd = abfd->archive_head;
      if (current_bfd != NULL)
       arch_info = bfd_get_arch_info (current_bfd);
      fileoff = SIZEOF_AR_FILE_HDR_BIG;
      i = 0;
      while (current_bfd != NULL && i < orl_count)
       {
         while (map[i].u.abfd == current_bfd)
           {
             if (arch_info->bits_per_address == 64)
              {
                bfd_h_put_64 (abfd, fileoff, st);
                st += 8;
              }
             i++;
           }
         string_length = strlen (normalize_filename (current_bfd));
         string_length += string_length & 1;
         fileoff += (SIZEOF_AR_HDR_BIG
                    + string_length
                    + SXCOFFARFMAG
                    + arelt_size (current_bfd));
         fileoff += fileoff & 1;
         current_bfd = current_bfd->next;
         if (current_bfd != NULL)
           arch_info = bfd_get_arch_info (current_bfd);
       }

      /* loop over the 64 bit symbol names */
      current_bfd = abfd->archive_head;
      if (current_bfd != NULL)
       arch_info = bfd_get_arch_info (current_bfd);
      i = 0;
      while (current_bfd != NULL && i < orl_count)
       {
         while (map[i].u.abfd == current_bfd)
           {
             if (arch_info->bits_per_address == 64)
              {
                string_length = sprintf (st, "%s", *map[i].name);
                st += string_length + 1;
              }
             i++;
           }
         current_bfd = current_bfd->next;
         if (current_bfd != NULL)
           arch_info = bfd_get_arch_info (current_bfd);
       }

      bfd_bwrite (symbol_table, symbol_table_size, abfd);

      free (symbol_table);

      PRINT20 (fhdr->symoff64, nextoff);
    }
  else
    PRINT20 (fhdr->symoff64, 0);

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean xcoff_write_armap_old ( bfd abfd,
elength  ,
struct orl map,
unsigned int  orl_count,
int  stridx 
) [static]

Definition at line 1597 of file coff-rs6000.c.

{
  struct xcoff_ar_hdr hdr;
  char *p;
  unsigned char buf[4];
  bfd *sub;
  file_ptr fileoff;
  unsigned int i;

  memset (&hdr, 0, sizeof hdr);
  sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
  sprintf (hdr.nextoff, "%d", 0);
  memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
  sprintf (hdr.date, "%d", 0);
  sprintf (hdr.uid, "%d", 0);
  sprintf (hdr.gid, "%d", 0);
  sprintf (hdr.mode, "%d", 0);
  sprintf (hdr.namlen, "%d", 0);

  /* We need spaces, not null bytes, in the header.  */
  for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
    if (*p == '\0')
      *p = ' ';

  if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
      != SIZEOF_AR_HDR
      || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
         != SXCOFFARFMAG))
    return FALSE;

  H_PUT_32 (abfd, orl_count, buf);
  if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
    return FALSE;

  sub = abfd->archive_head;
  fileoff = SIZEOF_AR_FILE_HDR;
  i = 0;
  while (sub != NULL && i < orl_count)
    {
      size_t namlen;

      while (map[i].u.abfd == sub)
       {
         H_PUT_32 (abfd, fileoff, buf);
         if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
           return FALSE;
         ++i;
       }
      namlen = strlen (normalize_filename (sub));
      namlen = (namlen + 1) &~ (size_t) 1;
      fileoff += (SIZEOF_AR_HDR
                + namlen
                + SXCOFFARFMAG
                + arelt_size (sub));
      fileoff = (fileoff + 1) &~ 1;
      sub = sub->next;
    }

  for (i = 0; i < orl_count; i++)
    {
      const char *name;
      size_t namlen;

      name = *map[i].name;
      namlen = strlen (name);
      if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
       return FALSE;
    }

  if ((stridx & 1) != 0)
    {
      char b;

      b = '\0';
      if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
       return FALSE;
    }

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 1683 of file coff-rs6000.c.

Definition at line 4336 of file coff-rs6000.c.

Definition at line 4085 of file coff-rs6000.c.

static struct xcoff_backend_data_rec [static]

Definition at line 3989 of file coff-rs6000.c.

reloc_howto_type xcoff_dynamic_reloc [static]
Initial value:
HOWTO (0,                   
       0,                   
       2,                   
       32,                  
       FALSE,               
       0,                   
       complain_overflow_bitfield, 
       0,                   
       "R_POS",                    
       TRUE,                
       0xffffffff,          
       0xffffffff,          
       FALSE)

Definition at line 3955 of file coff-rs6000.c.

Initial value:
  {
    0x81820000,      
    0x90410014,      
    0x800c0000,      
    0x804c0004,      
    0x7c0903a6,      
    0x4e800420,      
    0x00000000,      
    0x000c8000,      
    0x00000000,      
  }

Definition at line 3975 of file coff-rs6000.c.

reloc_howto_type xcoff_howto_table[]

Definition at line 609 of file coff-rs6000.c.