/* BFD back-end for IBM RS/6000 "XCOFF64" files.
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+ 2010
Free Software Foundation, Inc.
Written Clinton Popetz.
Contributed by Cygnus Support.
}
static void
-_bfd_xcoff64_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
+_bfd_xcoff64_swap_aux_in (abfd, ext1, type, in_class, indx, numaux, in1)
bfd *abfd;
PTR ext1;
int type;
- int class;
+ int in_class;
int indx;
int numaux;
PTR in1;
union external_auxent *ext = (union external_auxent *) ext1;
union internal_auxent *in = (union internal_auxent *) in1;
- switch (class)
+ switch (in_class)
{
case C_FILE:
if (ext->x_file.x_n.x_zeroes[0] == 0)
/* RS/6000 "csect" auxents */
case C_EXT:
+ case C_AIX_WEAKEXT:
case C_HIDEXT:
if (indx + 1 == numaux)
{
break;
}
- if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
+ if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
+ || ISTAG (in_class))
{
in->x_sym.x_fcnary.x_fcn.x_lnnoptr
= H_GET_64 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
}
static unsigned int
-_bfd_xcoff64_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
+_bfd_xcoff64_swap_aux_out (abfd, inp, type, in_class, indx, numaux, extp)
bfd *abfd;
PTR inp;
int type;
- int class;
+ int in_class;
int indx ATTRIBUTE_UNUSED;
int numaux ATTRIBUTE_UNUSED;
PTR extp;
union external_auxent *ext = (union external_auxent *) extp;
memset ((PTR) ext, 0, bfd_coff_auxesz (abfd));
- switch (class)
+ switch (in_class)
{
case C_FILE:
if (in->x_file.x_n.x_zeroes == 0)
/* RS/6000 "csect" auxents */
case C_EXT:
+ case C_AIX_WEAKEXT:
case C_HIDEXT:
if (indx + 1 == numaux)
{
break;
}
- if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
+ if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
+ || ISTAG (in_class))
{
H_PUT_64 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
going to global linkage code, we can replace the load with a
cror. */
if (NULL != h
- && bfd_link_hash_defined == h->root.type
+ && (bfd_link_hash_defined == h->root.type
+ || bfd_link_hash_defweak == h->root.type)
&& section_offset + 8 <= input_section->size)
{
bfd_byte *pnext;
howto->dst_mask = howto->src_mask;
if (h != NULL
- && h->root.type == bfd_link_hash_defined
+ && (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
&& bfd_is_abs_section (h->root.u.def.section)
&& section_offset + 4 <= input_section->size)
{
}
else
{
+ if (info->unresolved_syms_in_objects != RM_IGNORE
+ && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
+ {
+ if (! ((*info->callbacks->undefined_symbol)
+ (info, h->root.root.string,
+ input_bfd, input_section,
+ rel->r_vaddr - input_section->vma,
+ (info->unresolved_syms_in_objects
+ == RM_GENERATE_ERROR))))
+ return FALSE;
+ }
if (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
{
val = (sec->output_section->vma
+ sec->output_offset);
}
- else if ((0 == (h->flags & (XCOFF_DEF_DYNAMIC | XCOFF_IMPORT)))
- && ! info->relocatable)
+ else
{
- 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;
+ BFD_ASSERT (info->relocatable
+ || (h->flags & XCOFF_DEF_DYNAMIC) != 0
+ || (h->flags & XCOFF_IMPORT) != 0);
}
}
}
EMPTY_HOWTO (0xe),
- /* Non-relocating reference. */
+ /* Non-relocating reference. Bitsize is 1 so that r_rsize is 0. */
HOWTO (R_REF, /* type */
0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 1, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
return &xcoff64_howto_table[0x1c];
case BFD_RELOC_64:
return &xcoff64_howto_table[0];
+ case BFD_RELOC_NONE:
+ return &xcoff64_howto_table[0xf];
default:
return NULL;
}
/* Copy */
_bfd_xcoff_copy_private_bfd_data,
- ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
+ _bfd_generic_bfd_merge_private_bfd_data,
_bfd_generic_init_private_section_data,
- ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
- ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
- ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
- ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
- ((bfd_boolean (*) (bfd *, void * )) bfd_true),
+ _bfd_generic_bfd_copy_private_section_data,
+ _bfd_generic_bfd_copy_private_symbol_data,
+ _bfd_generic_bfd_copy_private_header_data,
+ _bfd_generic_bfd_set_private_flags,
+ _bfd_generic_bfd_print_private_bfd_data,
/* Core */
coff_core_file_failing_command,
/* Archive */
xcoff64_slurp_armap,
- bfd_false,
- ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
+ _bfd_noarchive_slurp_extended_name_table,
+ _bfd_noarchive_construct_extended_name_table,
bfd_dont_truncate_arname,
_bfd_xcoff_write_armap,
_bfd_xcoff_read_ar_hdr,
+ _bfd_generic_write_ar_hdr,
xcoff64_openr_next_archived_file,
_bfd_generic_get_elt_at_index,
_bfd_xcoff_stat_arch_elt,
_bfd_generic_link_hash_table_free,
_bfd_xcoff_bfd_link_add_symbols,
_bfd_generic_link_just_syms,
+ _bfd_generic_copy_link_hash_symbol_type,
_bfd_xcoff_bfd_final_link,
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
+ _bfd_xcoff_define_common_symbol,
/* Dynamic */
_bfd_xcoff_get_dynamic_symtab_upper_bound,
/* Copy */
_bfd_xcoff_copy_private_bfd_data,
- ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
+ _bfd_generic_bfd_merge_private_bfd_data,
_bfd_generic_init_private_section_data,
- ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
- ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
- ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
- ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
- ((bfd_boolean (*) (bfd *, void * )) bfd_true),
+ _bfd_generic_bfd_copy_private_section_data,
+ _bfd_generic_bfd_copy_private_symbol_data,
+ _bfd_generic_bfd_copy_private_header_data,
+ _bfd_generic_bfd_set_private_flags,
+ _bfd_generic_bfd_print_private_bfd_data,
/* Core */
xcoff64_core_file_failing_command,
/* Archive */
xcoff64_slurp_armap,
- bfd_false,
- ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
+ _bfd_noarchive_slurp_extended_name_table,
+ _bfd_noarchive_construct_extended_name_table,
bfd_dont_truncate_arname,
_bfd_xcoff_write_armap,
_bfd_xcoff_read_ar_hdr,
+ _bfd_generic_write_ar_hdr,
xcoff64_openr_next_archived_file,
_bfd_generic_get_elt_at_index,
_bfd_xcoff_stat_arch_elt,
_bfd_generic_link_hash_table_free,
_bfd_xcoff_bfd_link_add_symbols,
_bfd_generic_link_just_syms,
+ _bfd_generic_copy_link_hash_symbol_type,
_bfd_xcoff_bfd_final_link,
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
+ _bfd_xcoff_define_common_symbol,
/* Dynamic */
_bfd_xcoff_get_dynamic_symtab_upper_bound,