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