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