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