Home | History | Annotate | Download | only in bfd
      1 /* xSYM symbol-file support for BFD.
      2    Copyright (C) 1999-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 /* xSYM is the debugging format used by CodeWarrior on Mac OS classic.  */
     22 
     23 #include "sysdep.h"
     24 #include "alloca-conf.h"
     25 #include "xsym.h"
     26 #include "bfd.h"
     27 #include "libbfd.h"
     28 
     29 #define bfd_sym_close_and_cleanup                   _bfd_generic_close_and_cleanup
     30 #define bfd_sym_bfd_free_cached_info                _bfd_generic_bfd_free_cached_info
     31 #define bfd_sym_new_section_hook                    _bfd_generic_new_section_hook
     32 #define bfd_sym_bfd_is_local_label_name             bfd_generic_is_local_label_name
     33 #define bfd_sym_bfd_is_target_special_symbol       ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
     34 #define bfd_sym_get_lineno                          _bfd_nosymbols_get_lineno
     35 #define bfd_sym_find_nearest_line                   _bfd_nosymbols_find_nearest_line
     36 #define bfd_sym_find_line                           _bfd_nosymbols_find_line
     37 #define bfd_sym_find_inliner_info                   _bfd_nosymbols_find_inliner_info
     38 #define bfd_sym_bfd_make_debug_symbol               _bfd_nosymbols_bfd_make_debug_symbol
     39 #define bfd_sym_read_minisymbols                    _bfd_generic_read_minisymbols
     40 #define bfd_sym_minisymbol_to_symbol                _bfd_generic_minisymbol_to_symbol
     41 #define bfd_sym_set_arch_mach                       _bfd_generic_set_arch_mach
     42 #define bfd_sym_get_section_contents                _bfd_generic_get_section_contents
     43 #define bfd_sym_set_section_contents                _bfd_generic_set_section_contents
     44 #define bfd_sym_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
     45 #define bfd_sym_bfd_relax_section                   bfd_generic_relax_section
     46 #define bfd_sym_bfd_gc_sections                     bfd_generic_gc_sections
     47 #define bfd_sym_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
     48 #define bfd_sym_bfd_merge_sections                  bfd_generic_merge_sections
     49 #define bfd_sym_bfd_is_group_section                bfd_generic_is_group_section
     50 #define bfd_sym_bfd_discard_group                   bfd_generic_discard_group
     51 #define bfd_sym_section_already_linked              _bfd_generic_section_already_linked
     52 #define bfd_sym_bfd_define_common_symbol            bfd_generic_define_common_symbol
     53 #define bfd_sym_bfd_link_hash_table_create          _bfd_generic_link_hash_table_create
     54 #define bfd_sym_bfd_link_add_symbols                _bfd_generic_link_add_symbols
     55 #define bfd_sym_bfd_link_just_syms                  _bfd_generic_link_just_syms
     56 #define bfd_sym_bfd_copy_link_hash_symbol_type \
     57   _bfd_generic_copy_link_hash_symbol_type
     58 #define bfd_sym_bfd_final_link                      _bfd_generic_final_link
     59 #define bfd_sym_bfd_link_split_section              _bfd_generic_link_split_section
     60 #define bfd_sym_get_section_contents_in_window      _bfd_generic_get_section_contents_in_window
     61 
     62 extern const bfd_target sym_vec;
     63 
     64 static int
     65 pstrcmp (const char *as, const char *bs)
     66 {
     67   const unsigned char *a = (const unsigned char *) as;
     68   const unsigned char *b = (const unsigned char *) bs;
     69   unsigned char clen;
     70   int ret;
     71 
     72   clen = (a[0] > b[0]) ? b[0] : a[0];
     73   ret = memcmp (a + 1, b + 1, clen);
     74   if (ret != 0)
     75     return ret;
     76 
     77   if (a[0] == b[0])
     78     return 0;
     79   else if (a[0] < b[0])
     80     return -1;
     81   else
     82     return 1;
     83 }
     84 
     85 static unsigned long
     86 compute_offset (unsigned long first_page,
     87 		unsigned long page_size,
     88 		unsigned long entry_size,
     89 		unsigned long sym_index)
     90 {
     91   unsigned long entries_per_page = page_size / entry_size;
     92   unsigned long page_number = first_page + (sym_index / entries_per_page);
     93   unsigned long page_offset = (sym_index % entries_per_page) * entry_size;
     94 
     95   return (page_number * page_size) + page_offset;
     96 }
     97 
     98 bfd_boolean
     99 bfd_sym_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
    100 {
    101   return 1;
    102 }
    103 
    104 void
    105 bfd_sym_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
    106 		      void * afile ATTRIBUTE_UNUSED,
    107 		      asymbol *symbol ATTRIBUTE_UNUSED,
    108 		      bfd_print_symbol_type how ATTRIBUTE_UNUSED)
    109 {
    110   return;
    111 }
    112 
    113 bfd_boolean
    114 bfd_sym_valid (bfd *abfd)
    115 {
    116   if (abfd == NULL || abfd->xvec == NULL)
    117     return 0;
    118 
    119   return abfd->xvec == &sym_vec;
    120 }
    121 
    122 unsigned char *
    123 bfd_sym_read_name_table (bfd *abfd, bfd_sym_header_block *dshb)
    124 {
    125   unsigned char *rstr;
    126   long ret;
    127   size_t table_size = dshb->dshb_nte.dti_page_count * dshb->dshb_page_size;
    128   size_t table_offset = dshb->dshb_nte.dti_first_page * dshb->dshb_page_size;
    129 
    130   rstr = bfd_alloc (abfd, table_size);
    131   if (rstr == NULL)
    132     return rstr;
    133 
    134   bfd_seek (abfd, table_offset, SEEK_SET);
    135   ret = bfd_bread (rstr, table_size, abfd);
    136   if (ret < 0 || (unsigned long) ret != table_size)
    137     {
    138       bfd_release (abfd, rstr);
    139       return NULL;
    140     }
    141 
    142   return rstr;
    143 }
    144 
    145 void
    146 bfd_sym_parse_file_reference_v32 (unsigned char *buf,
    147 				  size_t len,
    148 				  bfd_sym_file_reference *entry)
    149 {
    150   BFD_ASSERT (len == 6);
    151 
    152   entry->fref_frte_index = bfd_getb16 (buf);
    153   entry->fref_offset = bfd_getb32 (buf + 2);
    154 }
    155 
    156 void
    157 bfd_sym_parse_disk_table_v32 (unsigned char *buf,
    158 			      size_t len,
    159 			      bfd_sym_table_info *table)
    160 {
    161   BFD_ASSERT (len == 8);
    162 
    163   table->dti_first_page = bfd_getb16 (buf);
    164   table->dti_page_count = bfd_getb16 (buf + 2);
    165   table->dti_object_count = bfd_getb32 (buf + 4);
    166 }
    167 
    168 void
    169 bfd_sym_parse_header_v32 (unsigned char *buf,
    170 			  size_t len,
    171 			  bfd_sym_header_block *header)
    172 {
    173   BFD_ASSERT (len == 154);
    174 
    175   memcpy (header->dshb_id, buf, 32);
    176   header->dshb_page_size = bfd_getb16 (buf + 32);
    177   header->dshb_hash_page = bfd_getb16 (buf + 34);
    178   header->dshb_root_mte = bfd_getb16 (buf + 36);
    179   header->dshb_mod_date = bfd_getb32 (buf + 38);
    180 
    181   bfd_sym_parse_disk_table_v32 (buf + 42, 8, &header->dshb_frte);
    182   bfd_sym_parse_disk_table_v32 (buf + 50, 8, &header->dshb_rte);
    183   bfd_sym_parse_disk_table_v32 (buf + 58, 8, &header->dshb_mte);
    184   bfd_sym_parse_disk_table_v32 (buf + 66, 8, &header->dshb_cmte);
    185   bfd_sym_parse_disk_table_v32 (buf + 74, 8, &header->dshb_cvte);
    186   bfd_sym_parse_disk_table_v32 (buf + 82, 8, &header->dshb_csnte);
    187   bfd_sym_parse_disk_table_v32 (buf + 90, 8, &header->dshb_clte);
    188   bfd_sym_parse_disk_table_v32 (buf + 98, 8, &header->dshb_ctte);
    189   bfd_sym_parse_disk_table_v32 (buf + 106, 8, &header->dshb_tte);
    190   bfd_sym_parse_disk_table_v32 (buf + 114, 8, &header->dshb_nte);
    191   bfd_sym_parse_disk_table_v32 (buf + 122, 8, &header->dshb_tinfo);
    192   bfd_sym_parse_disk_table_v32 (buf + 130, 8, &header->dshb_fite);
    193   bfd_sym_parse_disk_table_v32 (buf + 138, 8, &header->dshb_const);
    194 
    195   memcpy (&header->dshb_file_creator, buf + 146, 4);
    196   memcpy (&header->dshb_file_type, buf + 150, 4);
    197 }
    198 
    199 int
    200 bfd_sym_read_header_v32 (bfd *abfd, bfd_sym_header_block *header)
    201 {
    202   unsigned char buf[154];
    203   long ret;
    204 
    205   ret = bfd_bread (buf, 154, abfd);
    206   if (ret != 154)
    207     return -1;
    208 
    209   bfd_sym_parse_header_v32 (buf, 154, header);
    210 
    211   return 0;
    212 }
    213 
    214 int
    215 bfd_sym_read_header_v34 (bfd *abfd ATTRIBUTE_UNUSED,
    216 			 bfd_sym_header_block *header ATTRIBUTE_UNUSED)
    217 {
    218   abort ();
    219 }
    220 
    221 int
    222 bfd_sym_read_header (bfd *abfd,
    223 		     bfd_sym_header_block *header,
    224 		     bfd_sym_version version)
    225 {
    226   switch (version)
    227     {
    228     case BFD_SYM_VERSION_3_5:
    229     case BFD_SYM_VERSION_3_4:
    230       return bfd_sym_read_header_v34 (abfd, header);
    231     case BFD_SYM_VERSION_3_3:
    232     case BFD_SYM_VERSION_3_2:
    233       return bfd_sym_read_header_v32 (abfd, header);
    234     case BFD_SYM_VERSION_3_1:
    235     default:
    236       return 0;
    237     }
    238 }
    239 
    240 int
    241 bfd_sym_read_version (bfd *abfd, bfd_sym_version *version)
    242 {
    243   char version_string[32];
    244   long ret;
    245 
    246   ret = bfd_bread (version_string, sizeof (version_string), abfd);
    247   if (ret != sizeof (version_string))
    248     return -1;
    249 
    250   if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_1) == 0)
    251     *version = BFD_SYM_VERSION_3_1;
    252   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_2) == 0)
    253     *version = BFD_SYM_VERSION_3_2;
    254   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_3) == 0)
    255     *version = BFD_SYM_VERSION_3_3;
    256   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_4) == 0)
    257     *version = BFD_SYM_VERSION_3_4;
    258   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_5) == 0)
    259     *version = BFD_SYM_VERSION_3_5;
    260   else
    261     return -1;
    262 
    263   return 0;
    264 }
    265 
    266 void
    267 bfd_sym_display_table_summary (FILE *f,
    268 			       bfd_sym_table_info *dti,
    269 			       const char *name)
    270 {
    271   fprintf (f, "%-6s %13ld %13ld %13ld\n",
    272 	   name,
    273 	   dti->dti_first_page,
    274 	   dti->dti_page_count,
    275 	   dti->dti_object_count);
    276 }
    277 
    278 void
    279 bfd_sym_display_header (FILE *f, bfd_sym_header_block *dshb)
    280 {
    281   fprintf (f, "            Version: %.*s\n", dshb->dshb_id[0], dshb->dshb_id + 1);
    282   fprintf (f, "          Page Size: 0x%x\n", dshb->dshb_page_size);
    283   fprintf (f, "          Hash Page: %lu\n", dshb->dshb_hash_page);
    284   fprintf (f, "           Root MTE: %lu\n", dshb->dshb_root_mte);
    285   fprintf (f, "  Modification Date: ");
    286   fprintf (f, "[unimplemented]");
    287   fprintf (f, " (0x%lx)\n", dshb->dshb_mod_date);
    288 
    289   fprintf (f, "       File Creator:  %.4s  Type: %.4s\n\n",
    290 	   dshb->dshb_file_creator, dshb->dshb_file_type);
    291 
    292   fprintf (f, "Table Name   First Page    Page Count   Object Count\n");
    293   fprintf (f, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    294 
    295   bfd_sym_display_table_summary (f, &dshb->dshb_nte, "NTE");
    296   bfd_sym_display_table_summary (f, &dshb->dshb_rte, "RTE");
    297   bfd_sym_display_table_summary (f, &dshb->dshb_mte, "MTE");
    298   bfd_sym_display_table_summary (f, &dshb->dshb_frte, "FRTE");
    299   bfd_sym_display_table_summary (f, &dshb->dshb_cmte, "CMTE");
    300   bfd_sym_display_table_summary (f, &dshb->dshb_cvte, "CVTE");
    301   bfd_sym_display_table_summary (f, &dshb->dshb_csnte, "CSNTE");
    302   bfd_sym_display_table_summary (f, &dshb->dshb_clte, "CLTE");
    303   bfd_sym_display_table_summary (f, &dshb->dshb_ctte, "CTTE");
    304   bfd_sym_display_table_summary (f, &dshb->dshb_tte, "TTE");
    305   bfd_sym_display_table_summary (f, &dshb->dshb_tinfo, "TINFO");
    306   bfd_sym_display_table_summary (f, &dshb->dshb_fite, "FITE");
    307   bfd_sym_display_table_summary (f, &dshb->dshb_const, "CONST");
    308 
    309   fprintf (f, "\n");
    310 }
    311 
    312 void
    313 bfd_sym_parse_resources_table_entry_v32 (unsigned char *buf,
    314 					 size_t len,
    315 					 bfd_sym_resources_table_entry *entry)
    316 {
    317   BFD_ASSERT (len == 18);
    318 
    319   memcpy (&entry->rte_res_type, buf, 4);
    320   entry->rte_res_number = bfd_getb16 (buf + 4);
    321   entry->rte_nte_index = bfd_getb32 (buf + 6);
    322   entry->rte_mte_first = bfd_getb16 (buf + 10);
    323   entry->rte_mte_last = bfd_getb16 (buf + 12);
    324   entry->rte_res_size = bfd_getb32 (buf + 14);
    325 }
    326 
    327 void
    328 bfd_sym_parse_modules_table_entry_v33 (unsigned char *buf,
    329 				       size_t len,
    330 				       bfd_sym_modules_table_entry *entry)
    331 {
    332   BFD_ASSERT (len == 46);
    333 
    334   entry->mte_rte_index = bfd_getb16 (buf);
    335   entry->mte_res_offset = bfd_getb32 (buf + 2);
    336   entry->mte_size = bfd_getb32 (buf + 6);
    337   entry->mte_kind = buf[10];
    338   entry->mte_scope = buf[11];
    339   entry->mte_parent = bfd_getb16 (buf + 12);
    340   bfd_sym_parse_file_reference_v32 (buf + 14, 6, &entry->mte_imp_fref);
    341   entry->mte_imp_end = bfd_getb32 (buf + 20);
    342   entry->mte_nte_index = bfd_getb32 (buf + 24);
    343   entry->mte_cmte_index = bfd_getb16 (buf + 28);
    344   entry->mte_cvte_index = bfd_getb32 (buf + 30);
    345   entry->mte_clte_index = bfd_getb16 (buf + 34);
    346   entry->mte_ctte_index = bfd_getb16 (buf + 36);
    347   entry->mte_csnte_idx_1 = bfd_getb32 (buf + 38);
    348   entry->mte_csnte_idx_2 = bfd_getb32 (buf + 42);
    349 }
    350 
    351 void
    352 bfd_sym_parse_file_references_table_entry_v32 (unsigned char *buf,
    353 					       size_t len,
    354 					       bfd_sym_file_references_table_entry *entry)
    355 {
    356   unsigned int type;
    357 
    358   BFD_ASSERT (len == 10);
    359 
    360   memset (entry, 0, sizeof (bfd_sym_file_references_table_entry));
    361   type = bfd_getb16 (buf);
    362 
    363   switch (type)
    364     {
    365     case BFD_SYM_END_OF_LIST_3_2:
    366       entry->generic.type = BFD_SYM_END_OF_LIST;
    367       break;
    368 
    369     case BFD_SYM_FILE_NAME_INDEX_3_2:
    370       entry->filename.type = BFD_SYM_FILE_NAME_INDEX;
    371       entry->filename.nte_index = bfd_getb32 (buf + 2);
    372       entry->filename.mod_date = bfd_getb32 (buf + 6);
    373       break;
    374 
    375     default:
    376       entry->entry.mte_index = type;
    377       entry->entry.file_offset = bfd_getb32 (buf + 2);
    378     }
    379 }
    380 
    381 void
    382 bfd_sym_parse_contained_modules_table_entry_v32 (unsigned char *buf,
    383 						 size_t len,
    384 						 bfd_sym_contained_modules_table_entry *entry)
    385 {
    386   unsigned int type;
    387 
    388   BFD_ASSERT (len == 6);
    389 
    390   memset (entry, 0, sizeof (bfd_sym_contained_modules_table_entry));
    391   type = bfd_getb16 (buf);
    392 
    393   switch (type)
    394     {
    395     case BFD_SYM_END_OF_LIST_3_2:
    396       entry->generic.type = BFD_SYM_END_OF_LIST;
    397       break;
    398 
    399     default:
    400       entry->entry.mte_index = type;
    401       entry->entry.nte_index = bfd_getb32 (buf + 2);
    402       break;
    403     }
    404 }
    405 
    406 void
    407 bfd_sym_parse_contained_variables_table_entry_v32 (unsigned char *buf,
    408 						   size_t len,
    409 						   bfd_sym_contained_variables_table_entry *entry)
    410 {
    411   unsigned int type;
    412 
    413   BFD_ASSERT (len == 26);
    414 
    415   memset (entry, 0, sizeof (bfd_sym_contained_variables_table_entry));
    416   type = bfd_getb16 (buf);
    417 
    418   switch (type)
    419     {
    420     case BFD_SYM_END_OF_LIST_3_2:
    421       entry->generic.type = BFD_SYM_END_OF_LIST;
    422       break;
    423 
    424     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
    425       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
    426       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
    427       break;
    428 
    429     default:
    430       entry->entry.tte_index = type;
    431       entry->entry.nte_index = bfd_getb32 (buf + 2);
    432       entry->entry.file_delta = bfd_getb16 (buf + 6);
    433       entry->entry.scope = buf[8];
    434       entry->entry.la_size = buf[9];
    435 
    436       if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
    437 	{
    438 	  entry->entry.address.scstruct.sca_kind = buf[10];
    439 	  entry->entry.address.scstruct.sca_class = buf[11];
    440 	  entry->entry.address.scstruct.sca_offset = bfd_getb32 (buf + 12);
    441 	}
    442       else if (entry->entry.la_size <= BFD_SYM_CVTE_SCA)
    443 	{
    444 #if BFD_SYM_CVTE_SCA > 0
    445 	  memcpy (&entry->entry.address.lastruct.la, buf + 10,
    446 		  BFD_SYM_CVTE_SCA);
    447 #endif
    448 	  entry->entry.address.lastruct.la_kind = buf[23];
    449 	}
    450       else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
    451 	{
    452 	  entry->entry.address.biglastruct.big_la = bfd_getb32 (buf + 10);
    453 	  entry->entry.address.biglastruct.big_la_kind = buf[12];
    454 	}
    455     }
    456 }
    457 
    458 void
    459 bfd_sym_parse_contained_statements_table_entry_v32 (unsigned char *buf,
    460 						    size_t len,
    461 						    bfd_sym_contained_statements_table_entry *entry)
    462 {
    463   unsigned int type;
    464 
    465   BFD_ASSERT (len == 8);
    466 
    467   memset (entry, 0, sizeof (bfd_sym_contained_statements_table_entry));
    468   type = bfd_getb16 (buf);
    469 
    470   switch (type)
    471     {
    472     case BFD_SYM_END_OF_LIST_3_2:
    473       entry->generic.type = BFD_SYM_END_OF_LIST;
    474       break;
    475 
    476     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
    477       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
    478       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
    479       break;
    480 
    481     default:
    482       entry->entry.mte_index = type;
    483       entry->entry.mte_offset = bfd_getb16 (buf + 2);
    484       entry->entry.file_delta = bfd_getb32 (buf + 4);
    485       break;
    486     }
    487 }
    488 
    489 void
    490 bfd_sym_parse_contained_labels_table_entry_v32 (unsigned char *buf,
    491 						size_t len,
    492 						bfd_sym_contained_labels_table_entry *entry)
    493 {
    494   unsigned int type;
    495 
    496   BFD_ASSERT (len == 12);
    497 
    498   memset (entry, 0, sizeof (bfd_sym_contained_labels_table_entry));
    499   type = bfd_getb16 (buf);
    500 
    501   switch (type)
    502     {
    503     case BFD_SYM_END_OF_LIST_3_2:
    504       entry->generic.type = BFD_SYM_END_OF_LIST;
    505       break;
    506 
    507     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
    508       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
    509       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
    510       break;
    511 
    512     default:
    513       entry->entry.mte_index = type;
    514       entry->entry.mte_offset = bfd_getb16 (buf + 2);
    515       entry->entry.nte_index = bfd_getb32 (buf + 4);
    516       entry->entry.file_delta = bfd_getb16 (buf + 8);
    517       entry->entry.scope = bfd_getb16 (buf + 10);
    518       break;
    519     }
    520 }
    521 
    522 void
    523 bfd_sym_parse_type_table_entry_v32 (unsigned char *buf,
    524 				    size_t len,
    525 				    bfd_sym_type_table_entry *entry)
    526 {
    527   BFD_ASSERT (len == 4);
    528 
    529   *entry = bfd_getb32 (buf);
    530 }
    531 
    532 int
    533 bfd_sym_fetch_resources_table_entry (bfd *abfd,
    534 				     bfd_sym_resources_table_entry *entry,
    535 				     unsigned long sym_index)
    536 {
    537   void (*parser) (unsigned char *, size_t, bfd_sym_resources_table_entry *);
    538   unsigned long offset;
    539   unsigned long entry_size;
    540   unsigned char buf[18];
    541   bfd_sym_data_struct *sdata = NULL;
    542 
    543   parser = NULL;
    544   BFD_ASSERT (bfd_sym_valid (abfd));
    545   sdata = abfd->tdata.sym_data;
    546 
    547   if (sym_index == 0)
    548     return -1;
    549 
    550   switch (sdata->version)
    551     {
    552     case BFD_SYM_VERSION_3_5:
    553     case BFD_SYM_VERSION_3_4:
    554       return -1;
    555 
    556     case BFD_SYM_VERSION_3_3:
    557     case BFD_SYM_VERSION_3_2:
    558       entry_size = 18;
    559       parser = bfd_sym_parse_resources_table_entry_v32;
    560       break;
    561 
    562     case BFD_SYM_VERSION_3_1:
    563     default:
    564       return -1;
    565     }
    566   if (parser == NULL)
    567     return -1;
    568 
    569   offset = compute_offset (sdata->header.dshb_rte.dti_first_page,
    570 			   sdata->header.dshb_page_size,
    571 			   entry_size, sym_index);
    572 
    573   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    574     return -1;
    575   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    576     return -1;
    577 
    578   (*parser) (buf, entry_size, entry);
    579 
    580   return 0;
    581 }
    582 
    583 int
    584 bfd_sym_fetch_modules_table_entry (bfd *abfd,
    585 				   bfd_sym_modules_table_entry *entry,
    586 				   unsigned long sym_index)
    587 {
    588   void (*parser) (unsigned char *, size_t, bfd_sym_modules_table_entry *);
    589   unsigned long offset;
    590   unsigned long entry_size;
    591   unsigned char buf[46];
    592   bfd_sym_data_struct *sdata = NULL;
    593 
    594   parser = NULL;
    595   BFD_ASSERT (bfd_sym_valid (abfd));
    596   sdata = abfd->tdata.sym_data;
    597 
    598   if (sym_index == 0)
    599     return -1;
    600 
    601   switch (sdata->version)
    602     {
    603     case BFD_SYM_VERSION_3_5:
    604     case BFD_SYM_VERSION_3_4:
    605       return -1;
    606 
    607     case BFD_SYM_VERSION_3_3:
    608       entry_size = 46;
    609       parser = bfd_sym_parse_modules_table_entry_v33;
    610       break;
    611 
    612     case BFD_SYM_VERSION_3_2:
    613     case BFD_SYM_VERSION_3_1:
    614     default:
    615       return -1;
    616     }
    617   if (parser == NULL)
    618     return -1;
    619 
    620   offset = compute_offset (sdata->header.dshb_mte.dti_first_page,
    621 			   sdata->header.dshb_page_size,
    622 			   entry_size, sym_index);
    623 
    624   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    625     return -1;
    626   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    627     return -1;
    628 
    629   (*parser) (buf, entry_size, entry);
    630 
    631   return 0;
    632 }
    633 
    634 int
    635 bfd_sym_fetch_file_references_table_entry (bfd *abfd,
    636 					   bfd_sym_file_references_table_entry *entry,
    637 					   unsigned long sym_index)
    638 {
    639   void (*parser) (unsigned char *, size_t, bfd_sym_file_references_table_entry *);
    640   unsigned long offset;
    641   unsigned long entry_size = 0;
    642   unsigned char buf[8];
    643   bfd_sym_data_struct *sdata = NULL;
    644 
    645   parser = NULL;
    646   BFD_ASSERT (bfd_sym_valid (abfd));
    647   sdata = abfd->tdata.sym_data;
    648 
    649   if (sym_index == 0)
    650     return -1;
    651 
    652   switch (sdata->version)
    653     {
    654     case BFD_SYM_VERSION_3_3:
    655     case BFD_SYM_VERSION_3_2:
    656       entry_size = 10;
    657       parser = bfd_sym_parse_file_references_table_entry_v32;
    658       break;
    659 
    660     case BFD_SYM_VERSION_3_5:
    661     case BFD_SYM_VERSION_3_4:
    662     case BFD_SYM_VERSION_3_1:
    663     default:
    664       break;
    665     }
    666 
    667   if (parser == NULL)
    668     return -1;
    669 
    670   offset = compute_offset (sdata->header.dshb_frte.dti_first_page,
    671 			   sdata->header.dshb_page_size,
    672 			   entry_size, sym_index);
    673 
    674   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    675     return -1;
    676   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    677     return -1;
    678 
    679   (*parser) (buf, entry_size, entry);
    680 
    681   return 0;
    682 }
    683 
    684 int
    685 bfd_sym_fetch_contained_modules_table_entry (bfd *abfd,
    686 					     bfd_sym_contained_modules_table_entry *entry,
    687 					     unsigned long sym_index)
    688 {
    689   void (*parser) (unsigned char *, size_t, bfd_sym_contained_modules_table_entry *);
    690   unsigned long offset;
    691   unsigned long entry_size = 0;
    692   unsigned char buf[6];
    693   bfd_sym_data_struct *sdata = NULL;
    694 
    695   parser = NULL;
    696   BFD_ASSERT (bfd_sym_valid (abfd));
    697   sdata = abfd->tdata.sym_data;
    698 
    699   if (sym_index == 0)
    700     return -1;
    701 
    702   switch (sdata->version)
    703     {
    704     case BFD_SYM_VERSION_3_3:
    705     case BFD_SYM_VERSION_3_2:
    706       entry_size = 6;
    707       parser = bfd_sym_parse_contained_modules_table_entry_v32;
    708       break;
    709 
    710     case BFD_SYM_VERSION_3_5:
    711     case BFD_SYM_VERSION_3_4:
    712     case BFD_SYM_VERSION_3_1:
    713     default:
    714       break;
    715     }
    716 
    717   if (parser == NULL)
    718     return -1;
    719 
    720   offset = compute_offset (sdata->header.dshb_cmte.dti_first_page,
    721 			   sdata->header.dshb_page_size,
    722 			   entry_size, sym_index);
    723 
    724   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    725     return -1;
    726   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    727     return -1;
    728 
    729   (*parser) (buf, entry_size, entry);
    730 
    731   return 0;
    732 }
    733 
    734 int
    735 bfd_sym_fetch_contained_variables_table_entry (bfd *abfd,
    736 					       bfd_sym_contained_variables_table_entry *entry,
    737 					       unsigned long sym_index)
    738 {
    739   void (*parser) (unsigned char *, size_t, bfd_sym_contained_variables_table_entry *);
    740   unsigned long offset;
    741   unsigned long entry_size = 0;
    742   unsigned char buf[26];
    743   bfd_sym_data_struct *sdata = NULL;
    744 
    745   parser = NULL;
    746   BFD_ASSERT (bfd_sym_valid (abfd));
    747   sdata = abfd->tdata.sym_data;
    748 
    749   if (sym_index == 0)
    750     return -1;
    751 
    752   switch (sdata->version)
    753     {
    754     case BFD_SYM_VERSION_3_3:
    755     case BFD_SYM_VERSION_3_2:
    756       entry_size = 26;
    757       parser = bfd_sym_parse_contained_variables_table_entry_v32;
    758       break;
    759 
    760     case BFD_SYM_VERSION_3_5:
    761     case BFD_SYM_VERSION_3_4:
    762     case BFD_SYM_VERSION_3_1:
    763     default:
    764       break;
    765     }
    766 
    767   if (parser == NULL)
    768     return -1;
    769 
    770   offset = compute_offset (sdata->header.dshb_cvte.dti_first_page,
    771 			   sdata->header.dshb_page_size,
    772 			   entry_size, sym_index);
    773 
    774   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    775     return -1;
    776   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    777     return -1;
    778 
    779   (*parser) (buf, entry_size, entry);
    780 
    781   return 0;
    782 }
    783 
    784 int
    785 bfd_sym_fetch_contained_statements_table_entry (bfd *abfd,
    786 						bfd_sym_contained_statements_table_entry *entry,
    787 						unsigned long sym_index)
    788 {
    789   void (*parser) (unsigned char *, size_t, bfd_sym_contained_statements_table_entry *);
    790   unsigned long offset;
    791   unsigned long entry_size = 0;
    792   unsigned char buf[8];
    793   bfd_sym_data_struct *sdata = NULL;
    794 
    795   parser = NULL;
    796   BFD_ASSERT (bfd_sym_valid (abfd));
    797   sdata = abfd->tdata.sym_data;
    798 
    799   if (sym_index == 0)
    800     return -1;
    801 
    802   switch (sdata->version)
    803     {
    804     case BFD_SYM_VERSION_3_3:
    805     case BFD_SYM_VERSION_3_2:
    806       entry_size = 8;
    807       parser = bfd_sym_parse_contained_statements_table_entry_v32;
    808       break;
    809 
    810     case BFD_SYM_VERSION_3_5:
    811     case BFD_SYM_VERSION_3_4:
    812     case BFD_SYM_VERSION_3_1:
    813     default:
    814       break;
    815     }
    816 
    817   if (parser == NULL)
    818     return -1;
    819 
    820   offset = compute_offset (sdata->header.dshb_csnte.dti_first_page,
    821 			   sdata->header.dshb_page_size,
    822 			   entry_size, sym_index);
    823 
    824   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    825     return -1;
    826   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    827     return -1;
    828 
    829   (*parser) (buf, entry_size, entry);
    830 
    831   return 0;
    832 }
    833 
    834 int
    835 bfd_sym_fetch_contained_labels_table_entry (bfd *abfd,
    836 					    bfd_sym_contained_labels_table_entry *entry,
    837 					    unsigned long sym_index)
    838 {
    839   void (*parser) (unsigned char *, size_t, bfd_sym_contained_labels_table_entry *);
    840   unsigned long offset;
    841   unsigned long entry_size = 0;
    842   unsigned char buf[12];
    843   bfd_sym_data_struct *sdata = NULL;
    844 
    845   parser = NULL;
    846   BFD_ASSERT (bfd_sym_valid (abfd));
    847   sdata = abfd->tdata.sym_data;
    848 
    849   if (sym_index == 0)
    850     return -1;
    851 
    852   switch (sdata->version)
    853     {
    854     case BFD_SYM_VERSION_3_3:
    855     case BFD_SYM_VERSION_3_2:
    856       entry_size = 12;
    857       parser = bfd_sym_parse_contained_labels_table_entry_v32;
    858       break;
    859 
    860     case BFD_SYM_VERSION_3_5:
    861     case BFD_SYM_VERSION_3_4:
    862     case BFD_SYM_VERSION_3_1:
    863     default:
    864       break;
    865     }
    866 
    867   if (parser == NULL)
    868     return -1;
    869 
    870   offset = compute_offset (sdata->header.dshb_clte.dti_first_page,
    871 			   sdata->header.dshb_page_size,
    872 			   entry_size, sym_index);
    873 
    874   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    875     return -1;
    876   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    877     return -1;
    878 
    879   (*parser) (buf, entry_size, entry);
    880 
    881   return 0;
    882 }
    883 
    884 int
    885 bfd_sym_fetch_contained_types_table_entry (bfd *abfd,
    886 					   bfd_sym_contained_types_table_entry *entry,
    887 					   unsigned long sym_index)
    888 {
    889   void (*parser) (unsigned char *, size_t, bfd_sym_contained_types_table_entry *);
    890   unsigned long offset;
    891   unsigned long entry_size = 0;
    892   unsigned char buf[0];
    893   bfd_sym_data_struct *sdata = NULL;
    894 
    895   parser = NULL;
    896   BFD_ASSERT (bfd_sym_valid (abfd));
    897   sdata = abfd->tdata.sym_data;
    898 
    899   if (sym_index == 0)
    900     return -1;
    901 
    902   switch (sdata->version)
    903     {
    904     case BFD_SYM_VERSION_3_3:
    905     case BFD_SYM_VERSION_3_2:
    906       entry_size = 0;
    907       parser = NULL;
    908       break;
    909 
    910     case BFD_SYM_VERSION_3_5:
    911     case BFD_SYM_VERSION_3_4:
    912     case BFD_SYM_VERSION_3_1:
    913     default:
    914       break;
    915     }
    916 
    917   if (parser == NULL)
    918     return -1;
    919 
    920   offset = compute_offset (sdata->header.dshb_ctte.dti_first_page,
    921 			   sdata->header.dshb_page_size,
    922 			   entry_size, sym_index);
    923 
    924   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    925     return -1;
    926   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    927     return -1;
    928 
    929   (*parser) (buf, entry_size, entry);
    930 
    931   return 0;
    932 }
    933 
    934 int
    935 bfd_sym_fetch_file_references_index_table_entry (bfd *abfd,
    936 						 bfd_sym_file_references_index_table_entry *entry,
    937 						 unsigned long sym_index)
    938 {
    939   void (*parser) (unsigned char *, size_t, bfd_sym_file_references_index_table_entry *);
    940   unsigned long offset;
    941   unsigned long entry_size = 0;
    942   unsigned char buf[0];
    943   bfd_sym_data_struct *sdata = NULL;
    944 
    945   parser = NULL;
    946   BFD_ASSERT (bfd_sym_valid (abfd));
    947   sdata = abfd->tdata.sym_data;
    948 
    949   if (sym_index == 0)
    950     return -1;
    951 
    952   switch (sdata->version)
    953     {
    954     case BFD_SYM_VERSION_3_3:
    955     case BFD_SYM_VERSION_3_2:
    956       entry_size = 0;
    957       parser = NULL;
    958       break;
    959 
    960     case BFD_SYM_VERSION_3_5:
    961     case BFD_SYM_VERSION_3_4:
    962     case BFD_SYM_VERSION_3_1:
    963     default:
    964       break;
    965     }
    966 
    967   if (parser == NULL)
    968     return -1;
    969 
    970   offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
    971 			   sdata->header.dshb_page_size,
    972 			   entry_size, sym_index);
    973 
    974   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
    975     return -1;
    976   if (bfd_bread (buf, entry_size, abfd) != entry_size)
    977     return -1;
    978 
    979   (*parser) (buf, entry_size, entry);
    980 
    981   return 0;
    982 }
    983 
    984 int
    985 bfd_sym_fetch_constant_pool_entry (bfd *abfd,
    986 				   bfd_sym_constant_pool_entry *entry,
    987 				   unsigned long sym_index)
    988 {
    989   void (*parser) (unsigned char *, size_t, bfd_sym_constant_pool_entry *);
    990   unsigned long offset;
    991   unsigned long entry_size = 0;
    992   unsigned char buf[0];
    993   bfd_sym_data_struct *sdata = NULL;
    994 
    995   parser = NULL;
    996   BFD_ASSERT (bfd_sym_valid (abfd));
    997   sdata = abfd->tdata.sym_data;
    998 
    999   if (sym_index == 0)
   1000     return -1;
   1001 
   1002   switch (sdata->version)
   1003     {
   1004     case BFD_SYM_VERSION_3_3:
   1005     case BFD_SYM_VERSION_3_2:
   1006       entry_size = 0;
   1007       parser = NULL;
   1008       break;
   1009 
   1010     case BFD_SYM_VERSION_3_5:
   1011     case BFD_SYM_VERSION_3_4:
   1012     case BFD_SYM_VERSION_3_1:
   1013     default:
   1014       break;
   1015     }
   1016 
   1017   if (parser == NULL)
   1018     return -1;
   1019 
   1020   offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
   1021 			   sdata->header.dshb_page_size,
   1022 			   entry_size, sym_index);
   1023 
   1024   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
   1025     return -1;
   1026   if (bfd_bread (buf, entry_size, abfd) != entry_size)
   1027     return -1;
   1028 
   1029   (*parser) (buf, entry_size, entry);
   1030 
   1031   return 0;
   1032 }
   1033 
   1034 int
   1035 bfd_sym_fetch_type_table_entry (bfd *abfd,
   1036 				bfd_sym_type_table_entry *entry,
   1037 				unsigned long sym_index)
   1038 {
   1039   void (*parser) (unsigned char *, size_t, bfd_sym_type_table_entry *);
   1040   unsigned long offset;
   1041   unsigned long entry_size = 0;
   1042   unsigned char buf[4];
   1043   bfd_sym_data_struct *sdata = NULL;
   1044 
   1045   parser = NULL;
   1046   BFD_ASSERT (bfd_sym_valid (abfd));
   1047   sdata = abfd->tdata.sym_data;
   1048 
   1049   switch (sdata->version)
   1050     {
   1051     case BFD_SYM_VERSION_3_3:
   1052     case BFD_SYM_VERSION_3_2:
   1053       entry_size = 4;
   1054       parser = bfd_sym_parse_type_table_entry_v32;
   1055       break;
   1056 
   1057     case BFD_SYM_VERSION_3_5:
   1058     case BFD_SYM_VERSION_3_4:
   1059     case BFD_SYM_VERSION_3_1:
   1060     default:
   1061       break;
   1062     }
   1063 
   1064   if (parser == NULL)
   1065     return -1;
   1066 
   1067   offset = compute_offset (sdata->header.dshb_tte.dti_first_page,
   1068 			   sdata->header.dshb_page_size,
   1069 			   entry_size, sym_index);
   1070 
   1071   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
   1072     return -1;
   1073   if (bfd_bread (buf, entry_size, abfd) != entry_size)
   1074     return -1;
   1075 
   1076   (*parser) (buf, entry_size, entry);
   1077 
   1078   return 0;
   1079 }
   1080 
   1081 int
   1082 bfd_sym_fetch_type_information_table_entry (bfd *abfd,
   1083 					    bfd_sym_type_information_table_entry *entry,
   1084 					    unsigned long offset)
   1085 {
   1086   unsigned char buf[4];
   1087 
   1088   BFD_ASSERT (bfd_sym_valid (abfd));
   1089 
   1090   if (offset == 0)
   1091     return -1;
   1092 
   1093   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
   1094     return -1;
   1095 
   1096   if (bfd_bread (buf, 4, abfd) != 4)
   1097     return -1;
   1098   entry->nte_index = bfd_getb32 (buf);
   1099 
   1100   if (bfd_bread (buf, 2, abfd) != 2)
   1101     return -1;
   1102   entry->physical_size = bfd_getb16 (buf);
   1103 
   1104   if (entry->physical_size & 0x8000)
   1105     {
   1106       if (bfd_bread (buf, 4, abfd) != 4)
   1107 	return -1;
   1108       entry->physical_size &= 0x7fff;
   1109       entry->logical_size = bfd_getb32 (buf);
   1110       entry->offset = offset + 10;
   1111     }
   1112   else
   1113     {
   1114       if (bfd_bread (buf, 2, abfd) != 2)
   1115 	return -1;
   1116       entry->physical_size &= 0x7fff;
   1117       entry->logical_size = bfd_getb16 (buf);
   1118       entry->offset = offset + 8;
   1119     }
   1120 
   1121   return 0;
   1122 }
   1123 
   1124 int
   1125 bfd_sym_fetch_type_table_information (bfd *abfd,
   1126 				      bfd_sym_type_information_table_entry *entry,
   1127 				      unsigned long sym_index)
   1128 {
   1129   bfd_sym_type_table_entry tindex;
   1130   bfd_sym_data_struct *sdata = NULL;
   1131 
   1132   BFD_ASSERT (bfd_sym_valid (abfd));
   1133   sdata = abfd->tdata.sym_data;
   1134 
   1135   if (sdata->header.dshb_tte.dti_object_count <= 99)
   1136     return -1;
   1137   if (sym_index < 100)
   1138     return -1;
   1139 
   1140   if (bfd_sym_fetch_type_table_entry (abfd, &tindex, sym_index - 100) < 0)
   1141     return -1;
   1142   if (bfd_sym_fetch_type_information_table_entry (abfd, entry, tindex) < 0)
   1143     return -1;
   1144 
   1145   return 0;
   1146 }
   1147 
   1148 const unsigned char *
   1149 bfd_sym_symbol_name (bfd *abfd, unsigned long sym_index)
   1150 {
   1151   bfd_sym_data_struct *sdata = NULL;
   1152 
   1153   BFD_ASSERT (bfd_sym_valid (abfd));
   1154   sdata = abfd->tdata.sym_data;
   1155 
   1156   if (sym_index == 0)
   1157     return (const unsigned char *) "";
   1158 
   1159   sym_index *= 2;
   1160   if ((sym_index / sdata->header.dshb_page_size)
   1161       > sdata->header.dshb_nte.dti_page_count)
   1162     return (const unsigned char *) "\09[INVALID]";
   1163 
   1164   return (const unsigned char *) sdata->name_table + sym_index;
   1165 }
   1166 
   1167 const unsigned char *
   1168 bfd_sym_module_name (bfd *abfd, unsigned long sym_index)
   1169 {
   1170   bfd_sym_modules_table_entry entry;
   1171 
   1172   if (bfd_sym_fetch_modules_table_entry (abfd, &entry, sym_index) < 0)
   1173     return (const unsigned char *) "\09[INVALID]";
   1174 
   1175   return bfd_sym_symbol_name (abfd, entry.mte_nte_index);
   1176 }
   1177 
   1178 const char *
   1179 bfd_sym_unparse_storage_kind (enum bfd_sym_storage_kind kind)
   1180 {
   1181   switch (kind)
   1182     {
   1183     case BFD_SYM_STORAGE_KIND_LOCAL: return "LOCAL";
   1184     case BFD_SYM_STORAGE_KIND_VALUE: return "VALUE";
   1185     case BFD_SYM_STORAGE_KIND_REFERENCE: return "REFERENCE";
   1186     case BFD_SYM_STORAGE_KIND_WITH: return "WITH";
   1187     default: return "[UNKNOWN]";
   1188     }
   1189 }
   1190 
   1191 const char *
   1192 bfd_sym_unparse_storage_class (enum bfd_sym_storage_class kind)
   1193 {
   1194   switch (kind)
   1195     {
   1196     case BFD_SYM_STORAGE_CLASS_REGISTER: return "REGISTER";
   1197     case BFD_SYM_STORAGE_CLASS_GLOBAL: return "GLOBAL";
   1198     case BFD_SYM_STORAGE_CLASS_FRAME_RELATIVE: return "FRAME_RELATIVE";
   1199     case BFD_SYM_STORAGE_CLASS_STACK_RELATIVE: return "STACK_RELATIVE";
   1200     case BFD_SYM_STORAGE_CLASS_ABSOLUTE: return "ABSOLUTE";
   1201     case BFD_SYM_STORAGE_CLASS_CONSTANT: return "CONSTANT";
   1202     case BFD_SYM_STORAGE_CLASS_RESOURCE: return "RESOURCE";
   1203     case BFD_SYM_STORAGE_CLASS_BIGCONSTANT: return "BIGCONSTANT";
   1204     default: return "[UNKNOWN]";
   1205     }
   1206 }
   1207 
   1208 const char *
   1209 bfd_sym_unparse_module_kind (enum bfd_sym_module_kind kind)
   1210 {
   1211   switch (kind)
   1212     {
   1213     case BFD_SYM_MODULE_KIND_NONE: return "NONE";
   1214     case BFD_SYM_MODULE_KIND_PROGRAM: return "PROGRAM";
   1215     case BFD_SYM_MODULE_KIND_UNIT: return "UNIT";
   1216     case BFD_SYM_MODULE_KIND_PROCEDURE: return "PROCEDURE";
   1217     case BFD_SYM_MODULE_KIND_FUNCTION: return "FUNCTION";
   1218     case BFD_SYM_MODULE_KIND_DATA: return "DATA";
   1219     case BFD_SYM_MODULE_KIND_BLOCK: return "BLOCK";
   1220     default: return "[UNKNOWN]";
   1221     }
   1222 }
   1223 
   1224 const char *
   1225 bfd_sym_unparse_symbol_scope (enum bfd_sym_symbol_scope scope)
   1226 {
   1227   switch (scope)
   1228     {
   1229     case BFD_SYM_SYMBOL_SCOPE_LOCAL: return "LOCAL";
   1230     case BFD_SYM_SYMBOL_SCOPE_GLOBAL: return "GLOBAL";
   1231     default:
   1232       return "[UNKNOWN]";
   1233     }
   1234 }
   1235 
   1236 void
   1237 bfd_sym_print_file_reference (bfd *abfd,
   1238 			      FILE *f,
   1239 			      bfd_sym_file_reference *entry)
   1240 {
   1241   bfd_sym_file_references_table_entry frtentry;
   1242   int ret;
   1243 
   1244   ret = bfd_sym_fetch_file_references_table_entry (abfd, &frtentry,
   1245 						   entry->fref_frte_index);
   1246   fprintf (f, "FILE ");
   1247 
   1248   if ((ret < 0) || (frtentry.generic.type != BFD_SYM_FILE_NAME_INDEX))
   1249     fprintf (f, "[INVALID]");
   1250   else
   1251     fprintf (f, "\"%.*s\"",
   1252 	     bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[0],
   1253 	     &bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[1]);
   1254 
   1255   fprintf (f, " (FRTE %lu)", entry->fref_frte_index);
   1256 }
   1257 
   1258 void
   1259 bfd_sym_print_resources_table_entry (bfd *abfd,
   1260 				     FILE *f,
   1261 				     bfd_sym_resources_table_entry *entry)
   1262 {
   1263   fprintf (f, " \"%.*s\" (NTE %lu), type \"%.4s\", num %u, size %lu, MTE %lu -- %lu",
   1264 	   bfd_sym_symbol_name (abfd, entry->rte_nte_index)[0],
   1265 	   &bfd_sym_symbol_name (abfd, entry->rte_nte_index)[1],
   1266 	   entry->rte_nte_index, entry->rte_res_type, entry->rte_res_number,
   1267 	   entry->rte_res_size, entry->rte_mte_first, entry->rte_mte_last);
   1268 }
   1269 
   1270 void
   1271 bfd_sym_print_modules_table_entry (bfd *abfd,
   1272 				   FILE *f,
   1273 				   bfd_sym_modules_table_entry *entry)
   1274 {
   1275   fprintf (f, "\"%.*s\" (NTE %lu)",
   1276 	   bfd_sym_symbol_name (abfd, entry->mte_nte_index)[0],
   1277 	   &bfd_sym_symbol_name (abfd, entry->mte_nte_index)[1],
   1278 	   entry->mte_nte_index);
   1279 
   1280   fprintf (f, "\n            ");
   1281 
   1282   bfd_sym_print_file_reference (abfd, f, &entry->mte_imp_fref);
   1283   fprintf (f, " range %lu -- %lu",
   1284 	   entry->mte_imp_fref.fref_offset, entry->mte_imp_end);
   1285 
   1286   fprintf (f, "\n            ");
   1287 
   1288   fprintf (f, "kind %s", bfd_sym_unparse_module_kind (entry->mte_kind));
   1289   fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->mte_scope));
   1290 
   1291   fprintf (f, ", RTE %lu, offset %lu, size %lu",
   1292 	   entry->mte_rte_index, entry->mte_res_offset, entry->mte_size);
   1293 
   1294   fprintf (f, "\n            ");
   1295 
   1296   fprintf (f, "CMTE %lu, CVTE %lu, CLTE %lu, CTTE %lu, CSNTE1 %lu, CSNTE2 %lu",
   1297 	   entry->mte_cmte_index, entry->mte_cvte_index,
   1298 	   entry->mte_clte_index, entry->mte_ctte_index,
   1299 	   entry->mte_csnte_idx_1, entry->mte_csnte_idx_2);
   1300 
   1301   if (entry->mte_parent != 0)
   1302     fprintf (f, ", parent %lu", entry->mte_parent);
   1303   else
   1304     fprintf (f, ", no parent");
   1305 
   1306   if (entry->mte_cmte_index != 0)
   1307     fprintf (f, ", child %lu", entry->mte_cmte_index);
   1308   else
   1309     fprintf (f, ", no child");
   1310 }
   1311 
   1312 void
   1313 bfd_sym_print_file_references_table_entry (bfd *abfd,
   1314 					   FILE *f,
   1315 					   bfd_sym_file_references_table_entry *entry)
   1316 {
   1317   switch (entry->generic.type)
   1318     {
   1319     case BFD_SYM_FILE_NAME_INDEX:
   1320       fprintf (f, "FILE \"%.*s\" (NTE %lu), modtime ",
   1321 	       bfd_sym_symbol_name (abfd, entry->filename.nte_index)[0],
   1322 	       &bfd_sym_symbol_name (abfd, entry->filename.nte_index)[1],
   1323 	       entry->filename.nte_index);
   1324 
   1325       fprintf (f, "[UNIMPLEMENTED]");
   1326       /* printModDate (entry->filename.mod_date); */
   1327       fprintf (f, " (0x%lx)", entry->filename.mod_date);
   1328       break;
   1329 
   1330     case BFD_SYM_END_OF_LIST:
   1331       fprintf (f, "END");
   1332       break;
   1333 
   1334     default:
   1335       fprintf (f, "\"%.*s\" (MTE %lu), offset %lu",
   1336 	       bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
   1337 	       &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
   1338 	       entry->entry.mte_index,
   1339 	       entry->entry.file_offset);
   1340       break;
   1341     }
   1342 }
   1343 
   1344 void
   1345 bfd_sym_print_contained_modules_table_entry (bfd *abfd,
   1346 					     FILE *f,
   1347 					     bfd_sym_contained_modules_table_entry *entry)
   1348 {
   1349   switch (entry->generic.type)
   1350     {
   1351     case BFD_SYM_END_OF_LIST:
   1352       fprintf (f, "END");
   1353       break;
   1354 
   1355     default:
   1356       fprintf (f, "\"%.*s\" (MTE %lu, NTE %lu)",
   1357 	       bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
   1358 	       &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
   1359 	       entry->entry.mte_index,
   1360 	       entry->entry.nte_index);
   1361       break;
   1362     }
   1363 }
   1364 
   1365 void
   1366 bfd_sym_print_contained_variables_table_entry (bfd *abfd,
   1367 					       FILE *f,
   1368 					       bfd_sym_contained_variables_table_entry *entry)
   1369 {
   1370   if (entry->generic.type == BFD_SYM_END_OF_LIST)
   1371     {
   1372       fprintf (f, "END");
   1373       return;
   1374     }
   1375 
   1376   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
   1377     {
   1378       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
   1379       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
   1380       return;
   1381     }
   1382 
   1383   fprintf (f, "\"%.*s\" (NTE %lu)",
   1384 	   bfd_sym_symbol_name (abfd, entry->entry.nte_index)[0],
   1385 	   &bfd_sym_symbol_name (abfd, entry->entry.nte_index)[1],
   1386 	   entry->entry.nte_index);
   1387 
   1388   fprintf (f, ", TTE %lu", entry->entry.tte_index);
   1389   fprintf (f, ", offset %lu", entry->entry.file_delta);
   1390   fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->entry.scope));
   1391 
   1392   if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
   1393     fprintf (f, ", latype %s, laclass %s, laoffset %lu",
   1394 	     bfd_sym_unparse_storage_kind (entry->entry.address.scstruct.sca_kind),
   1395 	     bfd_sym_unparse_storage_class (entry->entry.address.scstruct.sca_class),
   1396 	     entry->entry.address.scstruct.sca_offset);
   1397   else if (entry->entry.la_size <= BFD_SYM_CVTE_LA_MAX_SIZE)
   1398     {
   1399       unsigned long i;
   1400 
   1401       fprintf (f, ", la [");
   1402       for (i = 0; i < entry->entry.la_size; i++)
   1403 	fprintf (f, "0x%02x ", entry->entry.address.lastruct.la[i]);
   1404       fprintf (f, "]");
   1405     }
   1406   else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
   1407     fprintf (f, ", bigla %lu, biglakind %u",
   1408 	     entry->entry.address.biglastruct.big_la,
   1409 	     entry->entry.address.biglastruct.big_la_kind);
   1410 
   1411   else
   1412     fprintf (f, ", la [INVALID]");
   1413 }
   1414 
   1415 void
   1416 bfd_sym_print_contained_statements_table_entry (bfd *abfd,
   1417 						FILE *f,
   1418 						bfd_sym_contained_statements_table_entry *entry)
   1419 {
   1420   if (entry->generic.type == BFD_SYM_END_OF_LIST)
   1421     {
   1422       fprintf (f, "END");
   1423       return;
   1424     }
   1425 
   1426   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
   1427     {
   1428       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
   1429       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
   1430       return;
   1431     }
   1432 
   1433   fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu",
   1434 	   bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
   1435 	   &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
   1436 	   entry->entry.mte_index,
   1437 	   entry->entry.mte_offset,
   1438 	   entry->entry.file_delta);
   1439 }
   1440 
   1441 void
   1442 bfd_sym_print_contained_labels_table_entry (bfd *abfd,
   1443 					    FILE *f,
   1444 					    bfd_sym_contained_labels_table_entry *entry)
   1445 {
   1446   if (entry->generic.type == BFD_SYM_END_OF_LIST)
   1447     {
   1448       fprintf (f, "END");
   1449       return;
   1450     }
   1451 
   1452   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
   1453     {
   1454       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
   1455       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
   1456       return;
   1457     }
   1458 
   1459   fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu, scope %s",
   1460 	   bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
   1461 	   &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
   1462 	   entry->entry.mte_index,
   1463 	   entry->entry.mte_offset,
   1464 	   entry->entry.file_delta,
   1465 	   bfd_sym_unparse_symbol_scope (entry->entry.scope));
   1466 }
   1467 
   1468 void
   1469 bfd_sym_print_contained_types_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
   1470 					   FILE *f,
   1471 					   bfd_sym_contained_types_table_entry *entry ATTRIBUTE_UNUSED)
   1472 {
   1473   fprintf (f, "[UNIMPLEMENTED]");
   1474 }
   1475 
   1476 const char *
   1477 bfd_sym_type_operator_name (unsigned char num)
   1478 {
   1479   switch (num)
   1480     {
   1481     case 1: return "TTE";
   1482     case 2: return "PointerTo";
   1483     case 3: return "ScalarOf";
   1484     case 4: return "ConstantOf";
   1485     case 5: return "EnumerationOf";
   1486     case 6: return "VectorOf";
   1487     case 7: return "RecordOf";
   1488     case 8: return "UnionOf";
   1489     case 9: return "SubRangeOf";
   1490     case 10: return "SetOf";
   1491     case 11: return "NamedTypeOf";
   1492     case 12: return "ProcOf";
   1493     case 13: return "ValueOf";
   1494     case 14: return "ArrayOf";
   1495     default: return "[UNKNOWN OPERATOR]";
   1496     }
   1497 }
   1498 
   1499 const char *
   1500 bfd_sym_type_basic_name (unsigned char num)
   1501 {
   1502   switch (num)
   1503     {
   1504     case 0: return "void";
   1505     case 1: return "pascal string";
   1506     case 2: return "unsigned long";
   1507     case 3: return "signed long";
   1508     case 4: return "extended (10 bytes)";
   1509     case 5: return "pascal boolean (1 byte)";
   1510     case 6: return "unsigned byte";
   1511     case 7: return "signed byte";
   1512     case 8: return "character (1 byte)";
   1513     case 9: return "wide character (2 bytes)";
   1514     case 10: return "unsigned short";
   1515     case 11: return "signed short";
   1516     case 12: return "singled";
   1517     case 13: return "double";
   1518     case 14: return "extended (12 bytes)";
   1519     case 15: return "computational (8 bytes)";
   1520     case 16: return "c string";
   1521     case 17: return "as-is string";
   1522     default: return "[UNKNOWN BASIC TYPE]";
   1523     }
   1524 }
   1525 
   1526 int
   1527 bfd_sym_fetch_long (unsigned char *buf,
   1528 		    unsigned long len,
   1529 		    unsigned long offset,
   1530 		    unsigned long *offsetptr,
   1531 		    long *value)
   1532 {
   1533   int ret;
   1534 
   1535   if (offset >= len)
   1536     {
   1537       *value = 0;
   1538       offset += 0;
   1539       ret = -1;
   1540     }
   1541   else if (! (buf[offset] & 0x80))
   1542     {
   1543       *value = buf[offset];
   1544       offset += 1;
   1545       ret = 0;
   1546     }
   1547   else if (buf[offset] == 0xc0)
   1548     {
   1549       if ((offset + 5) > len)
   1550 	{
   1551 	  *value = 0;
   1552 	  offset = len;
   1553 	  ret = -1;
   1554 	}
   1555       else
   1556 	{
   1557 	  *value = bfd_getb32 (buf + offset + 1);
   1558 	  offset += 5;
   1559 	  ret = 0;
   1560 	}
   1561     }
   1562   else if ((buf[offset] & 0xc0) == 0xc0)
   1563     {
   1564       *value =  -(buf[offset] & 0x3f);
   1565       offset += 1;
   1566       ret = 0;
   1567     }
   1568   else if ((buf[offset] & 0xc0) == 0x80)
   1569     {
   1570       if ((offset + 2) > len)
   1571 	{
   1572 	  *value = 0;
   1573 	  offset = len;
   1574 	  ret = -1;
   1575 	}
   1576       else
   1577 	{
   1578 	  *value = bfd_getb16 (buf + offset) & 0x3fff;
   1579 	  offset += 2;
   1580 	  ret = 0;
   1581 	}
   1582     }
   1583   else
   1584     abort ();
   1585 
   1586   if (offsetptr != NULL)
   1587     *offsetptr = offset;
   1588 
   1589   return ret;
   1590 }
   1591 
   1592 void
   1593 bfd_sym_print_type_information (bfd *abfd,
   1594 				FILE *f,
   1595 				unsigned char *buf,
   1596 				unsigned long len,
   1597 				unsigned long offset,
   1598 				unsigned long *offsetptr)
   1599 {
   1600   unsigned int type;
   1601 
   1602   if (offset >= len)
   1603     {
   1604       fprintf (f, "[NULL]");
   1605 
   1606       if (offsetptr != NULL)
   1607 	*offsetptr = offset;
   1608       return;
   1609   }
   1610 
   1611   type = buf[offset];
   1612   offset++;
   1613 
   1614   if (! (type & 0x80))
   1615     {
   1616       fprintf (f, "[%s] (0x%x)", bfd_sym_type_basic_name (type & 0x7f), type);
   1617 
   1618       if (offsetptr != NULL)
   1619 	*offsetptr = offset;
   1620       return;
   1621     }
   1622 
   1623   if (type & 0x40)
   1624     fprintf (f, "[packed ");
   1625   else
   1626     fprintf (f, "[");
   1627 
   1628   switch (type & 0x3f)
   1629     {
   1630     case 1:
   1631       {
   1632 	long value;
   1633 	bfd_sym_type_information_table_entry tinfo;
   1634 
   1635 	bfd_sym_fetch_long (buf, len, offset, &offset, &value);
   1636 	if (value <= 0)
   1637 	  fprintf (f, "[INVALID]");
   1638 	else
   1639 	  {
   1640 	    if (bfd_sym_fetch_type_table_information (abfd, &tinfo, value) < 0)
   1641 	      fprintf (f, "[INVALID]");
   1642 	    else
   1643 	      fprintf (f, "\"%.*s\"",
   1644 		       bfd_sym_symbol_name (abfd, tinfo.nte_index)[0],
   1645 		       &bfd_sym_symbol_name (abfd, tinfo.nte_index)[1]);
   1646 	  }
   1647 	fprintf (f, " (TTE %lu)", (unsigned long) value);
   1648 	break;
   1649       }
   1650 
   1651     case 2:
   1652       fprintf (f, "pointer (0x%x) to ", type);
   1653       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1654       break;
   1655 
   1656     case 3:
   1657       {
   1658 	long value;
   1659 
   1660 	fprintf (f, "scalar (0x%x) of ", type);
   1661 	bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1662 	bfd_sym_fetch_long (buf, len, offset, &offset, &value);
   1663 	fprintf (f, " (%lu)", (unsigned long) value);
   1664 	break;
   1665       }
   1666 
   1667     case 5:
   1668       {
   1669 	long lower, upper, nelem;
   1670 	int i;
   1671 
   1672 	fprintf (f, "enumeration (0x%x) of ", type);
   1673 	bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1674 	bfd_sym_fetch_long (buf, len, offset, &offset, &lower);
   1675 	bfd_sym_fetch_long (buf, len, offset, &offset, &upper);
   1676 	bfd_sym_fetch_long (buf, len, offset, &offset, &nelem);
   1677 	fprintf (f, " from %lu to %lu with %lu elements: ",
   1678 		 (unsigned long) lower, (unsigned long) upper,
   1679 		 (unsigned long) nelem);
   1680 
   1681 	for (i = 0; i < nelem; i++)
   1682 	  {
   1683 	    fprintf (f, "\n                    ");
   1684 	    bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1685 	  }
   1686 	break;
   1687       }
   1688 
   1689     case 6:
   1690       fprintf (f, "vector (0x%x)", type);
   1691       fprintf (f, "\n                index ");
   1692       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1693       fprintf (f, "\n                target ");
   1694       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1695       break;
   1696 
   1697     case 7:
   1698     case 8:
   1699       {
   1700 	long nrec, eloff, i;
   1701 
   1702 	if ((type & 0x3f) == 7)
   1703 	  fprintf (f, "record (0x%x) of ", type);
   1704 	else
   1705 	  fprintf (f, "union (0x%x) of ", type);
   1706 
   1707 	bfd_sym_fetch_long (buf, len, offset, &offset, &nrec);
   1708 	fprintf (f, "%lu elements: ", (unsigned long) nrec);
   1709 
   1710 	for (i = 0; i < nrec; i++)
   1711 	  {
   1712 	    bfd_sym_fetch_long (buf, len, offset, &offset, &eloff);
   1713 	    fprintf (f, "\n                ");
   1714 	    fprintf (f, "offset %lu: ", (unsigned long) eloff);
   1715 	    bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1716 	  }
   1717 	break;
   1718       }
   1719 
   1720     case 9:
   1721       fprintf (f, "subrange (0x%x) of ", type);
   1722       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1723       fprintf (f, " lower ");
   1724       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1725       fprintf (f, " upper ");
   1726       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1727       break;
   1728 
   1729   case 11:
   1730     {
   1731       long value;
   1732 
   1733       fprintf (f, "named type (0x%x) ", type);
   1734       bfd_sym_fetch_long (buf, len, offset, &offset, &value);
   1735       if (value <= 0)
   1736 	fprintf (f, "[INVALID]");
   1737       else
   1738 	fprintf (f, "\"%.*s\"",
   1739 		 bfd_sym_symbol_name (abfd, value)[0],
   1740 		 &bfd_sym_symbol_name (abfd, value)[1]);
   1741 
   1742       fprintf (f, " (NTE %lu) with type ", (unsigned long) value);
   1743       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
   1744       break;
   1745     }
   1746 
   1747   default:
   1748     fprintf (f, "%s (0x%x)", bfd_sym_type_operator_name (type), type);
   1749     break;
   1750     }
   1751 
   1752   if (type == (0x40 | 0x6))
   1753     {
   1754       /* Vector.  */
   1755       long n, width, m;
   1756       long l;
   1757       long i;
   1758 
   1759       bfd_sym_fetch_long (buf, len, offset, &offset, &n);
   1760       bfd_sym_fetch_long (buf, len, offset, &offset, &width);
   1761       bfd_sym_fetch_long (buf, len, offset, &offset, &m);
   1762       /* fprintf (f, "\n                "); */
   1763       fprintf (f, " N %ld, width %ld, M %ld, ", n, width, m);
   1764       for (i = 0; i < m; i++)
   1765 	{
   1766 	  bfd_sym_fetch_long (buf, len, offset, &offset, &l);
   1767 	  if (i != 0)
   1768 	    fprintf (f, " ");
   1769 	  fprintf (f, "%ld", l);
   1770 	}
   1771     }
   1772   else  if (type & 0x40)
   1773     {
   1774       /* Other packed type.  */
   1775       long msb, lsb;
   1776 
   1777       bfd_sym_fetch_long (buf, len, offset, &offset, &msb);
   1778       bfd_sym_fetch_long (buf, len, offset, &offset, &lsb);
   1779       /* fprintf (f, "\n                "); */
   1780       fprintf (f, " msb %ld, lsb %ld", msb, lsb);
   1781     }
   1782 
   1783   fprintf (f, "]");
   1784 
   1785   if (offsetptr != NULL)
   1786     *offsetptr = offset;
   1787 }
   1788 
   1789 void
   1790 bfd_sym_print_type_information_table_entry (bfd *abfd,
   1791 					    FILE *f,
   1792 					    bfd_sym_type_information_table_entry *entry)
   1793 {
   1794   unsigned char *buf;
   1795   unsigned long offset;
   1796   unsigned int i;
   1797 
   1798   fprintf (f, "\"%.*s\" (NTE %lu), %lu bytes at %lu, logical size %lu",
   1799 	   bfd_sym_symbol_name (abfd, entry->nte_index)[0],
   1800 	   &bfd_sym_symbol_name (abfd, entry->nte_index)[1],
   1801 	   entry->nte_index,
   1802 	   entry->physical_size, entry->offset, entry->logical_size);
   1803 
   1804   fprintf (f, "\n            ");
   1805 
   1806   buf = alloca (entry->physical_size);
   1807   if (buf == NULL)
   1808     {
   1809       fprintf (f, "[ERROR]\n");
   1810       return;
   1811     }
   1812   if (bfd_seek (abfd, entry->offset, SEEK_SET) < 0)
   1813     {
   1814       fprintf (f, "[ERROR]\n");
   1815       return;
   1816     }
   1817   if (bfd_bread (buf, entry->physical_size, abfd) != entry->physical_size)
   1818     {
   1819       fprintf (f, "[ERROR]\n");
   1820       return;
   1821     }
   1822 
   1823   fprintf (f, "[");
   1824   for (i = 0; i < entry->physical_size; i++)
   1825     {
   1826       if (i == 0)
   1827 	fprintf (f, "0x%02x", buf[i]);
   1828       else
   1829 	fprintf (f, " 0x%02x", buf[i]);
   1830     }
   1831 
   1832   fprintf (f, "]");
   1833   fprintf (f, "\n            ");
   1834 
   1835   bfd_sym_print_type_information (abfd, f, buf, entry->physical_size, 0, &offset);
   1836 
   1837   if (offset != entry->physical_size)
   1838     fprintf (f, "\n            [parser used %lu bytes instead of %lu]", offset, entry->physical_size);
   1839 }
   1840 
   1841 void
   1842 bfd_sym_print_file_references_index_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
   1843 						 FILE *f,
   1844 						 bfd_sym_file_references_index_table_entry *entry ATTRIBUTE_UNUSED)
   1845 {
   1846   fprintf (f, "[UNIMPLEMENTED]");
   1847 }
   1848 
   1849 void
   1850 bfd_sym_print_constant_pool_entry (bfd *abfd ATTRIBUTE_UNUSED,
   1851 				   FILE *f,
   1852 				   bfd_sym_constant_pool_entry *entry ATTRIBUTE_UNUSED)
   1853 {
   1854   fprintf (f, "[UNIMPLEMENTED]");
   1855 }
   1856 
   1857 unsigned char *
   1858 bfd_sym_display_name_table_entry (bfd *abfd,
   1859 				  FILE *f,
   1860 				  unsigned char *entry)
   1861 {
   1862   unsigned long sym_index;
   1863   unsigned long offset;
   1864   bfd_sym_data_struct *sdata = NULL;
   1865 
   1866   BFD_ASSERT (bfd_sym_valid (abfd));
   1867   sdata = abfd->tdata.sym_data;
   1868   sym_index = (entry - sdata->name_table) / 2;
   1869 
   1870   if (sdata->version >= BFD_SYM_VERSION_3_4 && entry[0] == 255 && entry[1] == 0)
   1871     {
   1872       unsigned short length = bfd_getb16 (entry + 2);
   1873       fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, length, entry + 4);
   1874       offset = 2 + length + 1;
   1875     }
   1876   else
   1877     {
   1878       if (! (entry[0] == 0 || (entry[0] == 1 && entry[1] == '\0')))
   1879 	fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, entry[0], entry + 1);
   1880 
   1881       if (sdata->version >= BFD_SYM_VERSION_3_4)
   1882 	offset = entry[0] + 2;
   1883       else
   1884 	offset = entry[0] + 1;
   1885     }
   1886 
   1887   return (entry + offset + (offset % 2));
   1888 }
   1889 
   1890 void
   1891 bfd_sym_display_name_table (bfd *abfd, FILE *f)
   1892 {
   1893   unsigned long name_table_len;
   1894   unsigned char *name_table, *name_table_end, *cur;
   1895   bfd_sym_data_struct *sdata = NULL;
   1896 
   1897   BFD_ASSERT (bfd_sym_valid (abfd));
   1898   sdata = abfd->tdata.sym_data;
   1899 
   1900   name_table_len = sdata->header.dshb_nte.dti_page_count * sdata->header.dshb_page_size;
   1901   name_table = sdata->name_table;
   1902   name_table_end = name_table + name_table_len;
   1903 
   1904   fprintf (f, "name table (NTE) contains %lu bytes:\n\n", name_table_len);
   1905 
   1906   cur = name_table;
   1907   for (;;)
   1908     {
   1909       cur = bfd_sym_display_name_table_entry (abfd, f, cur);
   1910       if (cur >= name_table_end)
   1911 	break;
   1912     }
   1913 }
   1914 
   1915 void
   1916 bfd_sym_display_resources_table (bfd *abfd, FILE *f)
   1917 {
   1918   unsigned long i;
   1919   bfd_sym_resources_table_entry entry;
   1920   bfd_sym_data_struct *sdata = NULL;
   1921 
   1922   BFD_ASSERT (bfd_sym_valid (abfd));
   1923   sdata = abfd->tdata.sym_data;
   1924 
   1925   fprintf (f, "resource table (RTE) contains %lu objects:\n\n",
   1926 	   sdata->header.dshb_rte.dti_object_count);
   1927 
   1928   for (i = 1; i <= sdata->header.dshb_rte.dti_object_count; i++)
   1929     {
   1930       if (bfd_sym_fetch_resources_table_entry (abfd, &entry, i) < 0)
   1931 	fprintf (f, " [%8lu] [INVALID]\n", i);
   1932       else
   1933 	{
   1934 	  fprintf (f, " [%8lu] ", i);
   1935 	  bfd_sym_print_resources_table_entry (abfd, f, &entry);
   1936 	  fprintf (f, "\n");
   1937 	}
   1938     }
   1939 }
   1940 
   1941 void
   1942 bfd_sym_display_modules_table (bfd *abfd, FILE *f)
   1943 {
   1944   unsigned long i;
   1945   bfd_sym_modules_table_entry entry;
   1946   bfd_sym_data_struct *sdata = NULL;
   1947 
   1948   BFD_ASSERT (bfd_sym_valid (abfd));
   1949   sdata = abfd->tdata.sym_data;
   1950 
   1951   fprintf (f, "module table (MTE) contains %lu objects:\n\n",
   1952 	   sdata->header.dshb_mte.dti_object_count);
   1953 
   1954   for (i = 1; i <= sdata->header.dshb_mte.dti_object_count; i++)
   1955     {
   1956       if (bfd_sym_fetch_modules_table_entry (abfd, &entry, i) < 0)
   1957 	fprintf (f, " [%8lu] [INVALID]\n", i);
   1958       else
   1959 	{
   1960 	  fprintf (f, " [%8lu] ", i);
   1961 	  bfd_sym_print_modules_table_entry (abfd, f, &entry);
   1962 	  fprintf (f, "\n");
   1963 	}
   1964     }
   1965 }
   1966 
   1967 void
   1968 bfd_sym_display_file_references_table (bfd *abfd, FILE *f)
   1969 {
   1970   unsigned long i;
   1971   bfd_sym_file_references_table_entry entry;
   1972   bfd_sym_data_struct *sdata = NULL;
   1973 
   1974   BFD_ASSERT (bfd_sym_valid (abfd));
   1975   sdata = abfd->tdata.sym_data;
   1976 
   1977   fprintf (f, "file reference table (FRTE) contains %lu objects:\n\n",
   1978 	   sdata->header.dshb_frte.dti_object_count);
   1979 
   1980   for (i = 1; i <= sdata->header.dshb_frte.dti_object_count; i++)
   1981     {
   1982       if (bfd_sym_fetch_file_references_table_entry (abfd, &entry, i) < 0)
   1983 	fprintf (f, " [%8lu] [INVALID]\n", i);
   1984       else
   1985 	{
   1986 	  fprintf (f, " [%8lu] ", i);
   1987 	  bfd_sym_print_file_references_table_entry (abfd, f, &entry);
   1988 	  fprintf (f, "\n");
   1989 	}
   1990     }
   1991 }
   1992 
   1993 void
   1994 bfd_sym_display_contained_modules_table (bfd *abfd, FILE *f)
   1995 {
   1996   unsigned long i;
   1997   bfd_sym_contained_modules_table_entry entry;
   1998   bfd_sym_data_struct *sdata = NULL;
   1999 
   2000   BFD_ASSERT (bfd_sym_valid (abfd));
   2001   sdata = abfd->tdata.sym_data;
   2002 
   2003   fprintf (f, "contained modules table (CMTE) contains %lu objects:\n\n",
   2004 	   sdata->header.dshb_cmte.dti_object_count);
   2005 
   2006   for (i = 1; i <= sdata->header.dshb_cmte.dti_object_count; i++)
   2007     {
   2008       if (bfd_sym_fetch_contained_modules_table_entry (abfd, &entry, i) < 0)
   2009 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2010       else
   2011 	{
   2012 	  fprintf (f, " [%8lu] ", i);
   2013 	  bfd_sym_print_contained_modules_table_entry (abfd, f, &entry);
   2014 	  fprintf (f, "\n");
   2015 	}
   2016     }
   2017 }
   2018 
   2019 void
   2020 bfd_sym_display_contained_variables_table (bfd *abfd, FILE *f)
   2021 {
   2022   unsigned long i;
   2023   bfd_sym_contained_variables_table_entry entry;
   2024   bfd_sym_data_struct *sdata = NULL;
   2025 
   2026   BFD_ASSERT (bfd_sym_valid (abfd));
   2027   sdata = abfd->tdata.sym_data;
   2028 
   2029   fprintf (f, "contained variables table (CVTE) contains %lu objects:\n\n",
   2030 	   sdata->header.dshb_cvte.dti_object_count);
   2031 
   2032   for (i = 1; i <= sdata->header.dshb_cvte.dti_object_count; i++)
   2033     {
   2034       if (bfd_sym_fetch_contained_variables_table_entry (abfd, &entry, i) < 0)
   2035 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2036       else
   2037 	{
   2038 	  fprintf (f, " [%8lu] ", i);
   2039 	  bfd_sym_print_contained_variables_table_entry (abfd, f, &entry);
   2040 	  fprintf (f, "\n");
   2041 	}
   2042     }
   2043 
   2044   fprintf (f, "\n");
   2045 }
   2046 
   2047 void
   2048 bfd_sym_display_contained_statements_table (bfd *abfd, FILE *f)
   2049 {
   2050   unsigned long i;
   2051   bfd_sym_contained_statements_table_entry entry;
   2052   bfd_sym_data_struct *sdata = NULL;
   2053 
   2054   BFD_ASSERT (bfd_sym_valid (abfd));
   2055   sdata = abfd->tdata.sym_data;
   2056 
   2057   fprintf (f, "contained statements table (CSNTE) contains %lu objects:\n\n",
   2058 	   sdata->header.dshb_csnte.dti_object_count);
   2059 
   2060   for (i = 1; i <= sdata->header.dshb_csnte.dti_object_count; i++)
   2061     {
   2062       if (bfd_sym_fetch_contained_statements_table_entry (abfd, &entry, i) < 0)
   2063 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2064       else
   2065 	{
   2066 	  fprintf (f, " [%8lu] ", i);
   2067 	  bfd_sym_print_contained_statements_table_entry (abfd, f, &entry);
   2068 	  fprintf (f, "\n");
   2069 	}
   2070     }
   2071 }
   2072 
   2073 void
   2074 bfd_sym_display_contained_labels_table (bfd *abfd, FILE *f)
   2075 {
   2076   unsigned long i;
   2077   bfd_sym_contained_labels_table_entry entry;
   2078   bfd_sym_data_struct *sdata = NULL;
   2079 
   2080   BFD_ASSERT (bfd_sym_valid (abfd));
   2081   sdata = abfd->tdata.sym_data;
   2082 
   2083   fprintf (f, "contained labels table (CLTE) contains %lu objects:\n\n",
   2084 	   sdata->header.dshb_clte.dti_object_count);
   2085 
   2086   for (i = 1; i <= sdata->header.dshb_clte.dti_object_count; i++)
   2087     {
   2088       if (bfd_sym_fetch_contained_labels_table_entry (abfd, &entry, i) < 0)
   2089 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2090       else
   2091 	{
   2092 	  fprintf (f, " [%8lu] ", i);
   2093 	  bfd_sym_print_contained_labels_table_entry (abfd, f, &entry);
   2094 	  fprintf (f, "\n");
   2095 	}
   2096     }
   2097 }
   2098 
   2099 void
   2100 bfd_sym_display_contained_types_table (bfd *abfd, FILE *f)
   2101 {
   2102   unsigned long i;
   2103   bfd_sym_contained_types_table_entry entry;
   2104   bfd_sym_data_struct *sdata = NULL;
   2105 
   2106   BFD_ASSERT (bfd_sym_valid (abfd));
   2107   sdata = abfd->tdata.sym_data;
   2108 
   2109   fprintf (f, "contained types table (CTTE) contains %lu objects:\n\n",
   2110 	   sdata->header.dshb_ctte.dti_object_count);
   2111 
   2112   for (i = 1; i <= sdata->header.dshb_ctte.dti_object_count; i++)
   2113     {
   2114       if (bfd_sym_fetch_contained_types_table_entry (abfd, &entry, i) < 0)
   2115 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2116       else
   2117 	{
   2118 	  fprintf (f, " [%8lu] ", i);
   2119 	  bfd_sym_print_contained_types_table_entry (abfd, f, &entry);
   2120 	  fprintf (f, "\n");
   2121 	}
   2122     }
   2123 }
   2124 
   2125 void
   2126 bfd_sym_display_file_references_index_table (bfd *abfd, FILE *f)
   2127 {
   2128   unsigned long i;
   2129   bfd_sym_file_references_index_table_entry entry;
   2130   bfd_sym_data_struct *sdata = NULL;
   2131 
   2132   BFD_ASSERT (bfd_sym_valid (abfd));
   2133   sdata = abfd->tdata.sym_data;
   2134 
   2135   fprintf (f, "file references index table (FITE) contains %lu objects:\n\n",
   2136 	   sdata->header.dshb_fite.dti_object_count);
   2137 
   2138   for (i = 1; i <= sdata->header.dshb_fite.dti_object_count; i++)
   2139     {
   2140       if (bfd_sym_fetch_file_references_index_table_entry (abfd, &entry, i) < 0)
   2141 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2142       else
   2143 	{
   2144 	  fprintf (f, " [%8lu] ", i);
   2145 	  bfd_sym_print_file_references_index_table_entry (abfd, f, &entry);
   2146 	  fprintf (f, "\n");
   2147 	}
   2148     }
   2149 }
   2150 
   2151 void
   2152 bfd_sym_display_constant_pool (bfd *abfd, FILE *f)
   2153 {
   2154   unsigned long i;
   2155   bfd_sym_constant_pool_entry entry;
   2156   bfd_sym_data_struct *sdata = NULL;
   2157 
   2158   BFD_ASSERT (bfd_sym_valid (abfd));
   2159   sdata = abfd->tdata.sym_data;
   2160 
   2161   fprintf (f, "constant pool (CONST) contains %lu objects:\n\n",
   2162 	   sdata->header.dshb_const.dti_object_count);
   2163 
   2164   for (i = 1; i <= sdata->header.dshb_const.dti_object_count; i++)
   2165     {
   2166       if (bfd_sym_fetch_constant_pool_entry (abfd, &entry, i) < 0)
   2167 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2168       else
   2169 	{
   2170 	  fprintf (f, " [%8lu] ", i);
   2171 	  bfd_sym_print_constant_pool_entry (abfd, f, &entry);
   2172 	  fprintf (f, "\n");
   2173 	}
   2174     }
   2175 }
   2176 
   2177 void
   2178 bfd_sym_display_type_information_table (bfd *abfd, FILE *f)
   2179 {
   2180   unsigned long i;
   2181   bfd_sym_type_table_entry sym_index;
   2182   bfd_sym_type_information_table_entry entry;
   2183   bfd_sym_data_struct *sdata = NULL;
   2184 
   2185   BFD_ASSERT (bfd_sym_valid (abfd));
   2186   sdata = abfd->tdata.sym_data;
   2187 
   2188   if (sdata->header.dshb_tte.dti_object_count > 99)
   2189     fprintf (f, "type table (TINFO) contains %lu objects:\n\n",
   2190 	     sdata->header.dshb_tte.dti_object_count - 99);
   2191   else
   2192     {
   2193       fprintf (f, "type table (TINFO) contains [INVALID] objects:\n\n");
   2194       return;
   2195     }
   2196 
   2197   for (i = 100; i <= sdata->header.dshb_tte.dti_object_count; i++)
   2198     {
   2199       if (bfd_sym_fetch_type_table_entry (abfd, &sym_index, i - 100) < 0)
   2200 	fprintf (f, " [%8lu] [INVALID]\n", i);
   2201       else
   2202 	{
   2203 	  fprintf (f, " [%8lu] (TINFO %lu) ", i, sym_index);
   2204 
   2205 	  if (bfd_sym_fetch_type_information_table_entry (abfd, &entry, sym_index) < 0)
   2206 	    fprintf (f, "[INVALID]");
   2207 	  else
   2208 	    bfd_sym_print_type_information_table_entry (abfd, f, &entry);
   2209 
   2210 	  fprintf (f, "\n");
   2211 	}
   2212     }
   2213 }
   2214 
   2215 int
   2216 bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata)
   2217 {
   2218   asection *bfdsec;
   2219   const char *name = "symbols";
   2220 
   2221   mdata->name_table = 0;
   2222   mdata->sbfd = abfd;
   2223   mdata->version = version;
   2224 
   2225   bfd_seek (abfd, 0, SEEK_SET);
   2226   if (bfd_sym_read_header (abfd, &mdata->header, mdata->version) != 0)
   2227     return -1;
   2228 
   2229   mdata->name_table = bfd_sym_read_name_table (abfd, &mdata->header);
   2230   if (mdata->name_table == NULL)
   2231     return -1;
   2232 
   2233   bfdsec = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   2234   if (bfdsec == NULL)
   2235     return -1;
   2236 
   2237   bfdsec->vma = 0;
   2238   bfdsec->lma = 0;
   2239   bfdsec->size = 0;
   2240   bfdsec->filepos = 0;
   2241   bfdsec->alignment_power = 0;
   2242 
   2243   abfd->tdata.sym_data = mdata;
   2244 
   2245   return 0;
   2246 }
   2247 
   2248 const bfd_target *
   2249 bfd_sym_object_p (bfd *abfd)
   2250 {
   2251   bfd_sym_version version = -1;
   2252   bfd_sym_data_struct *mdata;
   2253 
   2254   bfd_seek (abfd, 0, SEEK_SET);
   2255   if (bfd_sym_read_version (abfd, &version) != 0)
   2256     goto wrong;
   2257 
   2258   mdata = (bfd_sym_data_struct *) bfd_alloc (abfd, sizeof (*mdata));
   2259   if (mdata == NULL)
   2260     goto fail;
   2261 
   2262   if (bfd_sym_scan (abfd, version, mdata) != 0)
   2263     goto wrong;
   2264 
   2265   return abfd->xvec;
   2266 
   2267  wrong:
   2268   bfd_set_error (bfd_error_wrong_format);
   2269 
   2270  fail:
   2271   return NULL;
   2272 }
   2273 
   2274 #define bfd_sym_make_empty_symbol _bfd_generic_make_empty_symbol
   2275 
   2276 void
   2277 bfd_sym_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, asymbol *symbol, symbol_info *ret)
   2278 {
   2279   bfd_symbol_info (symbol, ret);
   2280 }
   2281 
   2282 long
   2283 bfd_sym_get_symtab_upper_bound (bfd *abfd ATTRIBUTE_UNUSED)
   2284 {
   2285   return 0;
   2286 }
   2287 
   2288 long
   2289 bfd_sym_canonicalize_symtab (bfd *abfd ATTRIBUTE_UNUSED, asymbol **sym ATTRIBUTE_UNUSED)
   2290 {
   2291   return 0;
   2292 }
   2293 
   2294 int
   2295 bfd_sym_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
   2296 			struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2297 {
   2298   return 0;
   2299 }
   2300 
   2301 const bfd_target sym_vec =
   2302 {
   2303   "sym",			/* Name.  */
   2304   bfd_target_sym_flavour,	/* Flavour.  */
   2305   BFD_ENDIAN_BIG,		/* Byteorder.  */
   2306   BFD_ENDIAN_BIG,		/* Header byteorder.  */
   2307   (HAS_RELOC | EXEC_P |		/* Object flags.  */
   2308    HAS_LINENO | HAS_DEBUG |
   2309    HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
   2310   (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
   2311    | SEC_ROM | SEC_HAS_CONTENTS), /* Section_flags.  */
   2312   0,				/* Symbol_leading_char.  */
   2313   ' ',				/* AR_pad_char.  */
   2314   16,				/* AR_max_namelen.  */
   2315   0,				/* match priority.  */
   2316   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   2317   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   2318   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
   2319   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   2320   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   2321   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Hdrs.  */
   2322   {				/* bfd_check_format.  */
   2323     _bfd_dummy_target,
   2324     bfd_sym_object_p,		/* bfd_check_format.  */
   2325     _bfd_dummy_target,
   2326     _bfd_dummy_target,
   2327   },
   2328   {				/* bfd_set_format.  */
   2329     bfd_false,
   2330     bfd_sym_mkobject,
   2331     bfd_false,
   2332     bfd_false,
   2333   },
   2334   {				/* bfd_write_contents.  */
   2335     bfd_false,
   2336     bfd_true,
   2337     bfd_false,
   2338     bfd_false,
   2339   },
   2340 
   2341   BFD_JUMP_TABLE_GENERIC (bfd_sym),
   2342   BFD_JUMP_TABLE_COPY (_bfd_generic),
   2343   BFD_JUMP_TABLE_CORE (_bfd_nocore),
   2344   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
   2345   BFD_JUMP_TABLE_SYMBOLS (bfd_sym),
   2346   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
   2347   BFD_JUMP_TABLE_WRITE (bfd_sym),
   2348   BFD_JUMP_TABLE_LINK (bfd_sym),
   2349   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
   2350 
   2351   NULL,
   2352 
   2353   NULL
   2354 };
   2355