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