X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fxsym.c;h=65675e24910e22ef416fcae8dc992233406a336b;hb=8dbe7ca5a5755274fca1d3021ad648a1575e66cb;hp=ac5d80b61197aff179d5384260668abc9092b7b1;hpb=0af1713e7cd57b52f6c81f73aa58934132198880;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/xsym.c b/bfd/xsym.c index ac5d80b611..65675e2491 100644 --- a/bfd/xsym.c +++ b/bfd/xsym.c @@ -1,6 +1,5 @@ /* xSYM symbol-file support for BFD. - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 - Free Software Foundation, Inc. + Copyright (C) 1999-2015 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -19,7 +18,10 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +/* xSYM is the debugging format used by CodeWarrior on Mac OS classic. */ + #include "sysdep.h" +#include "alloca-conf.h" #include "xsym.h" #include "bfd.h" #include "libbfd.h" @@ -31,7 +33,9 @@ #define bfd_sym_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false) #define bfd_sym_get_lineno _bfd_nosymbols_get_lineno #define bfd_sym_find_nearest_line _bfd_nosymbols_find_nearest_line +#define bfd_sym_find_line _bfd_nosymbols_find_line #define bfd_sym_find_inliner_info _bfd_nosymbols_find_inliner_info +#define bfd_sym_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string #define bfd_sym_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol #define bfd_sym_read_minisymbols _bfd_generic_read_minisymbols #define bfd_sym_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol @@ -41,14 +45,17 @@ #define bfd_sym_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents #define bfd_sym_bfd_relax_section bfd_generic_relax_section #define bfd_sym_bfd_gc_sections bfd_generic_gc_sections +#define bfd_sym_bfd_lookup_section_flags bfd_generic_lookup_section_flags #define bfd_sym_bfd_merge_sections bfd_generic_merge_sections #define bfd_sym_bfd_is_group_section bfd_generic_is_group_section #define bfd_sym_bfd_discard_group bfd_generic_discard_group #define bfd_sym_section_already_linked _bfd_generic_section_already_linked +#define bfd_sym_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_sym_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define bfd_sym_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define bfd_sym_bfd_link_add_symbols _bfd_generic_link_add_symbols #define bfd_sym_bfd_link_just_syms _bfd_generic_link_just_syms +#define bfd_sym_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define bfd_sym_bfd_final_link _bfd_generic_final_link #define bfd_sym_bfd_link_split_section _bfd_generic_link_split_section #define bfd_sym_get_section_contents_in_window _bfd_generic_get_section_contents_in_window @@ -80,11 +87,11 @@ static unsigned long compute_offset (unsigned long first_page, unsigned long page_size, unsigned long entry_size, - unsigned long index) + unsigned long sym_index) { unsigned long entries_per_page = page_size / entry_size; - unsigned long page_number = first_page + (index / entries_per_page); - unsigned long page_offset = (index % entries_per_page) * entry_size; + unsigned long page_number = first_page + (sym_index / entries_per_page); + unsigned long page_offset = (sym_index % entries_per_page) * entry_size; return (page_number * page_size) + page_offset; } @@ -526,7 +533,7 @@ bfd_sym_parse_type_table_entry_v32 (unsigned char *buf, int bfd_sym_fetch_resources_table_entry (bfd *abfd, bfd_sym_resources_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_resources_table_entry *); unsigned long offset; @@ -538,7 +545,7 @@ bfd_sym_fetch_resources_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -562,7 +569,7 @@ bfd_sym_fetch_resources_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_rte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -577,7 +584,7 @@ bfd_sym_fetch_resources_table_entry (bfd *abfd, int bfd_sym_fetch_modules_table_entry (bfd *abfd, bfd_sym_modules_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_modules_table_entry *); unsigned long offset; @@ -589,7 +596,7 @@ bfd_sym_fetch_modules_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -613,7 +620,7 @@ bfd_sym_fetch_modules_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_mte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -628,7 +635,7 @@ bfd_sym_fetch_modules_table_entry (bfd *abfd, int bfd_sym_fetch_file_references_table_entry (bfd *abfd, bfd_sym_file_references_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_file_references_table_entry *); unsigned long offset; @@ -640,7 +647,7 @@ bfd_sym_fetch_file_references_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -663,7 +670,7 @@ bfd_sym_fetch_file_references_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_frte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -678,7 +685,7 @@ bfd_sym_fetch_file_references_table_entry (bfd *abfd, int bfd_sym_fetch_contained_modules_table_entry (bfd *abfd, bfd_sym_contained_modules_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_contained_modules_table_entry *); unsigned long offset; @@ -690,7 +697,7 @@ bfd_sym_fetch_contained_modules_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -713,7 +720,7 @@ bfd_sym_fetch_contained_modules_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_cmte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -728,7 +735,7 @@ bfd_sym_fetch_contained_modules_table_entry (bfd *abfd, int bfd_sym_fetch_contained_variables_table_entry (bfd *abfd, bfd_sym_contained_variables_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_contained_variables_table_entry *); unsigned long offset; @@ -740,7 +747,7 @@ bfd_sym_fetch_contained_variables_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -763,7 +770,7 @@ bfd_sym_fetch_contained_variables_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_cvte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -778,7 +785,7 @@ bfd_sym_fetch_contained_variables_table_entry (bfd *abfd, int bfd_sym_fetch_contained_statements_table_entry (bfd *abfd, bfd_sym_contained_statements_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_contained_statements_table_entry *); unsigned long offset; @@ -790,7 +797,7 @@ bfd_sym_fetch_contained_statements_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -813,7 +820,7 @@ bfd_sym_fetch_contained_statements_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_csnte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -828,7 +835,7 @@ bfd_sym_fetch_contained_statements_table_entry (bfd *abfd, int bfd_sym_fetch_contained_labels_table_entry (bfd *abfd, bfd_sym_contained_labels_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_contained_labels_table_entry *); unsigned long offset; @@ -840,7 +847,7 @@ bfd_sym_fetch_contained_labels_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -863,7 +870,7 @@ bfd_sym_fetch_contained_labels_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_clte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -878,7 +885,7 @@ bfd_sym_fetch_contained_labels_table_entry (bfd *abfd, int bfd_sym_fetch_contained_types_table_entry (bfd *abfd, bfd_sym_contained_types_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_contained_types_table_entry *); unsigned long offset; @@ -890,7 +897,7 @@ bfd_sym_fetch_contained_types_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -913,7 +920,7 @@ bfd_sym_fetch_contained_types_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_ctte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -928,7 +935,7 @@ bfd_sym_fetch_contained_types_table_entry (bfd *abfd, int bfd_sym_fetch_file_references_index_table_entry (bfd *abfd, bfd_sym_file_references_index_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_file_references_index_table_entry *); unsigned long offset; @@ -940,7 +947,7 @@ bfd_sym_fetch_file_references_index_table_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -963,7 +970,7 @@ bfd_sym_fetch_file_references_index_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_fite.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -978,7 +985,7 @@ bfd_sym_fetch_file_references_index_table_entry (bfd *abfd, int bfd_sym_fetch_constant_pool_entry (bfd *abfd, bfd_sym_constant_pool_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_constant_pool_entry *); unsigned long offset; @@ -990,7 +997,7 @@ bfd_sym_fetch_constant_pool_entry (bfd *abfd, BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return -1; switch (sdata->version) @@ -1013,7 +1020,7 @@ bfd_sym_fetch_constant_pool_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_fite.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -1028,7 +1035,7 @@ bfd_sym_fetch_constant_pool_entry (bfd *abfd, int bfd_sym_fetch_type_table_entry (bfd *abfd, bfd_sym_type_table_entry *entry, - unsigned long index) + unsigned long sym_index) { void (*parser) (unsigned char *, size_t, bfd_sym_type_table_entry *); unsigned long offset; @@ -1060,7 +1067,7 @@ bfd_sym_fetch_type_table_entry (bfd *abfd, offset = compute_offset (sdata->header.dshb_tte.dti_first_page, sdata->header.dshb_page_size, - entry_size, index); + entry_size, sym_index); if (bfd_seek (abfd, offset, SEEK_SET) < 0) return -1; @@ -1078,10 +1085,8 @@ bfd_sym_fetch_type_information_table_entry (bfd *abfd, unsigned long offset) { unsigned char buf[4]; - bfd_sym_data_struct *sdata = NULL; BFD_ASSERT (bfd_sym_valid (abfd)); - sdata = abfd->tdata.sym_data; if (offset == 0) return -1; @@ -1120,7 +1125,7 @@ bfd_sym_fetch_type_information_table_entry (bfd *abfd, int bfd_sym_fetch_type_table_information (bfd *abfd, bfd_sym_type_information_table_entry *entry, - unsigned long index) + unsigned long sym_index) { bfd_sym_type_table_entry tindex; bfd_sym_data_struct *sdata = NULL; @@ -1130,10 +1135,10 @@ bfd_sym_fetch_type_table_information (bfd *abfd, if (sdata->header.dshb_tte.dti_object_count <= 99) return -1; - if (index < 100) + if (sym_index < 100) return -1; - if (bfd_sym_fetch_type_table_entry (abfd, &tindex, index - 100) < 0) + if (bfd_sym_fetch_type_table_entry (abfd, &tindex, sym_index - 100) < 0) return -1; if (bfd_sym_fetch_type_information_table_entry (abfd, entry, tindex) < 0) return -1; @@ -1142,30 +1147,30 @@ bfd_sym_fetch_type_table_information (bfd *abfd, } const unsigned char * -bfd_sym_symbol_name (bfd *abfd, unsigned long index) +bfd_sym_symbol_name (bfd *abfd, unsigned long sym_index) { bfd_sym_data_struct *sdata = NULL; BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - if (index == 0) + if (sym_index == 0) return (const unsigned char *) ""; - index *= 2; - if ((index / sdata->header.dshb_page_size) + sym_index *= 2; + if ((sym_index / sdata->header.dshb_page_size) > sdata->header.dshb_nte.dti_page_count) return (const unsigned char *) "\09[INVALID]"; - return (const unsigned char *) sdata->name_table + index; + return (const unsigned char *) sdata->name_table + sym_index; } const unsigned char * -bfd_sym_module_name (bfd *abfd, unsigned long index) +bfd_sym_module_name (bfd *abfd, unsigned long sym_index) { bfd_sym_modules_table_entry entry; - if (bfd_sym_fetch_modules_table_entry (abfd, &entry, index) < 0) + if (bfd_sym_fetch_modules_table_entry (abfd, &entry, sym_index) < 0) return (const unsigned char *) "\09[INVALID]"; return bfd_sym_symbol_name (abfd, entry.mte_nte_index); @@ -1855,24 +1860,24 @@ bfd_sym_display_name_table_entry (bfd *abfd, FILE *f, unsigned char *entry) { - unsigned long index; + unsigned long sym_index; unsigned long offset; bfd_sym_data_struct *sdata = NULL; BFD_ASSERT (bfd_sym_valid (abfd)); sdata = abfd->tdata.sym_data; - index = (entry - sdata->name_table) / 2; + sym_index = (entry - sdata->name_table) / 2; if (sdata->version >= BFD_SYM_VERSION_3_4 && entry[0] == 255 && entry[1] == 0) { unsigned short length = bfd_getb16 (entry + 2); - fprintf (f, "[%8lu] \"%.*s\"\n", index, length, entry + 4); + fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, length, entry + 4); offset = 2 + length + 1; } else { if (! (entry[0] == 0 || (entry[0] == 1 && entry[1] == '\0'))) - fprintf (f, "[%8lu] \"%.*s\"\n", index, entry[0], entry + 1); + fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, entry[0], entry + 1); if (sdata->version >= BFD_SYM_VERSION_3_4) offset = entry[0] + 2; @@ -2174,7 +2179,7 @@ void bfd_sym_display_type_information_table (bfd *abfd, FILE *f) { unsigned long i; - bfd_sym_type_table_entry index; + bfd_sym_type_table_entry sym_index; bfd_sym_type_information_table_entry entry; bfd_sym_data_struct *sdata = NULL; @@ -2192,13 +2197,13 @@ bfd_sym_display_type_information_table (bfd *abfd, FILE *f) for (i = 100; i <= sdata->header.dshb_tte.dti_object_count; i++) { - if (bfd_sym_fetch_type_table_entry (abfd, &index, i - 100) < 0) + if (bfd_sym_fetch_type_table_entry (abfd, &sym_index, i - 100) < 0) fprintf (f, " [%8lu] [INVALID]\n", i); else { - fprintf (f, " [%8lu] (TINFO %lu) ", i, index); + fprintf (f, " [%8lu] (TINFO %lu) ", i, sym_index); - if (bfd_sym_fetch_type_information_table_entry (abfd, &entry, index) < 0) + if (bfd_sym_fetch_type_information_table_entry (abfd, &entry, sym_index) < 0) fprintf (f, "[INVALID]"); else bfd_sym_print_type_information_table_entry (abfd, f, &entry); @@ -2244,32 +2249,26 @@ bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata) const bfd_target * bfd_sym_object_p (bfd *abfd) { - struct bfd_preserve preserve; bfd_sym_version version = -1; + bfd_sym_data_struct *mdata; - preserve.marker = NULL; bfd_seek (abfd, 0, SEEK_SET); if (bfd_sym_read_version (abfd, &version) != 0) goto wrong; - preserve.marker = bfd_alloc (abfd, sizeof (bfd_sym_data_struct)); - if (preserve.marker == NULL - || ! bfd_preserve_save (abfd, &preserve)) + mdata = (bfd_sym_data_struct *) bfd_alloc (abfd, sizeof (*mdata)); + if (mdata == NULL) goto fail; - if (bfd_sym_scan (abfd, version, - (bfd_sym_data_struct *) preserve.marker) != 0) + if (bfd_sym_scan (abfd, version, mdata) != 0) goto wrong; - bfd_preserve_finish (abfd, &preserve); return abfd->xvec; wrong: bfd_set_error (bfd_error_wrong_format); fail: - if (preserve.marker != NULL) - bfd_preserve_restore (abfd, &preserve); return NULL; } @@ -2314,6 +2313,7 @@ const bfd_target sym_vec = 0, /* Symbol_leading_char. */ ' ', /* AR_pad_char. */ 16, /* AR_max_namelen. */ + 0, /* match priority. */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */