X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcoff64-rs6000.c;h=7185232ce14b6d140354cdf095efb0a8b0b9cd02;hb=fda3f1174efb2fb1800e3fcb74819ba2dc9c2dd0;hp=460bf49f52f4d413a954989ae77ebaeabcb89052;hpb=6c4e7b6bfbc4679f695106de2817ecf02b27c8be;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 460bf49f52..7185232ce1 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -1,5 +1,5 @@ /* BFD back-end for IBM RS/6000 "XCOFF64" files. - Copyright (C) 2000-2017 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. Written Clinton Popetz. Contributed by Cygnus Support. @@ -155,7 +155,7 @@ static bfd_boolean xcoff64_ppc_relocate_section asection **); static bfd_boolean xcoff64_slurp_armap (bfd *); -static const bfd_target *xcoff64_archive_p +static bfd_cleanup xcoff64_archive_p (bfd *); static bfd *xcoff64_openr_next_archived_file (bfd *, bfd *); @@ -238,7 +238,7 @@ bfd_boolean (*xcoff64_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION]) #define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup #define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup #ifdef AIX_CORE -extern const bfd_target * rs6000coff_core_p +extern bfd_cleanup rs6000coff_core_p (bfd *abfd); extern bfd_boolean rs6000coff_core_file_matches_executable_p (bfd *cbfd, bfd *ebfd); @@ -278,7 +278,6 @@ extern int rs6000coff_core_file_failing_signal #define bfd_pe_print_pdata NULL #endif -#include #include "coffcode.h" /* For XCOFF64, the effective width of symndx changes depending on @@ -345,7 +344,7 @@ _bfd_xcoff64_swap_sym_out (bfd *abfd, void *inp, void *extp) static void _bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class, - int indx, int numaux, void *in1) + int indx, int numaux, void *in1) { union external_auxent *ext = (union external_auxent *) ext1; union internal_auxent *in = (union internal_auxent *) in1; @@ -357,7 +356,7 @@ _bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class, { 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_n.x_offset); + H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset); } else { @@ -432,9 +431,9 @@ _bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class, static unsigned int _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class, - int indx ATTRIBUTE_UNUSED, - int numaux ATTRIBUTE_UNUSED, - void *extp) + int indx ATTRIBUTE_UNUSED, + int numaux ATTRIBUTE_UNUSED, + void *extp) { union internal_auxent *in = (union internal_auxent *) inp; union external_auxent *ext = (union external_auxent *) extp; @@ -447,7 +446,7 @@ _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class, { H_PUT_32 (abfd, 0, ext->x_file.x_n.x_n.x_zeroes); H_PUT_32 (abfd, in->x_file.x_n.x_offset, - ext->x_file.x_n.x_n.x_offset); + ext->x_file.x_n.x_n.x_offset); } else { @@ -521,8 +520,8 @@ _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class, static bfd_boolean _bfd_xcoff64_put_symbol_name (struct bfd_link_info *info, struct bfd_strtab_hash *strtab, - struct internal_syment *sym, - const char *name) + struct internal_syment *sym, + const char *name) { bfd_boolean hash; bfd_size_type indx; @@ -541,9 +540,9 @@ _bfd_xcoff64_put_symbol_name (struct bfd_link_info *info, static bfd_boolean _bfd_xcoff64_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED, - struct xcoff_loader_info *ldinfo, - struct internal_ldsym *ldsym, - const char *name) + struct xcoff_loader_info *ldinfo, + struct internal_ldsym *ldsym, + const char *name) { size_t len; len = strlen (name); @@ -588,8 +587,8 @@ _bfd_xcoff64_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED, static void xcoff64_swap_ldhdr_in (bfd *abfd, - const void *s, - struct internal_ldhdr *dst) + const void *s, + struct internal_ldhdr *dst) { const struct external_ldhdr *src = (const struct external_ldhdr *) s; @@ -960,7 +959,7 @@ xcoff64_write_object_contents (bfd *abfd) if (text_sec != NULL) { internal_a.o_sntext = text_sec->target_index; - internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec); + internal_a.o_algntext = bfd_section_alignment (text_sec); } else { @@ -971,7 +970,7 @@ xcoff64_write_object_contents (bfd *abfd) if (data_sec != NULL) { internal_a.o_sndata = data_sec->target_index; - internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec); + internal_a.o_algndata = bfd_section_alignment (data_sec); } else { @@ -1062,15 +1061,15 @@ xcoff64_write_object_contents (bfd *abfd) static bfd_boolean xcoff64_reloc_type_br (bfd *input_bfd, - asection *input_section, - bfd *output_bfd ATTRIBUTE_UNUSED, - struct internal_reloc *rel, - struct internal_syment *sym ATTRIBUTE_UNUSED, - struct reloc_howto_struct *howto, - bfd_vma val, - bfd_vma addend, - bfd_vma *relocation, - bfd_byte *contents) + asection *input_section, + bfd *output_bfd ATTRIBUTE_UNUSED, + struct internal_reloc *rel, + struct internal_syment *sym ATTRIBUTE_UNUSED, + struct reloc_howto_struct *howto, + bfd_vma val, + bfd_vma addend, + bfd_vma *relocation, + bfd_byte *contents) { struct xcoff_link_hash_entry *h; bfd_vma section_offset; @@ -1169,13 +1168,13 @@ xcoff64_reloc_type_br (bfd *input_bfd, bfd_boolean xcoff64_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) + struct bfd_link_info *info, + bfd *input_bfd, + asection *input_section, + bfd_byte *contents, + struct internal_reloc *relocs, + struct internal_syment *syms, + asection **sections) { struct internal_reloc *rel; struct internal_reloc *relend; @@ -1250,10 +1249,11 @@ xcoff64_ppc_relocate_section (bfd *output_bfd, { if (info->unresolved_syms_in_objects != RM_IGNORE && (h->flags & XCOFF_WAS_UNDEFINED) != 0) - (*info->callbacks->undefined_symbol) + 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); + info->unresolved_syms_in_objects == RM_DIAGNOSE + && !info->warn_unresolved_syms); if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) @@ -1306,10 +1306,6 @@ xcoff64_ppc_relocate_section (bfd *output_bfd, 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))) { @@ -1807,7 +1803,7 @@ xcoff64_rtype2howto (arelent *relent, struct internal_reloc *internal) reloc_howto_type * xcoff64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) + bfd_reloc_code_real_type code) { switch (code) { @@ -1883,13 +1879,13 @@ _bfd_strntoll (const char * nptr, int base, unsigned int maxlen) } /* Macro to read an ASCII value stored in an archive header field. */ -#define GET_VALUE_IN_FIELD(VAR, FIELD) \ - do \ - { \ - (VAR) = sizeof (VAR) > sizeof (long) \ - ? _bfd_strntoll (FIELD, 10, sizeof FIELD) \ - : _bfd_strntol (FIELD, 10, sizeof FIELD); \ - } \ +#define GET_VALUE_IN_FIELD(VAR, FIELD, BASE) \ + do \ + { \ + (VAR) = (sizeof (VAR) > sizeof (long) \ + ? _bfd_strntoll (FIELD, BASE, sizeof FIELD) \ + : _bfd_strntol (FIELD, BASE, sizeof FIELD)); \ + } \ while (0) /* Read in the armap of an XCOFF archive. */ @@ -1911,7 +1907,7 @@ xcoff64_slurp_armap (bfd *abfd) if (xcoff_ardata (abfd) == NULL) { - bfd_has_map (abfd) = FALSE; + abfd->has_armap = FALSE; return TRUE; } @@ -1919,7 +1915,7 @@ xcoff64_slurp_armap (bfd *abfd) (const char **) NULL, 10); if (off == 0) { - bfd_has_map (abfd) = FALSE; + abfd->has_armap = FALSE; return TRUE; } @@ -1932,24 +1928,31 @@ xcoff64_slurp_armap (bfd *abfd) return FALSE; /* Skip the name (normally empty). */ - GET_VALUE_IN_FIELD (namlen, hdr.namlen); + GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10); pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG; if (bfd_seek (abfd, pos, SEEK_CUR) != 0) return FALSE; sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10); + if (sz + 1 < 9) + { + bfd_set_error (bfd_error_bad_value); + return FALSE; + } /* Read in the entire symbol table. */ - contents = (bfd_byte *) bfd_alloc (abfd, sz); + contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz); if (contents == NULL) return FALSE; - if (bfd_bread (contents, sz, abfd) != sz) - return FALSE; + + /* Ensure strings are NULL terminated so we don't wander off the end + of the buffer. */ + contents[sz] = 0; /* The symbol table starts with an eight byte count. */ c = H_GET_64 (abfd, contents); - if (c * 8 >= sz) + if (c >= sz / 8) { bfd_set_error (bfd_error_bad_value); return FALSE; @@ -1981,7 +1984,7 @@ xcoff64_slurp_armap (bfd *abfd) } bfd_ardata (abfd)->symdef_count = c; - bfd_has_map (abfd) = TRUE; + abfd->has_armap = TRUE; return TRUE; } @@ -1989,14 +1992,14 @@ xcoff64_slurp_armap (bfd *abfd) /* See if this is an NEW XCOFF archive. */ -static const bfd_target * +static bfd_cleanup xcoff64_archive_p (bfd *abfd) { struct artdata *tdata_hold; char magic[SXCOFFARMAG]; /* This is the new format. */ struct xcoff_ar_file_hdr_big hdr; - bfd_size_type amt = SXCOFFARMAG; + size_t amt = SXCOFFARMAG; if (bfd_bread (magic, amt, abfd) != amt) { @@ -2056,7 +2059,7 @@ xcoff64_archive_p (bfd *abfd) return NULL; } - return abfd->xvec; + return _bfd_no_cleanup; } @@ -2121,7 +2124,7 @@ xcoff64_sizeof_headers (bfd *abfd, static asection * xcoff64_create_csect_from_smclas (bfd *abfd, union internal_auxent *aux, - const char *symbol_name) + const char *symbol_name) { asection *return_value = NULL; @@ -2147,7 +2150,7 @@ xcoff64_create_csect_from_smclas (bfd *abfd, union internal_auxent *aux, { _bfd_error_handler /* xgettext: c-format */ - (_("%B: symbol `%s' has unrecognized smclas %d"), + (_("%pB: symbol `%s' has unrecognized smclas %d"), abfd, symbol_name, aux->x_csect.x_smclas); bfd_set_error (bfd_error_bad_value); } @@ -2157,28 +2160,28 @@ xcoff64_create_csect_from_smclas (bfd *abfd, union internal_auxent *aux, static bfd_boolean xcoff64_is_lineno_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, - bfd_vma value ATTRIBUTE_UNUSED) + bfd_vma value ATTRIBUTE_UNUSED) { return FALSE; } static bfd_boolean xcoff64_is_reloc_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, - bfd_vma value ATTRIBUTE_UNUSED) + bfd_vma value ATTRIBUTE_UNUSED) { return FALSE; } static bfd_vma xcoff64_loader_symbol_offset (bfd *abfd ATTRIBUTE_UNUSED, - struct internal_ldhdr *ldhdr) + struct internal_ldhdr *ldhdr) { return (ldhdr->l_symoff); } static bfd_vma xcoff64_loader_reloc_offset (bfd *abfd ATTRIBUTE_UNUSED, - struct internal_ldhdr *ldhdr) + struct internal_ldhdr *ldhdr) { return (ldhdr->l_rldoff); } @@ -2200,7 +2203,7 @@ xcoff64_bad_format_hook (bfd * abfd, void *filehdr) static bfd_boolean xcoff64_generate_rtinit (bfd *abfd, const char *init, const char *fini, - bfd_boolean rtld) + bfd_boolean rtld) { bfd_byte filehdr_ext[FILHSZ]; bfd_byte scnhdr_ext[SCNHSZ * 3]; @@ -2694,22 +2697,22 @@ const bfd_target rs6000_xcoff64_vec = }, { /* bfd_set_format */ - bfd_false, + _bfd_bool_bfd_false_error, coff_mkobject, _bfd_generic_mkarchive, - bfd_false + _bfd_bool_bfd_false_error }, {/* bfd_write_contents */ - bfd_false, + _bfd_bool_bfd_false_error, xcoff64_write_object_contents, _bfd_xcoff_write_archive_contents, - bfd_false + _bfd_bool_bfd_false_error }, /* Generic */ _bfd_archive_close_and_cleanup, - bfd_true, + _bfd_bool_bfd_true, coff_new_section_hook, _bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window, @@ -2738,7 +2741,7 @@ const bfd_target rs6000_xcoff64_vec = xcoff64_openr_next_archived_file, _bfd_generic_get_elt_at_index, _bfd_xcoff_stat_arch_elt, - bfd_true, + _bfd_bool_bfd_true, /* Symbols */ coff_get_symtab_upper_bound, @@ -2783,9 +2786,11 @@ const bfd_target rs6000_xcoff64_vec = bfd_generic_lookup_section_flags, bfd_generic_merge_sections, bfd_generic_is_group_section, + bfd_generic_group_name, bfd_generic_discard_group, _bfd_generic_section_already_linked, _bfd_xcoff_define_common_symbol, + _bfd_generic_link_hide_symbol, bfd_generic_define_start_stop, /* Dynamic */ @@ -2801,7 +2806,7 @@ const bfd_target rs6000_xcoff64_vec = &bfd_xcoff_backend_data, }; -extern const bfd_target *xcoff64_core_p +extern bfd_cleanup xcoff64_core_p (bfd *); extern bfd_boolean xcoff64_core_file_matches_executable_p (bfd *, bfd *); @@ -2955,22 +2960,22 @@ const bfd_target rs6000_xcoff64_aix_vec = }, { /* bfd_set_format */ - bfd_false, + _bfd_bool_bfd_false_error, coff_mkobject, _bfd_generic_mkarchive, - bfd_false + _bfd_bool_bfd_false_error }, {/* bfd_write_contents */ - bfd_false, + _bfd_bool_bfd_false_error, xcoff64_write_object_contents, _bfd_xcoff_write_archive_contents, - bfd_false + _bfd_bool_bfd_false_error }, /* Generic */ _bfd_archive_close_and_cleanup, - bfd_true, + _bfd_bool_bfd_true, coff_new_section_hook, _bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window, @@ -2999,7 +3004,7 @@ const bfd_target rs6000_xcoff64_aix_vec = xcoff64_openr_next_archived_file, _bfd_generic_get_elt_at_index, _bfd_xcoff_stat_arch_elt, - bfd_true, + _bfd_bool_bfd_true, /* Symbols */ coff_get_symtab_upper_bound, @@ -3044,9 +3049,11 @@ const bfd_target rs6000_xcoff64_aix_vec = bfd_generic_lookup_section_flags, bfd_generic_merge_sections, bfd_generic_is_group_section, + bfd_generic_group_name, bfd_generic_discard_group, _bfd_generic_section_already_linked, _bfd_xcoff_define_common_symbol, + _bfd_generic_link_hide_symbol, bfd_generic_define_start_stop, /* Dynamic */