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