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