X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=bfd%2Fcoff64-rs6000.c;h=4d618c1acc23f6390ec441879c11b18136956ba8;hb=253dc0e43b0ad46985842e3e195afdbf851a3943;hp=71a02c237beb012098d6c478b46f07c7baa94a70;hpb=75e1e2af36dda0fb265167c0a8b0116c80a9bffe;p=pf3gnuchains%2Fpf3gnuchains3x.git diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 71a02c237b..4d618c1acc 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -353,11 +353,11 @@ _bfd_xcoff64_swap_sym_out (abfd, inp, extp) } 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; @@ -365,7 +365,7 @@ _bfd_xcoff64_swap_aux_in (abfd, ext1, type, class, indx, numaux, 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) @@ -381,6 +381,7 @@ _bfd_xcoff64_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) /* RS/6000 "csect" auxents */ case C_EXT: + case C_AIX_WEAKEXT: case C_HIDEXT: if (indx + 1 == numaux) { @@ -419,7 +420,8 @@ _bfd_xcoff64_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) 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); @@ -443,11 +445,11 @@ _bfd_xcoff64_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) } 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; @@ -456,7 +458,7 @@ _bfd_xcoff64_swap_aux_out (abfd, inp, type, class, indx, numaux, 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) @@ -473,6 +475,7 @@ _bfd_xcoff64_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) /* RS/6000 "csect" auxents */ case C_EXT: + case C_AIX_WEAKEXT: case C_HIDEXT: if (indx + 1 == numaux) { @@ -504,7 +507,8 @@ _bfd_xcoff64_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) 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); @@ -1133,7 +1137,8 @@ xcoff64_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto, 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; @@ -1176,7 +1181,8 @@ xcoff64_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto, 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) { @@ -1293,6 +1299,17 @@ xcoff64_ppc_relocate_section (output_bfd, info, input_bfd, } 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) { @@ -1307,17 +1324,11 @@ xcoff64_ppc_relocate_section (output_bfd, info, input_bfd, 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); } } } @@ -2730,13 +2741,13 @@ const bfd_target rs6000coff64_vec = /* 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, @@ -2745,8 +2756,8 @@ const bfd_target rs6000coff64_vec = /* 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, @@ -2789,6 +2800,7 @@ const bfd_target rs6000coff64_vec = _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, @@ -2796,6 +2808,7 @@ const bfd_target rs6000coff64_vec = 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, @@ -2983,13 +2996,13 @@ const bfd_target aix5coff64_vec = /* 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, @@ -2998,8 +3011,8 @@ const bfd_target aix5coff64_vec = /* 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, @@ -3042,6 +3055,7 @@ const bfd_target aix5coff64_vec = _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, @@ -3049,6 +3063,7 @@ const bfd_target aix5coff64_vec = 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,