1 /* dwarf.c -- display DWARF contents of a BFD binary file 2 Copyright (C) 2005-2016 Free Software Foundation, Inc. 3 4 This file is part of GNU Binutils. 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, MA 19 02110-1301, USA. */ 20 21 #include "sysdep.h" 22 #include "libiberty.h" 23 #include "bfd.h" 24 #include "bfd_stdint.h" 25 #include "bucomm.h" 26 #include "elfcomm.h" 27 #include "elf/common.h" 28 #include "dwarf2.h" 29 #include "dwarf.h" 30 #include "gdb/gdb-index.h" 31 32 static const char *regname (unsigned int regno, int row); 33 34 static int have_frame_base; 35 static int need_base_address; 36 37 static unsigned int last_pointer_size = 0; 38 static int warned_about_missing_comp_units = FALSE; 39 40 static unsigned int num_debug_info_entries = 0; 41 static unsigned int alloc_num_debug_info_entries = 0; 42 static debug_info *debug_information = NULL; 43 /* Special value for num_debug_info_entries to indicate 44 that the .debug_info section could not be loaded/parsed. */ 45 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1 46 47 unsigned int eh_addr_size; 48 49 int do_debug_info; 50 int do_debug_abbrevs; 51 int do_debug_lines; 52 int do_debug_pubnames; 53 int do_debug_pubtypes; 54 int do_debug_aranges; 55 int do_debug_ranges; 56 int do_debug_frames; 57 int do_debug_frames_interp; 58 int do_debug_macinfo; 59 int do_debug_str; 60 int do_debug_loc; 61 int do_gdb_index; 62 int do_trace_info; 63 int do_trace_abbrevs; 64 int do_trace_aranges; 65 int do_debug_addr; 66 int do_debug_cu_index; 67 int do_wide; 68 69 int dwarf_cutoff_level = -1; 70 unsigned long dwarf_start_die; 71 72 int dwarf_check = 0; 73 74 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index 75 sections. For version 1 package files, each set is stored in SHNDX_POOL 76 as a zero-terminated list of section indexes comprising one set of debug 77 sections from a .dwo file. */ 78 79 static int cu_tu_indexes_read = 0; 80 static unsigned int *shndx_pool = NULL; 81 static unsigned int shndx_pool_size = 0; 82 static unsigned int shndx_pool_used = 0; 83 84 /* For version 2 package files, each set contains an array of section offsets 85 and an array of section sizes, giving the offset and size of the 86 contribution from a CU or TU within one of the debug sections. 87 When displaying debug info from a package file, we need to use these 88 tables to locate the corresponding contributions to each section. */ 89 90 struct cu_tu_set 91 { 92 uint64_t signature; 93 dwarf_vma section_offsets[DW_SECT_MAX]; 94 size_t section_sizes[DW_SECT_MAX]; 95 }; 96 97 static int cu_count = 0; 98 static int tu_count = 0; 99 static struct cu_tu_set *cu_sets = NULL; 100 static struct cu_tu_set *tu_sets = NULL; 101 102 static void load_cu_tu_indexes (void *file); 103 104 /* Values for do_debug_lines. */ 105 #define FLAG_DEBUG_LINES_RAW 1 106 #define FLAG_DEBUG_LINES_DECODED 2 107 108 static unsigned int 109 size_of_encoded_value (int encoding) 110 { 111 switch (encoding & 0x7) 112 { 113 default: /* ??? */ 114 case 0: return eh_addr_size; 115 case 2: return 2; 116 case 3: return 4; 117 case 4: return 8; 118 } 119 } 120 121 static dwarf_vma 122 get_encoded_value (unsigned char **pdata, 123 int encoding, 124 struct dwarf_section *section, 125 unsigned char * end) 126 { 127 unsigned char * data = * pdata; 128 unsigned int size = size_of_encoded_value (encoding); 129 dwarf_vma val; 130 131 if (data + size >= end) 132 { 133 warn (_("Encoded value extends past end of section\n")); 134 * pdata = end; 135 return 0; 136 } 137 138 /* PR 17512: file: 002-829853-0.004. */ 139 if (size > 8) 140 { 141 warn (_("Encoded size of %d is too large to read\n"), size); 142 * pdata = end; 143 return 0; 144 } 145 146 /* PR 17512: file: 1085-5603-0.004. */ 147 if (size == 0) 148 { 149 warn (_("Encoded size of 0 is too small to read\n")); 150 * pdata = end; 151 return 0; 152 } 153 154 if (encoding & DW_EH_PE_signed) 155 val = byte_get_signed (data, size); 156 else 157 val = byte_get (data, size); 158 159 if ((encoding & 0x70) == DW_EH_PE_pcrel) 160 val += section->address + (data - section->start); 161 162 * pdata = data + size; 163 return val; 164 } 165 166 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG 167 # ifndef __MINGW32__ 168 # define DWARF_VMA_FMT "ll" 169 # define DWARF_VMA_FMT_LONG "%16.16llx" 170 # else 171 # define DWARF_VMA_FMT "I64" 172 # define DWARF_VMA_FMT_LONG "%016I64x" 173 # endif 174 #else 175 # define DWARF_VMA_FMT "l" 176 # define DWARF_VMA_FMT_LONG "%16.16lx" 177 #endif 178 179 /* Convert a dwarf vma value into a string. Returns a pointer to a static 180 buffer containing the converted VALUE. The value is converted according 181 to the printf formating character FMTCH. If NUM_BYTES is non-zero then 182 it specifies the maximum number of bytes to be displayed in the converted 183 value and FMTCH is ignored - hex is always used. */ 184 185 static const char * 186 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes) 187 { 188 /* As dwarf_vmatoa is used more then once in a printf call 189 for output, we are cycling through an fixed array of pointers 190 for return address. */ 191 static int buf_pos = 0; 192 static struct dwarf_vmatoa_buf 193 { 194 char place[64]; 195 } buf[16]; 196 char *ret; 197 198 ret = buf[buf_pos++].place; 199 buf_pos %= ARRAY_SIZE (buf); 200 201 if (num_bytes) 202 { 203 /* Printf does not have a way of specifiying a maximum field width for an 204 integer value, so we print the full value into a buffer and then select 205 the precision we need. */ 206 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value); 207 if (num_bytes > 8) 208 num_bytes = 8; 209 return ret + (16 - 2 * num_bytes); 210 } 211 else 212 { 213 char fmt[32]; 214 215 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch); 216 snprintf (ret, sizeof (buf[0].place), fmt, value); 217 return ret; 218 } 219 } 220 221 static inline const char * 222 dwarf_vmatoa (const char * fmtch, dwarf_vma value) 223 { 224 return dwarf_vmatoa_1 (fmtch, value, 0); 225 } 226 227 /* Print a dwarf_vma value (typically an address, offset or length) in 228 hexadecimal format, followed by a space. The length of the VALUE (and 229 hence the precision displayed) is determined by the NUM_BYTES parameter. */ 230 231 static void 232 print_dwarf_vma (dwarf_vma value, unsigned num_bytes) 233 { 234 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes)); 235 } 236 237 /* Format a 64-bit value, given as two 32-bit values, in hex. 238 For reentrancy, this uses a buffer provided by the caller. */ 239 240 static const char * 241 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf, 242 unsigned int buf_len) 243 { 244 int len = 0; 245 246 if (hvalue == 0) 247 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue); 248 else 249 { 250 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue); 251 snprintf (buf + len, buf_len - len, 252 "%08" DWARF_VMA_FMT "x", lvalue); 253 } 254 255 return buf; 256 } 257 258 /* Read in a LEB128 encoded value starting at address DATA. 259 If SIGN is true, return a signed LEB128 value. 260 If LENGTH_RETURN is not NULL, return in it the number of bytes read. 261 No bytes will be read at address END or beyond. */ 262 263 dwarf_vma 264 read_leb128 (unsigned char *data, 265 unsigned int *length_return, 266 bfd_boolean sign, 267 const unsigned char * const end) 268 { 269 dwarf_vma result = 0; 270 unsigned int num_read = 0; 271 unsigned int shift = 0; 272 unsigned char byte = 0; 273 274 while (data < end) 275 { 276 byte = *data++; 277 num_read++; 278 279 result |= ((dwarf_vma) (byte & 0x7f)) << shift; 280 281 shift += 7; 282 if ((byte & 0x80) == 0) 283 break; 284 285 /* PR 17512: file: 0ca183b8. 286 FIXME: Should we signal this error somehow ? */ 287 if (shift >= sizeof (result) * 8) 288 break; 289 } 290 291 if (length_return != NULL) 292 *length_return = num_read; 293 294 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) 295 result |= -((dwarf_vma) 1 << shift); 296 297 return result; 298 } 299 300 /* Create a signed version to avoid painful typecasts. */ 301 static inline dwarf_signed_vma 302 read_sleb128 (unsigned char * data, 303 unsigned int * length_return, 304 const unsigned char * const end) 305 { 306 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end); 307 } 308 309 static inline dwarf_vma 310 read_uleb128 (unsigned char * data, 311 unsigned int * length_return, 312 const unsigned char * const end) 313 { 314 return read_leb128 (data, length_return, FALSE, end); 315 } 316 317 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \ 318 do \ 319 { \ 320 unsigned int amount = (AMOUNT); \ 321 if (sizeof (VAL) < amount) \ 322 { \ 323 error (_("internal error: attempt to read %d bytes of data in to %d sized variable"),\ 324 amount, (int) sizeof (VAL)); \ 325 amount = sizeof (VAL); \ 326 } \ 327 if (((PTR) + amount) >= (END)) \ 328 { \ 329 if ((PTR) < (END)) \ 330 amount = (END) - (PTR); \ 331 else \ 332 amount = 0; \ 333 } \ 334 if (amount == 0 || amount > 8) \ 335 VAL = 0; \ 336 else \ 337 VAL = byte_get ((PTR), amount); \ 338 } \ 339 while (0) 340 341 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \ 342 do \ 343 { \ 344 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \ 345 PTR += AMOUNT; \ 346 } \ 347 while (0) 348 349 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \ 350 do \ 351 { \ 352 unsigned int amount = (AMOUNT); \ 353 if (((PTR) + amount) >= (END)) \ 354 { \ 355 if ((PTR) < (END)) \ 356 amount = (END) - (PTR); \ 357 else \ 358 amount = 0; \ 359 } \ 360 if (amount) \ 361 VAL = byte_get_signed ((PTR), amount); \ 362 else \ 363 VAL = 0; \ 364 } \ 365 while (0) 366 367 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \ 368 do \ 369 { \ 370 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \ 371 PTR += AMOUNT; \ 372 } \ 373 while (0) 374 375 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \ 376 do \ 377 { \ 378 if (((PTR) + 8) <= (END)) \ 379 { \ 380 byte_get_64 ((PTR), (HIGH), (LOW)); \ 381 } \ 382 else \ 383 { \ 384 * (LOW) = * (HIGH) = 0; \ 385 } \ 386 } \ 387 while (0) 388 389 typedef struct State_Machine_Registers 390 { 391 dwarf_vma address; 392 unsigned int file; 393 unsigned int line; 394 unsigned int column; 395 unsigned int discriminator; 396 unsigned int context; 397 unsigned int subprogram; 398 int is_stmt; 399 int basic_block; 400 unsigned char op_index; 401 unsigned char end_sequence; 402 /* This variable hold the number of the last entry seen 403 in the File Table. */ 404 unsigned int last_file_entry; 405 } SMR; 406 407 static SMR state_machine_regs; 408 409 static void 410 reset_state_machine (int is_stmt) 411 { 412 state_machine_regs.address = 0; 413 state_machine_regs.op_index = 0; 414 state_machine_regs.file = 1; 415 state_machine_regs.line = 1; 416 state_machine_regs.column = 0; 417 state_machine_regs.discriminator = 0; 418 state_machine_regs.context = 0; 419 state_machine_regs.subprogram = 0; 420 state_machine_regs.is_stmt = is_stmt; 421 state_machine_regs.basic_block = 0; 422 state_machine_regs.end_sequence = 0; 423 state_machine_regs.last_file_entry = 0; 424 } 425 426 /* Build a logicals table for reference when reading the actuals table. */ 427 428 static SMR *logicals_table = NULL; 429 static unsigned int logicals_allocated = 0; 430 static unsigned int logicals_count = 0; 431 432 static void 433 free_logicals (void) 434 { 435 free (logicals_table); 436 logicals_allocated = 0; 437 logicals_count = 0; 438 logicals_table = NULL; 439 } 440 441 static void 442 append_logical (void) 443 { 444 if (logicals_allocated == 0) 445 { 446 logicals_allocated = 4; 447 logicals_table = (SMR *) xmalloc (logicals_allocated * sizeof (SMR)); 448 } 449 if (logicals_count >= logicals_allocated) 450 { 451 logicals_allocated *= 2; 452 logicals_table = (SMR *) 453 xrealloc (logicals_table, logicals_allocated * sizeof (SMR)); 454 } 455 logicals_table[logicals_count++] = state_machine_regs; 456 printf (_("\t\tLogical %u: 0x%s[%u] file %u line %u discrim %u context %u subprog %u is_stmt %d\n"), 457 logicals_count, 458 dwarf_vmatoa ("x", state_machine_regs.address), 459 state_machine_regs.op_index, 460 state_machine_regs.file, 461 state_machine_regs.line, 462 state_machine_regs.discriminator, 463 state_machine_regs.context, 464 state_machine_regs.subprogram, 465 state_machine_regs.is_stmt); 466 } 467 468 /* Handled an extend line op. 469 Returns the number of bytes read. */ 470 471 static int 472 process_extended_line_op (unsigned char * data, 473 int is_stmt, 474 unsigned char * end, 475 int is_logical) 476 { 477 unsigned char op_code; 478 unsigned int bytes_read; 479 unsigned int len; 480 unsigned char *name; 481 unsigned char *orig_data = data; 482 dwarf_vma adr; 483 484 len = read_uleb128 (data, & bytes_read, end); 485 data += bytes_read; 486 487 if (len == 0 || data == end || len > (uintptr_t) (end - data)) 488 { 489 warn (_("Badly formed extended line op encountered!\n")); 490 return bytes_read; 491 } 492 493 len += bytes_read; 494 op_code = *data++; 495 496 printf (_(" Extended opcode %d: "), op_code); 497 498 switch (op_code) 499 { 500 case DW_LNE_end_sequence: 501 printf (_("End of Sequence\n\n")); 502 if (is_logical) 503 append_logical (); 504 reset_state_machine (is_stmt); 505 break; 506 507 case DW_LNE_set_address: 508 /* PR 17512: file: 002-100480-0.004. */ 509 if (len - bytes_read - 1 > 8) 510 { 511 warn (_("Length (%d) of DW_LNE_set_address op is too long\n"), 512 len - bytes_read - 1); 513 adr = 0; 514 } 515 else 516 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end); 517 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr)); 518 state_machine_regs.address = adr; 519 state_machine_regs.op_index = 0; 520 break; 521 522 case DW_LNE_define_file: 523 printf (_("define new File Table entry\n")); 524 printf (_(" Entry\tDir\tTime\tSize\tName\n")); 525 printf (" %d\t", ++state_machine_regs.last_file_entry); 526 527 name = data; 528 data += strnlen ((char *) data, end - data) + 1; 529 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 530 data += bytes_read; 531 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 532 data += bytes_read; 533 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 534 data += bytes_read; 535 printf ("%s\n\n", name); 536 537 if (((unsigned int) (data - orig_data) != len) || data == end) 538 warn (_("DW_LNE_define_file: Bad opcode length\n")); 539 break; 540 541 case DW_LNE_set_discriminator: 542 { 543 unsigned int discrim; 544 545 discrim = read_uleb128 (data, & bytes_read, end); 546 data += bytes_read; 547 printf (_("set Discriminator to %u\n"), discrim); 548 state_machine_regs.discriminator = discrim; 549 } 550 break; 551 552 /* HP extensions. */ 553 case DW_LNE_HP_negate_is_UV_update: 554 printf ("DW_LNE_HP_negate_is_UV_update\n"); 555 break; 556 case DW_LNE_HP_push_context: 557 printf ("DW_LNE_HP_push_context\n"); 558 break; 559 case DW_LNE_HP_pop_context: 560 printf ("DW_LNE_HP_pop_context\n"); 561 break; 562 case DW_LNE_HP_set_file_line_column: 563 printf ("DW_LNE_HP_set_file_line_column\n"); 564 break; 565 case DW_LNE_HP_set_routine_name: 566 printf ("DW_LNE_HP_set_routine_name\n"); 567 break; 568 case DW_LNE_HP_set_sequence: 569 printf ("DW_LNE_HP_set_sequence\n"); 570 break; 571 case DW_LNE_HP_negate_post_semantics: 572 printf ("DW_LNE_HP_negate_post_semantics\n"); 573 break; 574 case DW_LNE_HP_negate_function_exit: 575 printf ("DW_LNE_HP_negate_function_exit\n"); 576 break; 577 case DW_LNE_HP_negate_front_end_logical: 578 printf ("DW_LNE_HP_negate_front_end_logical\n"); 579 break; 580 case DW_LNE_HP_define_proc: 581 printf ("DW_LNE_HP_define_proc\n"); 582 break; 583 case DW_LNE_HP_source_file_correlation: 584 { 585 unsigned char *edata = data + len - bytes_read - 1; 586 587 printf ("DW_LNE_HP_source_file_correlation\n"); 588 589 while (data < edata) 590 { 591 unsigned int opc; 592 593 opc = read_uleb128 (data, & bytes_read, edata); 594 data += bytes_read; 595 596 switch (opc) 597 { 598 case DW_LNE_HP_SFC_formfeed: 599 printf (" DW_LNE_HP_SFC_formfeed\n"); 600 break; 601 case DW_LNE_HP_SFC_set_listing_line: 602 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n", 603 dwarf_vmatoa ("u", 604 read_uleb128 (data, & bytes_read, edata))); 605 data += bytes_read; 606 break; 607 case DW_LNE_HP_SFC_associate: 608 printf (" DW_LNE_HP_SFC_associate "); 609 printf ("(%s", 610 dwarf_vmatoa ("u", 611 read_uleb128 (data, & bytes_read, edata))); 612 data += bytes_read; 613 printf (",%s", 614 dwarf_vmatoa ("u", 615 read_uleb128 (data, & bytes_read, edata))); 616 data += bytes_read; 617 printf (",%s)\n", 618 dwarf_vmatoa ("u", 619 read_uleb128 (data, & bytes_read, edata))); 620 data += bytes_read; 621 break; 622 default: 623 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc); 624 data = edata; 625 break; 626 } 627 } 628 } 629 break; 630 631 default: 632 { 633 unsigned int rlen = len - bytes_read - 1; 634 635 if (op_code >= DW_LNE_lo_user 636 /* The test against DW_LNW_hi_user is redundant due to 637 the limited range of the unsigned char data type used 638 for op_code. */ 639 /*&& op_code <= DW_LNE_hi_user*/) 640 printf (_("user defined: ")); 641 else 642 printf (_("UNKNOWN: ")); 643 printf (_("length %d ["), rlen); 644 for (; rlen; rlen--) 645 printf (" %02x", *data++); 646 printf ("]\n"); 647 } 648 break; 649 } 650 651 return len; 652 } 653 654 static const unsigned char * 655 fetch_indirect_string (dwarf_vma offset) 656 { 657 struct dwarf_section *section = &debug_displays [str].section; 658 659 if (section->start == NULL) 660 return (const unsigned char *) _("<no .debug_str section>"); 661 662 if (offset >= section->size) 663 { 664 warn (_("DW_FORM_strp offset too big: %s\n"), 665 dwarf_vmatoa ("x", offset)); 666 return (const unsigned char *) _("<offset is too big>"); 667 } 668 669 return (const unsigned char *) section->start + offset; 670 } 671 672 static const unsigned char * 673 fetch_indirect_line_string (dwarf_vma offset) 674 { 675 struct dwarf_section *section = &debug_displays [line_str].section; 676 677 if (section->start == NULL) 678 return (const unsigned char *) _("<no .debug_line_str section>"); 679 680 if (offset >= section->size) 681 { 682 warn (_("DW_FORM_line_strp offset too big: %s\n"), 683 dwarf_vmatoa ("x", offset)); 684 return (const unsigned char *) _("<offset is too big>"); 685 } 686 687 return (const unsigned char *) section->start + offset; 688 } 689 690 static const char * 691 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set, 692 dwarf_vma offset_size, int dwo) 693 { 694 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str; 695 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index; 696 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section; 697 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section; 698 dwarf_vma index_offset = idx * offset_size; 699 dwarf_vma str_offset; 700 701 if (index_section->start == NULL) 702 return (dwo ? _("<no .debug_str_offsets.dwo section>") 703 : _("<no .debug_str_offsets section>")); 704 705 if (this_set != NULL) 706 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS]; 707 if (index_offset + offset_size > index_section->size) 708 { 709 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"), 710 dwarf_vmatoa ("x", index_offset)); 711 return _("<index offset is too big>"); 712 } 713 714 if (str_section->start == NULL) 715 return (dwo ? _("<no .debug_str.dwo section>") 716 : _("<no .debug_str section>")); 717 718 str_offset = byte_get (index_section->start + index_offset, offset_size); 719 str_offset -= str_section->address; 720 if (str_offset >= str_section->size) 721 { 722 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"), 723 dwarf_vmatoa ("x", str_offset)); 724 return _("<indirect index offset is too big>"); 725 } 726 727 return (const char *) str_section->start + str_offset; 728 } 729 730 static const char * 731 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes) 732 { 733 struct dwarf_section *section = &debug_displays [debug_addr].section; 734 735 if (section->start == NULL) 736 return (_("<no .debug_addr section>")); 737 738 if (offset + bytes > section->size) 739 { 740 warn (_("Offset into section %s too big: %s\n"), 741 section->name, dwarf_vmatoa ("x", offset)); 742 return "<offset too big>"; 743 } 744 745 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes)); 746 } 747 748 749 /* FIXME: There are better and more efficient ways to handle 750 these structures. For now though, I just want something that 751 is simple to implement. */ 752 typedef struct abbrev_attr 753 { 754 unsigned long attribute; 755 unsigned long form; 756 struct abbrev_attr *next; 757 } 758 abbrev_attr; 759 760 typedef struct abbrev_entry 761 { 762 unsigned long entry; 763 unsigned long tag; 764 int children; 765 struct abbrev_attr *first_attr; 766 struct abbrev_attr *last_attr; 767 struct abbrev_entry *next; 768 } 769 abbrev_entry; 770 771 static abbrev_entry *first_abbrev = NULL; 772 static abbrev_entry *last_abbrev = NULL; 773 774 static void 775 free_abbrevs (void) 776 { 777 abbrev_entry *abbrv; 778 779 for (abbrv = first_abbrev; abbrv;) 780 { 781 abbrev_entry *next_abbrev = abbrv->next; 782 abbrev_attr *attr; 783 784 for (attr = abbrv->first_attr; attr;) 785 { 786 abbrev_attr *next_attr = attr->next; 787 788 free (attr); 789 attr = next_attr; 790 } 791 792 free (abbrv); 793 abbrv = next_abbrev; 794 } 795 796 last_abbrev = first_abbrev = NULL; 797 } 798 799 static void 800 add_abbrev (unsigned long number, unsigned long tag, int children) 801 { 802 abbrev_entry *entry; 803 804 entry = (abbrev_entry *) malloc (sizeof (*entry)); 805 if (entry == NULL) 806 /* ugg */ 807 return; 808 809 entry->entry = number; 810 entry->tag = tag; 811 entry->children = children; 812 entry->first_attr = NULL; 813 entry->last_attr = NULL; 814 entry->next = NULL; 815 816 if (first_abbrev == NULL) 817 first_abbrev = entry; 818 else 819 last_abbrev->next = entry; 820 821 last_abbrev = entry; 822 } 823 824 static void 825 add_abbrev_attr (unsigned long attribute, unsigned long form) 826 { 827 abbrev_attr *attr; 828 829 attr = (abbrev_attr *) malloc (sizeof (*attr)); 830 if (attr == NULL) 831 /* ugg */ 832 return; 833 834 attr->attribute = attribute; 835 attr->form = form; 836 attr->next = NULL; 837 838 if (last_abbrev->first_attr == NULL) 839 last_abbrev->first_attr = attr; 840 else 841 last_abbrev->last_attr->next = attr; 842 843 last_abbrev->last_attr = attr; 844 } 845 846 /* Processes the (partial) contents of a .debug_abbrev section. 847 Returns NULL if the end of the section was encountered. 848 Returns the address after the last byte read if the end of 849 an abbreviation set was found. */ 850 851 static unsigned char * 852 process_abbrev_section (unsigned char *start, unsigned char *end) 853 { 854 if (first_abbrev != NULL) 855 return NULL; 856 857 while (start < end) 858 { 859 unsigned int bytes_read; 860 unsigned long entry; 861 unsigned long tag; 862 unsigned long attribute; 863 int children; 864 865 entry = read_uleb128 (start, & bytes_read, end); 866 start += bytes_read; 867 868 /* A single zero is supposed to end the section according 869 to the standard. If there's more, then signal that to 870 the caller. */ 871 if (start == end) 872 return NULL; 873 if (entry == 0) 874 return start; 875 876 tag = read_uleb128 (start, & bytes_read, end); 877 start += bytes_read; 878 if (start == end) 879 return NULL; 880 881 children = *start++; 882 883 add_abbrev (entry, tag, children); 884 885 do 886 { 887 unsigned long form; 888 889 attribute = read_uleb128 (start, & bytes_read, end); 890 start += bytes_read; 891 if (start == end) 892 break; 893 894 form = read_uleb128 (start, & bytes_read, end); 895 start += bytes_read; 896 if (start == end) 897 break; 898 899 add_abbrev_attr (attribute, form); 900 } 901 while (attribute != 0); 902 } 903 904 /* Report the missing single zero which ends the section. */ 905 error (_(".debug_abbrev section not zero terminated\n")); 906 907 return NULL; 908 } 909 910 static const char * 911 get_TAG_name (unsigned long tag) 912 { 913 const char *name = get_DW_TAG_name ((unsigned int)tag); 914 915 if (name == NULL) 916 { 917 static char buffer[100]; 918 919 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag); 920 return buffer; 921 } 922 923 return name; 924 } 925 926 static const char * 927 get_FORM_name (unsigned long form) 928 { 929 const char *name; 930 931 if (form == 0) 932 return "DW_FORM value: 0"; 933 934 name = get_DW_FORM_name (form); 935 if (name == NULL) 936 { 937 static char buffer[100]; 938 939 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form); 940 return buffer; 941 } 942 943 return name; 944 } 945 946 static unsigned char * 947 display_block (unsigned char *data, 948 dwarf_vma length, 949 const unsigned char * const end) 950 { 951 dwarf_vma maxlen; 952 953 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length)); 954 if (data > end) 955 return (unsigned char *) end; 956 957 maxlen = (dwarf_vma) (end - data); 958 length = length > maxlen ? maxlen : length; 959 960 while (length --) 961 printf ("%lx ", (unsigned long) byte_get (data++, 1)); 962 963 return data; 964 } 965 966 static int 967 decode_location_expression (unsigned char * data, 968 unsigned int pointer_size, 969 unsigned int offset_size, 970 int dwarf_version, 971 dwarf_vma length, 972 dwarf_vma cu_offset, 973 struct dwarf_section * section) 974 { 975 unsigned op; 976 unsigned int bytes_read; 977 dwarf_vma uvalue; 978 dwarf_signed_vma svalue; 979 unsigned char *end = data + length; 980 int need_frame_base = 0; 981 982 while (data < end) 983 { 984 op = *data++; 985 986 switch (op) 987 { 988 case DW_OP_addr: 989 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); 990 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue)); 991 break; 992 case DW_OP_deref: 993 printf ("DW_OP_deref"); 994 break; 995 case DW_OP_const1u: 996 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 997 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue); 998 break; 999 case DW_OP_const1s: 1000 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end); 1001 printf ("DW_OP_const1s: %ld", (long) svalue); 1002 break; 1003 case DW_OP_const2u: 1004 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end); 1005 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue); 1006 break; 1007 case DW_OP_const2s: 1008 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end); 1009 printf ("DW_OP_const2s: %ld", (long) svalue); 1010 break; 1011 case DW_OP_const4u: 1012 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); 1013 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue); 1014 break; 1015 case DW_OP_const4s: 1016 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end); 1017 printf ("DW_OP_const4s: %ld", (long) svalue); 1018 break; 1019 case DW_OP_const8u: 1020 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); 1021 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue); 1022 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); 1023 printf ("%lu", (unsigned long) uvalue); 1024 break; 1025 case DW_OP_const8s: 1026 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end); 1027 printf ("DW_OP_const8s: %ld ", (long) svalue); 1028 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end); 1029 printf ("%ld", (long) svalue); 1030 break; 1031 case DW_OP_constu: 1032 printf ("DW_OP_constu: %s", 1033 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); 1034 data += bytes_read; 1035 break; 1036 case DW_OP_consts: 1037 printf ("DW_OP_consts: %s", 1038 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); 1039 data += bytes_read; 1040 break; 1041 case DW_OP_dup: 1042 printf ("DW_OP_dup"); 1043 break; 1044 case DW_OP_drop: 1045 printf ("DW_OP_drop"); 1046 break; 1047 case DW_OP_over: 1048 printf ("DW_OP_over"); 1049 break; 1050 case DW_OP_pick: 1051 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1052 printf ("DW_OP_pick: %ld", (unsigned long) uvalue); 1053 break; 1054 case DW_OP_swap: 1055 printf ("DW_OP_swap"); 1056 break; 1057 case DW_OP_rot: 1058 printf ("DW_OP_rot"); 1059 break; 1060 case DW_OP_xderef: 1061 printf ("DW_OP_xderef"); 1062 break; 1063 case DW_OP_abs: 1064 printf ("DW_OP_abs"); 1065 break; 1066 case DW_OP_and: 1067 printf ("DW_OP_and"); 1068 break; 1069 case DW_OP_div: 1070 printf ("DW_OP_div"); 1071 break; 1072 case DW_OP_minus: 1073 printf ("DW_OP_minus"); 1074 break; 1075 case DW_OP_mod: 1076 printf ("DW_OP_mod"); 1077 break; 1078 case DW_OP_mul: 1079 printf ("DW_OP_mul"); 1080 break; 1081 case DW_OP_neg: 1082 printf ("DW_OP_neg"); 1083 break; 1084 case DW_OP_not: 1085 printf ("DW_OP_not"); 1086 break; 1087 case DW_OP_or: 1088 printf ("DW_OP_or"); 1089 break; 1090 case DW_OP_plus: 1091 printf ("DW_OP_plus"); 1092 break; 1093 case DW_OP_plus_uconst: 1094 printf ("DW_OP_plus_uconst: %s", 1095 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); 1096 data += bytes_read; 1097 break; 1098 case DW_OP_shl: 1099 printf ("DW_OP_shl"); 1100 break; 1101 case DW_OP_shr: 1102 printf ("DW_OP_shr"); 1103 break; 1104 case DW_OP_shra: 1105 printf ("DW_OP_shra"); 1106 break; 1107 case DW_OP_xor: 1108 printf ("DW_OP_xor"); 1109 break; 1110 case DW_OP_bra: 1111 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end); 1112 printf ("DW_OP_bra: %ld", (long) svalue); 1113 break; 1114 case DW_OP_eq: 1115 printf ("DW_OP_eq"); 1116 break; 1117 case DW_OP_ge: 1118 printf ("DW_OP_ge"); 1119 break; 1120 case DW_OP_gt: 1121 printf ("DW_OP_gt"); 1122 break; 1123 case DW_OP_le: 1124 printf ("DW_OP_le"); 1125 break; 1126 case DW_OP_lt: 1127 printf ("DW_OP_lt"); 1128 break; 1129 case DW_OP_ne: 1130 printf ("DW_OP_ne"); 1131 break; 1132 case DW_OP_skip: 1133 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end); 1134 printf ("DW_OP_skip: %ld", (long) svalue); 1135 break; 1136 1137 case DW_OP_lit0: 1138 case DW_OP_lit1: 1139 case DW_OP_lit2: 1140 case DW_OP_lit3: 1141 case DW_OP_lit4: 1142 case DW_OP_lit5: 1143 case DW_OP_lit6: 1144 case DW_OP_lit7: 1145 case DW_OP_lit8: 1146 case DW_OP_lit9: 1147 case DW_OP_lit10: 1148 case DW_OP_lit11: 1149 case DW_OP_lit12: 1150 case DW_OP_lit13: 1151 case DW_OP_lit14: 1152 case DW_OP_lit15: 1153 case DW_OP_lit16: 1154 case DW_OP_lit17: 1155 case DW_OP_lit18: 1156 case DW_OP_lit19: 1157 case DW_OP_lit20: 1158 case DW_OP_lit21: 1159 case DW_OP_lit22: 1160 case DW_OP_lit23: 1161 case DW_OP_lit24: 1162 case DW_OP_lit25: 1163 case DW_OP_lit26: 1164 case DW_OP_lit27: 1165 case DW_OP_lit28: 1166 case DW_OP_lit29: 1167 case DW_OP_lit30: 1168 case DW_OP_lit31: 1169 printf ("DW_OP_lit%d", op - DW_OP_lit0); 1170 break; 1171 1172 case DW_OP_reg0: 1173 case DW_OP_reg1: 1174 case DW_OP_reg2: 1175 case DW_OP_reg3: 1176 case DW_OP_reg4: 1177 case DW_OP_reg5: 1178 case DW_OP_reg6: 1179 case DW_OP_reg7: 1180 case DW_OP_reg8: 1181 case DW_OP_reg9: 1182 case DW_OP_reg10: 1183 case DW_OP_reg11: 1184 case DW_OP_reg12: 1185 case DW_OP_reg13: 1186 case DW_OP_reg14: 1187 case DW_OP_reg15: 1188 case DW_OP_reg16: 1189 case DW_OP_reg17: 1190 case DW_OP_reg18: 1191 case DW_OP_reg19: 1192 case DW_OP_reg20: 1193 case DW_OP_reg21: 1194 case DW_OP_reg22: 1195 case DW_OP_reg23: 1196 case DW_OP_reg24: 1197 case DW_OP_reg25: 1198 case DW_OP_reg26: 1199 case DW_OP_reg27: 1200 case DW_OP_reg28: 1201 case DW_OP_reg29: 1202 case DW_OP_reg30: 1203 case DW_OP_reg31: 1204 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0, 1205 regname (op - DW_OP_reg0, 1)); 1206 break; 1207 1208 case DW_OP_breg0: 1209 case DW_OP_breg1: 1210 case DW_OP_breg2: 1211 case DW_OP_breg3: 1212 case DW_OP_breg4: 1213 case DW_OP_breg5: 1214 case DW_OP_breg6: 1215 case DW_OP_breg7: 1216 case DW_OP_breg8: 1217 case DW_OP_breg9: 1218 case DW_OP_breg10: 1219 case DW_OP_breg11: 1220 case DW_OP_breg12: 1221 case DW_OP_breg13: 1222 case DW_OP_breg14: 1223 case DW_OP_breg15: 1224 case DW_OP_breg16: 1225 case DW_OP_breg17: 1226 case DW_OP_breg18: 1227 case DW_OP_breg19: 1228 case DW_OP_breg20: 1229 case DW_OP_breg21: 1230 case DW_OP_breg22: 1231 case DW_OP_breg23: 1232 case DW_OP_breg24: 1233 case DW_OP_breg25: 1234 case DW_OP_breg26: 1235 case DW_OP_breg27: 1236 case DW_OP_breg28: 1237 case DW_OP_breg29: 1238 case DW_OP_breg30: 1239 case DW_OP_breg31: 1240 printf ("DW_OP_breg%d (%s): %s", 1241 op - DW_OP_breg0, 1242 regname (op - DW_OP_breg0, 1), 1243 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); 1244 data += bytes_read; 1245 break; 1246 1247 case DW_OP_regx: 1248 uvalue = read_uleb128 (data, &bytes_read, end); 1249 data += bytes_read; 1250 printf ("DW_OP_regx: %s (%s)", 1251 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1)); 1252 break; 1253 case DW_OP_fbreg: 1254 need_frame_base = 1; 1255 printf ("DW_OP_fbreg: %s", 1256 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); 1257 data += bytes_read; 1258 break; 1259 case DW_OP_bregx: 1260 uvalue = read_uleb128 (data, &bytes_read, end); 1261 data += bytes_read; 1262 printf ("DW_OP_bregx: %s (%s) %s", 1263 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1), 1264 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); 1265 data += bytes_read; 1266 break; 1267 case DW_OP_piece: 1268 printf ("DW_OP_piece: %s", 1269 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); 1270 data += bytes_read; 1271 break; 1272 case DW_OP_deref_size: 1273 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1274 printf ("DW_OP_deref_size: %ld", (long) uvalue); 1275 break; 1276 case DW_OP_xderef_size: 1277 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1278 printf ("DW_OP_xderef_size: %ld", (long) uvalue); 1279 break; 1280 case DW_OP_nop: 1281 printf ("DW_OP_nop"); 1282 break; 1283 1284 /* DWARF 3 extensions. */ 1285 case DW_OP_push_object_address: 1286 printf ("DW_OP_push_object_address"); 1287 break; 1288 case DW_OP_call2: 1289 /* XXX: Strictly speaking for 64-bit DWARF3 files 1290 this ought to be an 8-byte wide computation. */ 1291 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end); 1292 printf ("DW_OP_call2: <0x%s>", 1293 dwarf_vmatoa ("x", svalue + cu_offset)); 1294 break; 1295 case DW_OP_call4: 1296 /* XXX: Strictly speaking for 64-bit DWARF3 files 1297 this ought to be an 8-byte wide computation. */ 1298 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end); 1299 printf ("DW_OP_call4: <0x%s>", 1300 dwarf_vmatoa ("x", svalue + cu_offset)); 1301 break; 1302 case DW_OP_call_ref: 1303 /* XXX: Strictly speaking for 64-bit DWARF3 files 1304 this ought to be an 8-byte wide computation. */ 1305 if (dwarf_version == -1) 1306 { 1307 printf (_("(DW_OP_call_ref in frame info)")); 1308 /* No way to tell where the next op is, so just bail. */ 1309 return need_frame_base; 1310 } 1311 if (dwarf_version == 2) 1312 { 1313 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); 1314 } 1315 else 1316 { 1317 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); 1318 } 1319 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue)); 1320 break; 1321 case DW_OP_form_tls_address: 1322 printf ("DW_OP_form_tls_address"); 1323 break; 1324 case DW_OP_call_frame_cfa: 1325 printf ("DW_OP_call_frame_cfa"); 1326 break; 1327 case DW_OP_bit_piece: 1328 printf ("DW_OP_bit_piece: "); 1329 printf (_("size: %s "), 1330 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); 1331 data += bytes_read; 1332 printf (_("offset: %s "), 1333 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); 1334 data += bytes_read; 1335 break; 1336 1337 /* DWARF 4 extensions. */ 1338 case DW_OP_stack_value: 1339 printf ("DW_OP_stack_value"); 1340 break; 1341 1342 case DW_OP_implicit_value: 1343 printf ("DW_OP_implicit_value"); 1344 uvalue = read_uleb128 (data, &bytes_read, end); 1345 data += bytes_read; 1346 data = display_block (data, uvalue, end); 1347 break; 1348 1349 /* GNU extensions. */ 1350 case DW_OP_GNU_push_tls_address: 1351 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown")); 1352 break; 1353 case DW_OP_GNU_uninit: 1354 printf ("DW_OP_GNU_uninit"); 1355 /* FIXME: Is there data associated with this OP ? */ 1356 break; 1357 case DW_OP_GNU_encoded_addr: 1358 { 1359 int encoding = 0; 1360 dwarf_vma addr; 1361 1362 if (data < end) 1363 encoding = *data++; 1364 addr = get_encoded_value (&data, encoding, section, end); 1365 1366 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding); 1367 print_dwarf_vma (addr, pointer_size); 1368 } 1369 break; 1370 case DW_OP_GNU_implicit_pointer: 1371 /* XXX: Strictly speaking for 64-bit DWARF3 files 1372 this ought to be an 8-byte wide computation. */ 1373 if (dwarf_version == -1) 1374 { 1375 printf (_("(DW_OP_GNU_implicit_pointer in frame info)")); 1376 /* No way to tell where the next op is, so just bail. */ 1377 return need_frame_base; 1378 } 1379 if (dwarf_version == 2) 1380 { 1381 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); 1382 } 1383 else 1384 { 1385 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); 1386 } 1387 printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s", 1388 dwarf_vmatoa ("x", uvalue), 1389 dwarf_vmatoa ("d", read_sleb128 (data, 1390 &bytes_read, end))); 1391 data += bytes_read; 1392 break; 1393 case DW_OP_GNU_entry_value: 1394 uvalue = read_uleb128 (data, &bytes_read, end); 1395 data += bytes_read; 1396 /* PR 17531: file: 0cc9cd00. */ 1397 if (uvalue > (dwarf_vma) (end - data)) 1398 uvalue = end - data; 1399 printf ("DW_OP_GNU_entry_value: ("); 1400 if (decode_location_expression (data, pointer_size, offset_size, 1401 dwarf_version, uvalue, 1402 cu_offset, section)) 1403 need_frame_base = 1; 1404 putchar (')'); 1405 data += uvalue; 1406 if (data > end) 1407 data = end; 1408 break; 1409 case DW_OP_GNU_const_type: 1410 uvalue = read_uleb128 (data, &bytes_read, end); 1411 data += bytes_read; 1412 printf ("DW_OP_GNU_const_type: <0x%s> ", 1413 dwarf_vmatoa ("x", cu_offset + uvalue)); 1414 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1415 data = display_block (data, uvalue, end); 1416 break; 1417 case DW_OP_GNU_regval_type: 1418 uvalue = read_uleb128 (data, &bytes_read, end); 1419 data += bytes_read; 1420 printf ("DW_OP_GNU_regval_type: %s (%s)", 1421 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1)); 1422 uvalue = read_uleb128 (data, &bytes_read, end); 1423 data += bytes_read; 1424 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue)); 1425 break; 1426 case DW_OP_GNU_deref_type: 1427 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1428 printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue); 1429 uvalue = read_uleb128 (data, &bytes_read, end); 1430 data += bytes_read; 1431 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue)); 1432 break; 1433 case DW_OP_GNU_convert: 1434 uvalue = read_uleb128 (data, &bytes_read, end); 1435 data += bytes_read; 1436 printf ("DW_OP_GNU_convert <0x%s>", 1437 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0)); 1438 break; 1439 case DW_OP_GNU_reinterpret: 1440 uvalue = read_uleb128 (data, &bytes_read, end); 1441 data += bytes_read; 1442 printf ("DW_OP_GNU_reinterpret <0x%s>", 1443 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0)); 1444 break; 1445 case DW_OP_GNU_parameter_ref: 1446 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); 1447 printf ("DW_OP_GNU_parameter_ref: <0x%s>", 1448 dwarf_vmatoa ("x", cu_offset + uvalue)); 1449 break; 1450 case DW_OP_GNU_addr_index: 1451 uvalue = read_uleb128 (data, &bytes_read, end); 1452 data += bytes_read; 1453 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue)); 1454 break; 1455 case DW_OP_GNU_const_index: 1456 uvalue = read_uleb128 (data, &bytes_read, end); 1457 data += bytes_read; 1458 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue)); 1459 break; 1460 1461 /* HP extensions. */ 1462 case DW_OP_HP_is_value: 1463 printf ("DW_OP_HP_is_value"); 1464 /* FIXME: Is there data associated with this OP ? */ 1465 break; 1466 case DW_OP_HP_fltconst4: 1467 printf ("DW_OP_HP_fltconst4"); 1468 /* FIXME: Is there data associated with this OP ? */ 1469 break; 1470 case DW_OP_HP_fltconst8: 1471 printf ("DW_OP_HP_fltconst8"); 1472 /* FIXME: Is there data associated with this OP ? */ 1473 break; 1474 case DW_OP_HP_mod_range: 1475 printf ("DW_OP_HP_mod_range"); 1476 /* FIXME: Is there data associated with this OP ? */ 1477 break; 1478 case DW_OP_HP_unmod_range: 1479 printf ("DW_OP_HP_unmod_range"); 1480 /* FIXME: Is there data associated with this OP ? */ 1481 break; 1482 case DW_OP_HP_tls: 1483 printf ("DW_OP_HP_tls"); 1484 /* FIXME: Is there data associated with this OP ? */ 1485 break; 1486 1487 /* PGI (STMicroelectronics) extensions. */ 1488 case DW_OP_PGI_omp_thread_num: 1489 /* Pushes the thread number for the current thread as it would be 1490 returned by the standard OpenMP library function: 1491 omp_get_thread_num(). The "current thread" is the thread for 1492 which the expression is being evaluated. */ 1493 printf ("DW_OP_PGI_omp_thread_num"); 1494 break; 1495 1496 default: 1497 if (op >= DW_OP_lo_user 1498 && op <= DW_OP_hi_user) 1499 printf (_("(User defined location op)")); 1500 else 1501 printf (_("(Unknown location op)")); 1502 /* No way to tell where the next op is, so just bail. */ 1503 return need_frame_base; 1504 } 1505 1506 /* Separate the ops. */ 1507 if (data < end) 1508 printf ("; "); 1509 } 1510 1511 return need_frame_base; 1512 } 1513 1514 /* Find the CU or TU set corresponding to the given CU_OFFSET. 1515 This is used for DWARF package files. */ 1516 1517 static struct cu_tu_set * 1518 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types) 1519 { 1520 struct cu_tu_set *p; 1521 unsigned int nsets; 1522 unsigned int dw_sect; 1523 1524 if (do_types) 1525 { 1526 p = tu_sets; 1527 nsets = tu_count; 1528 dw_sect = DW_SECT_TYPES; 1529 } 1530 else 1531 { 1532 p = cu_sets; 1533 nsets = cu_count; 1534 dw_sect = DW_SECT_INFO; 1535 } 1536 while (nsets > 0) 1537 { 1538 if (p->section_offsets [dw_sect] == cu_offset) 1539 return p; 1540 p++; 1541 nsets--; 1542 } 1543 return NULL; 1544 } 1545 1546 /* Add INC to HIGH_BITS:LOW_BITS. */ 1547 static void 1548 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc) 1549 { 1550 dwarf_vma tmp = * low_bits; 1551 1552 tmp += inc; 1553 1554 /* FIXME: There is probably a better way of handling this: 1555 1556 We need to cope with dwarf_vma being a 32-bit or 64-bit 1557 type. Plus regardless of its size LOW_BITS is meant to 1558 only hold 32-bits, so if there is overflow or wrap around 1559 we must propagate into HIGH_BITS. */ 1560 if (tmp < * low_bits) 1561 { 1562 ++ * high_bits; 1563 } 1564 else if (sizeof (tmp) > 8 1565 && (tmp >> 31) > 1) 1566 { 1567 ++ * high_bits; 1568 tmp &= 0xFFFFFFFF; 1569 } 1570 1571 * low_bits = tmp; 1572 } 1573 1574 static unsigned char * 1575 read_and_display_attr_value (unsigned long attribute, 1576 unsigned long form, 1577 unsigned char * data, 1578 unsigned char * end, 1579 dwarf_vma cu_offset, 1580 dwarf_vma pointer_size, 1581 dwarf_vma offset_size, 1582 int dwarf_version, 1583 debug_info * debug_info_p, 1584 int do_loc, 1585 struct dwarf_section * section, 1586 struct cu_tu_set * this_set) 1587 { 1588 dwarf_vma uvalue = 0; 1589 unsigned char *block_start = NULL; 1590 unsigned char * orig_data = data; 1591 unsigned int bytes_read; 1592 1593 if (data > end || (data == end && form != DW_FORM_flag_present)) 1594 { 1595 warn (_("Corrupt attribute\n")); 1596 return data; 1597 } 1598 1599 switch (form) 1600 { 1601 default: 1602 break; 1603 1604 case DW_FORM_ref_addr: 1605 if (dwarf_version == 2) 1606 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); 1607 else if (dwarf_version == 3 || dwarf_version == 4) 1608 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); 1609 else 1610 error (_("Internal error: DWARF version is not 2, 3 or 4.\n")); 1611 1612 break; 1613 1614 case DW_FORM_addr: 1615 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); 1616 break; 1617 1618 case DW_FORM_strp: 1619 case DW_FORM_sec_offset: 1620 case DW_FORM_GNU_ref_alt: 1621 case DW_FORM_GNU_strp_alt: 1622 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); 1623 break; 1624 1625 case DW_FORM_flag_present: 1626 uvalue = 1; 1627 break; 1628 1629 case DW_FORM_ref1: 1630 case DW_FORM_flag: 1631 case DW_FORM_data1: 1632 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); 1633 break; 1634 1635 case DW_FORM_ref2: 1636 case DW_FORM_data2: 1637 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end); 1638 break; 1639 1640 case DW_FORM_ref4: 1641 case DW_FORM_data4: 1642 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); 1643 break; 1644 1645 case DW_FORM_sdata: 1646 uvalue = read_sleb128 (data, & bytes_read, end); 1647 data += bytes_read; 1648 break; 1649 1650 case DW_FORM_GNU_str_index: 1651 uvalue = read_uleb128 (data, & bytes_read, end); 1652 data += bytes_read; 1653 break; 1654 1655 case DW_FORM_ref_udata: 1656 case DW_FORM_udata: 1657 uvalue = read_uleb128 (data, & bytes_read, end); 1658 data += bytes_read; 1659 break; 1660 1661 case DW_FORM_indirect: 1662 form = read_uleb128 (data, & bytes_read, end); 1663 data += bytes_read; 1664 if (!do_loc) 1665 printf (" %s", get_FORM_name (form)); 1666 return read_and_display_attr_value (attribute, form, data, end, 1667 cu_offset, pointer_size, 1668 offset_size, dwarf_version, 1669 debug_info_p, do_loc, 1670 section, this_set); 1671 case DW_FORM_GNU_addr_index: 1672 uvalue = read_uleb128 (data, & bytes_read, end); 1673 data += bytes_read; 1674 break; 1675 } 1676 1677 switch (form) 1678 { 1679 case DW_FORM_ref_addr: 1680 if (!do_loc) 1681 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue)); 1682 break; 1683 1684 case DW_FORM_GNU_ref_alt: 1685 if (!do_loc) 1686 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue)); 1687 break; 1688 1689 case DW_FORM_ref1: 1690 case DW_FORM_ref2: 1691 case DW_FORM_ref4: 1692 case DW_FORM_ref_udata: 1693 if (!do_loc) 1694 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset)); 1695 break; 1696 1697 case DW_FORM_data4: 1698 case DW_FORM_addr: 1699 case DW_FORM_sec_offset: 1700 if (!do_loc) 1701 printf (" 0x%s", dwarf_vmatoa ("x", uvalue)); 1702 break; 1703 1704 case DW_FORM_flag_present: 1705 case DW_FORM_flag: 1706 case DW_FORM_data1: 1707 case DW_FORM_data2: 1708 case DW_FORM_sdata: 1709 case DW_FORM_udata: 1710 if (!do_loc) 1711 printf (" %s", dwarf_vmatoa ("d", uvalue)); 1712 break; 1713 1714 case DW_FORM_ref8: 1715 case DW_FORM_data8: 1716 if (!do_loc) 1717 { 1718 dwarf_vma high_bits; 1719 dwarf_vma utmp; 1720 char buf[64]; 1721 1722 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end); 1723 utmp = uvalue; 1724 if (form == DW_FORM_ref8) 1725 add64 (& high_bits, & utmp, cu_offset); 1726 printf (" 0x%s", 1727 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf))); 1728 } 1729 1730 if ((do_loc || do_debug_loc || do_debug_ranges) 1731 && num_debug_info_entries == 0) 1732 { 1733 if (sizeof (uvalue) == 8) 1734 SAFE_BYTE_GET (uvalue, data, 8, end); 1735 else 1736 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n")); 1737 } 1738 1739 data += 8; 1740 break; 1741 1742 case DW_FORM_string: 1743 if (!do_loc) 1744 printf (" %.*s", (int) (end - data), data); 1745 data += strnlen ((char *) data, end - data) + 1; 1746 break; 1747 1748 case DW_FORM_block: 1749 case DW_FORM_exprloc: 1750 uvalue = read_uleb128 (data, & bytes_read, end); 1751 block_start = data + bytes_read; 1752 if (block_start >= end) 1753 { 1754 warn (_("Block ends prematurely\n")); 1755 uvalue = 0; 1756 block_start = end; 1757 } 1758 /* FIXME: Testing "(block_start + uvalue) < block_start" miscompiles with 1759 gcc 4.8.3 running on an x86_64 host in 32-bit mode. So we pre-compute 1760 block_start + uvalue here. */ 1761 data = block_start + uvalue; 1762 /* PR 17512: file: 008-103549-0.001:0.1. */ 1763 if (block_start + uvalue > end || data < block_start) 1764 { 1765 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue); 1766 uvalue = end - block_start; 1767 } 1768 if (do_loc) 1769 data = block_start + uvalue; 1770 else 1771 data = display_block (block_start, uvalue, end); 1772 break; 1773 1774 case DW_FORM_block1: 1775 SAFE_BYTE_GET (uvalue, data, 1, end); 1776 block_start = data + 1; 1777 if (block_start >= end) 1778 { 1779 warn (_("Block ends prematurely\n")); 1780 uvalue = 0; 1781 block_start = end; 1782 } 1783 data = block_start + uvalue; 1784 if (block_start + uvalue > end || data < block_start) 1785 { 1786 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue); 1787 uvalue = end - block_start; 1788 } 1789 if (do_loc) 1790 data = block_start + uvalue; 1791 else 1792 data = display_block (block_start, uvalue, end); 1793 break; 1794 1795 case DW_FORM_block2: 1796 SAFE_BYTE_GET (uvalue, data, 2, end); 1797 block_start = data + 2; 1798 if (block_start >= end) 1799 { 1800 warn (_("Block ends prematurely\n")); 1801 uvalue = 0; 1802 block_start = end; 1803 } 1804 data = block_start + uvalue; 1805 if (block_start + uvalue > end || data < block_start) 1806 { 1807 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue); 1808 uvalue = end - block_start; 1809 } 1810 if (do_loc) 1811 data = block_start + uvalue; 1812 else 1813 data = display_block (block_start, uvalue, end); 1814 break; 1815 1816 case DW_FORM_block4: 1817 SAFE_BYTE_GET (uvalue, data, 4, end); 1818 block_start = data + 4; 1819 /* PR 17512: file: 3371-3907-0.004. */ 1820 if (block_start >= end) 1821 { 1822 warn (_("Block ends prematurely\n")); 1823 uvalue = 0; 1824 block_start = end; 1825 } 1826 data = block_start + uvalue; 1827 if (block_start + uvalue > end 1828 /* PR 17531: file: 5b5f0592. */ 1829 || data < block_start) 1830 { 1831 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue); 1832 uvalue = end - block_start; 1833 } 1834 if (do_loc) 1835 data = block_start + uvalue; 1836 else 1837 data = display_block (block_start, uvalue, end); 1838 break; 1839 1840 case DW_FORM_strp: 1841 if (!do_loc) 1842 printf (_(" (indirect string, offset: 0x%s): %s"), 1843 dwarf_vmatoa ("x", uvalue), 1844 fetch_indirect_string (uvalue)); 1845 break; 1846 1847 case DW_FORM_GNU_str_index: 1848 if (!do_loc) 1849 { 1850 const char *suffix = strrchr (section->name, '.'); 1851 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0; 1852 1853 printf (_(" (indexed string: 0x%s): %s"), 1854 dwarf_vmatoa ("x", uvalue), 1855 fetch_indexed_string (uvalue, this_set, offset_size, dwo)); 1856 } 1857 break; 1858 1859 case DW_FORM_GNU_strp_alt: 1860 if (!do_loc) 1861 printf (_(" (alt indirect string, offset: 0x%s)"), 1862 dwarf_vmatoa ("x", uvalue)); 1863 break; 1864 1865 case DW_FORM_indirect: 1866 /* Handled above. */ 1867 break; 1868 1869 case DW_FORM_ref_sig8: 1870 if (!do_loc) 1871 { 1872 dwarf_vma high_bits; 1873 char buf[64]; 1874 1875 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end); 1876 printf (" signature: 0x%s", 1877 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf))); 1878 } 1879 data += 8; 1880 break; 1881 1882 case DW_FORM_GNU_addr_index: 1883 if (!do_loc) 1884 printf (_(" (addr_index: 0x%s): %s"), 1885 dwarf_vmatoa ("x", uvalue), 1886 fetch_indexed_value (uvalue * pointer_size, pointer_size)); 1887 break; 1888 1889 default: 1890 warn (_("Unrecognized form: %lu\n"), form); 1891 break; 1892 } 1893 1894 if ((do_loc || do_debug_loc || do_debug_ranges) 1895 && num_debug_info_entries == 0 1896 && debug_info_p != NULL) 1897 { 1898 switch (attribute) 1899 { 1900 case DW_AT_frame_base: 1901 have_frame_base = 1; 1902 case DW_AT_location: 1903 case DW_AT_string_length: 1904 case DW_AT_return_addr: 1905 case DW_AT_data_member_location: 1906 case DW_AT_vtable_elem_location: 1907 case DW_AT_segment: 1908 case DW_AT_static_link: 1909 case DW_AT_use_location: 1910 case DW_AT_GNU_call_site_value: 1911 case DW_AT_GNU_call_site_data_value: 1912 case DW_AT_GNU_call_site_target: 1913 case DW_AT_GNU_call_site_target_clobbered: 1914 if ((dwarf_version < 4 1915 && (form == DW_FORM_data4 || form == DW_FORM_data8)) 1916 || form == DW_FORM_sec_offset) 1917 { 1918 /* Process location list. */ 1919 unsigned int lmax = debug_info_p->max_loc_offsets; 1920 unsigned int num = debug_info_p->num_loc_offsets; 1921 1922 if (lmax == 0 || num >= lmax) 1923 { 1924 lmax += 1024; 1925 debug_info_p->loc_offsets = (dwarf_vma *) 1926 xcrealloc (debug_info_p->loc_offsets, 1927 lmax, sizeof (*debug_info_p->loc_offsets)); 1928 debug_info_p->have_frame_base = (int *) 1929 xcrealloc (debug_info_p->have_frame_base, 1930 lmax, sizeof (*debug_info_p->have_frame_base)); 1931 debug_info_p->max_loc_offsets = lmax; 1932 } 1933 if (this_set != NULL) 1934 uvalue += this_set->section_offsets [DW_SECT_LOC]; 1935 debug_info_p->loc_offsets [num] = uvalue; 1936 debug_info_p->have_frame_base [num] = have_frame_base; 1937 debug_info_p->num_loc_offsets++; 1938 } 1939 break; 1940 1941 case DW_AT_low_pc: 1942 if (need_base_address) 1943 debug_info_p->base_address = uvalue; 1944 break; 1945 1946 case DW_AT_GNU_addr_base: 1947 debug_info_p->addr_base = uvalue; 1948 break; 1949 1950 case DW_AT_GNU_ranges_base: 1951 debug_info_p->ranges_base = uvalue; 1952 break; 1953 1954 case DW_AT_ranges: 1955 if ((dwarf_version < 4 1956 && (form == DW_FORM_data4 || form == DW_FORM_data8)) 1957 || form == DW_FORM_sec_offset) 1958 { 1959 /* Process range list. */ 1960 unsigned int lmax = debug_info_p->max_range_lists; 1961 unsigned int num = debug_info_p->num_range_lists; 1962 1963 if (lmax == 0 || num >= lmax) 1964 { 1965 lmax += 1024; 1966 debug_info_p->range_lists = (dwarf_vma *) 1967 xcrealloc (debug_info_p->range_lists, 1968 lmax, sizeof (*debug_info_p->range_lists)); 1969 debug_info_p->max_range_lists = lmax; 1970 } 1971 debug_info_p->range_lists [num] = uvalue; 1972 debug_info_p->num_range_lists++; 1973 } 1974 break; 1975 1976 default: 1977 break; 1978 } 1979 } 1980 1981 if (do_loc || attribute == 0) 1982 return data; 1983 1984 /* For some attributes we can display further information. */ 1985 switch (attribute) 1986 { 1987 case DW_AT_inline: 1988 printf ("\t"); 1989 switch (uvalue) 1990 { 1991 case DW_INL_not_inlined: 1992 printf (_("(not inlined)")); 1993 break; 1994 case DW_INL_inlined: 1995 printf (_("(inlined)")); 1996 break; 1997 case DW_INL_declared_not_inlined: 1998 printf (_("(declared as inline but ignored)")); 1999 break; 2000 case DW_INL_declared_inlined: 2001 printf (_("(declared as inline and inlined)")); 2002 break; 2003 default: 2004 printf (_(" (Unknown inline attribute value: %s)"), 2005 dwarf_vmatoa ("x", uvalue)); 2006 break; 2007 } 2008 break; 2009 2010 case DW_AT_language: 2011 printf ("\t"); 2012 switch (uvalue) 2013 { 2014 /* Ordered by the numeric value of these constants. */ 2015 case DW_LANG_C89: printf ("(ANSI C)"); break; 2016 case DW_LANG_C: printf ("(non-ANSI C)"); break; 2017 case DW_LANG_Ada83: printf ("(Ada)"); break; 2018 case DW_LANG_C_plus_plus: printf ("(C++)"); break; 2019 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break; 2020 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break; 2021 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break; 2022 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break; 2023 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break; 2024 case DW_LANG_Modula2: printf ("(Modula 2)"); break; 2025 /* DWARF 2.1 values. */ 2026 case DW_LANG_Java: printf ("(Java)"); break; 2027 case DW_LANG_C99: printf ("(ANSI C99)"); break; 2028 case DW_LANG_Ada95: printf ("(ADA 95)"); break; 2029 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break; 2030 /* DWARF 3 values. */ 2031 case DW_LANG_PLI: printf ("(PLI)"); break; 2032 case DW_LANG_ObjC: printf ("(Objective C)"); break; 2033 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break; 2034 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break; 2035 case DW_LANG_D: printf ("(D)"); break; 2036 /* DWARF 4 values. */ 2037 case DW_LANG_Python: printf ("(Python)"); break; 2038 /* DWARF 5 values. */ 2039 case DW_LANG_Go: printf ("(Go)"); break; 2040 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break; 2041 case DW_LANG_C11: printf ("(C11)"); break; 2042 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break; 2043 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break; 2044 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break; 2045 /* MIPS extension. */ 2046 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break; 2047 /* UPC extension. */ 2048 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break; 2049 default: 2050 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user) 2051 printf (_("(implementation defined: %s)"), 2052 dwarf_vmatoa ("x", uvalue)); 2053 else 2054 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue)); 2055 break; 2056 } 2057 break; 2058 2059 case DW_AT_encoding: 2060 printf ("\t"); 2061 switch (uvalue) 2062 { 2063 case DW_ATE_void: printf ("(void)"); break; 2064 case DW_ATE_address: printf ("(machine address)"); break; 2065 case DW_ATE_boolean: printf ("(boolean)"); break; 2066 case DW_ATE_complex_float: printf ("(complex float)"); break; 2067 case DW_ATE_float: printf ("(float)"); break; 2068 case DW_ATE_signed: printf ("(signed)"); break; 2069 case DW_ATE_signed_char: printf ("(signed char)"); break; 2070 case DW_ATE_unsigned: printf ("(unsigned)"); break; 2071 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break; 2072 /* DWARF 2.1 values: */ 2073 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break; 2074 case DW_ATE_decimal_float: printf ("(decimal float)"); break; 2075 /* DWARF 3 values: */ 2076 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break; 2077 case DW_ATE_numeric_string: printf ("(numeric_string)"); break; 2078 case DW_ATE_edited: printf ("(edited)"); break; 2079 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break; 2080 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break; 2081 /* HP extensions: */ 2082 case DW_ATE_HP_float80: printf ("(HP_float80)"); break; 2083 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break; 2084 case DW_ATE_HP_float128: printf ("(HP_float128)"); break; 2085 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break; 2086 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break; 2087 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break; 2088 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break; 2089 /* DWARF 4 values: */ 2090 case DW_ATE_UTF: printf ("(unicode string)"); break; 2091 2092 default: 2093 if (uvalue >= DW_ATE_lo_user 2094 && uvalue <= DW_ATE_hi_user) 2095 printf (_("(user defined type)")); 2096 else 2097 printf (_("(unknown type)")); 2098 break; 2099 } 2100 break; 2101 2102 case DW_AT_accessibility: 2103 printf ("\t"); 2104 switch (uvalue) 2105 { 2106 case DW_ACCESS_public: printf ("(public)"); break; 2107 case DW_ACCESS_protected: printf ("(protected)"); break; 2108 case DW_ACCESS_private: printf ("(private)"); break; 2109 default: 2110 printf (_("(unknown accessibility)")); 2111 break; 2112 } 2113 break; 2114 2115 case DW_AT_visibility: 2116 printf ("\t"); 2117 switch (uvalue) 2118 { 2119 case DW_VIS_local: printf ("(local)"); break; 2120 case DW_VIS_exported: printf ("(exported)"); break; 2121 case DW_VIS_qualified: printf ("(qualified)"); break; 2122 default: printf (_("(unknown visibility)")); break; 2123 } 2124 break; 2125 2126 case DW_AT_virtuality: 2127 printf ("\t"); 2128 switch (uvalue) 2129 { 2130 case DW_VIRTUALITY_none: printf ("(none)"); break; 2131 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break; 2132 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break; 2133 default: printf (_("(unknown virtuality)")); break; 2134 } 2135 break; 2136 2137 case DW_AT_identifier_case: 2138 printf ("\t"); 2139 switch (uvalue) 2140 { 2141 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break; 2142 case DW_ID_up_case: printf ("(up_case)"); break; 2143 case DW_ID_down_case: printf ("(down_case)"); break; 2144 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break; 2145 default: printf (_("(unknown case)")); break; 2146 } 2147 break; 2148 2149 case DW_AT_calling_convention: 2150 printf ("\t"); 2151 switch (uvalue) 2152 { 2153 case DW_CC_normal: printf ("(normal)"); break; 2154 case DW_CC_program: printf ("(program)"); break; 2155 case DW_CC_nocall: printf ("(nocall)"); break; 2156 default: 2157 if (uvalue >= DW_CC_lo_user 2158 && uvalue <= DW_CC_hi_user) 2159 printf (_("(user defined)")); 2160 else 2161 printf (_("(unknown convention)")); 2162 } 2163 break; 2164 2165 case DW_AT_ordering: 2166 printf ("\t"); 2167 switch (uvalue) 2168 { 2169 case -1: printf (_("(undefined)")); break; 2170 case 0: printf ("(row major)"); break; 2171 case 1: printf ("(column major)"); break; 2172 } 2173 break; 2174 2175 case DW_AT_frame_base: 2176 have_frame_base = 1; 2177 case DW_AT_location: 2178 case DW_AT_string_length: 2179 case DW_AT_return_addr: 2180 case DW_AT_data_member_location: 2181 case DW_AT_vtable_elem_location: 2182 case DW_AT_segment: 2183 case DW_AT_static_link: 2184 case DW_AT_use_location: 2185 case DW_AT_GNU_call_site_value: 2186 case DW_AT_GNU_call_site_data_value: 2187 case DW_AT_GNU_call_site_target: 2188 case DW_AT_GNU_call_site_target_clobbered: 2189 if ((dwarf_version < 4 2190 && (form == DW_FORM_data4 || form == DW_FORM_data8)) 2191 || form == DW_FORM_sec_offset) 2192 printf (_(" (location list)")); 2193 /* Fall through. */ 2194 case DW_AT_allocated: 2195 case DW_AT_associated: 2196 case DW_AT_data_location: 2197 case DW_AT_stride: 2198 case DW_AT_upper_bound: 2199 case DW_AT_lower_bound: 2200 if (block_start) 2201 { 2202 int need_frame_base; 2203 2204 printf ("\t("); 2205 need_frame_base = decode_location_expression (block_start, 2206 pointer_size, 2207 offset_size, 2208 dwarf_version, 2209 uvalue, 2210 cu_offset, section); 2211 printf (")"); 2212 if (need_frame_base && !have_frame_base) 2213 printf (_(" [without DW_AT_frame_base]")); 2214 } 2215 break; 2216 2217 case DW_AT_import: 2218 { 2219 if (form == DW_FORM_ref_sig8 2220 || form == DW_FORM_GNU_ref_alt) 2221 break; 2222 2223 if (form == DW_FORM_ref1 2224 || form == DW_FORM_ref2 2225 || form == DW_FORM_ref4 2226 || form == DW_FORM_ref_udata) 2227 uvalue += cu_offset; 2228 2229 if (uvalue >= section->size) 2230 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"), 2231 dwarf_vmatoa ("x", uvalue), 2232 (unsigned long) (orig_data - section->start)); 2233 else 2234 { 2235 unsigned long abbrev_number; 2236 abbrev_entry * entry; 2237 2238 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end); 2239 2240 printf (_("\t[Abbrev Number: %ld"), abbrev_number); 2241 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will 2242 use different abbrev table, and we don't track .debug_info chunks 2243 yet. */ 2244 if (form != DW_FORM_ref_addr) 2245 { 2246 for (entry = first_abbrev; entry != NULL; entry = entry->next) 2247 if (entry->entry == abbrev_number) 2248 break; 2249 if (entry != NULL) 2250 printf (" (%s)", get_TAG_name (entry->tag)); 2251 } 2252 printf ("]"); 2253 } 2254 } 2255 break; 2256 2257 default: 2258 break; 2259 } 2260 2261 return data; 2262 } 2263 2264 static const char * 2265 get_AT_name (unsigned long attribute) 2266 { 2267 const char *name; 2268 2269 if (attribute == 0) 2270 return "DW_AT value: 0"; 2271 2272 /* One value is shared by the MIPS and HP extensions: */ 2273 if (attribute == DW_AT_MIPS_fde) 2274 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable"; 2275 2276 name = get_DW_AT_name (attribute); 2277 2278 if (name == NULL) 2279 { 2280 static char buffer[100]; 2281 2282 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"), 2283 attribute); 2284 return buffer; 2285 } 2286 2287 return name; 2288 } 2289 2290 static unsigned char * 2291 read_and_display_attr (unsigned long attribute, 2292 unsigned long form, 2293 unsigned char * data, 2294 unsigned char * end, 2295 dwarf_vma cu_offset, 2296 dwarf_vma pointer_size, 2297 dwarf_vma offset_size, 2298 int dwarf_version, 2299 debug_info * debug_info_p, 2300 int do_loc, 2301 struct dwarf_section * section, 2302 struct cu_tu_set * this_set) 2303 { 2304 if (!do_loc) 2305 printf (" %-18s:", get_AT_name (attribute)); 2306 data = read_and_display_attr_value (attribute, form, data, end, 2307 cu_offset, pointer_size, offset_size, 2308 dwarf_version, debug_info_p, 2309 do_loc, section, this_set); 2310 if (!do_loc) 2311 printf ("\n"); 2312 return data; 2313 } 2314 2315 /* Process the contents of a .debug_info section. If do_loc is non-zero 2316 then we are scanning for location lists and we do not want to display 2317 anything to the user. If do_types is non-zero, we are processing 2318 a .debug_types section instead of a .debug_info section. */ 2319 2320 static int 2321 process_debug_info (struct dwarf_section *section, 2322 void *file, 2323 enum dwarf_section_display_enum abbrev_sec, 2324 int do_loc, 2325 int do_types) 2326 { 2327 unsigned char *start = section->start; 2328 unsigned char *end = start + section->size; 2329 unsigned char *section_begin; 2330 unsigned int unit; 2331 unsigned int num_units = 0; 2332 2333 if ((do_loc || do_debug_loc || do_debug_ranges) 2334 && num_debug_info_entries == 0 2335 && ! do_types) 2336 { 2337 dwarf_vma length; 2338 2339 /* First scan the section to get the number of comp units. */ 2340 for (section_begin = start, num_units = 0; section_begin < end; 2341 num_units ++) 2342 { 2343 /* Read the first 4 bytes. For a 32-bit DWARF section, this 2344 will be the length. For a 64-bit DWARF section, it'll be 2345 the escape code 0xffffffff followed by an 8 byte length. */ 2346 SAFE_BYTE_GET (length, section_begin, 4, end); 2347 2348 if (length == 0xffffffff) 2349 { 2350 SAFE_BYTE_GET (length, section_begin + 4, 8, end); 2351 section_begin += length + 12; 2352 } 2353 else if (length >= 0xfffffff0 && length < 0xffffffff) 2354 { 2355 warn (_("Reserved length value (0x%s) found in section %s\n"), 2356 dwarf_vmatoa ("x", length), section->name); 2357 return 0; 2358 } 2359 else 2360 section_begin += length + 4; 2361 2362 /* Negative values are illegal, they may even cause infinite 2363 looping. This can happen if we can't accurately apply 2364 relocations to an object file, or if the file is corrupt. */ 2365 if ((signed long) length <= 0 || section_begin < start) 2366 { 2367 warn (_("Corrupt unit length (0x%s) found in section %s\n"), 2368 dwarf_vmatoa ("x", length), section->name); 2369 return 0; 2370 } 2371 } 2372 2373 if (num_units == 0) 2374 { 2375 error (_("No comp units in %s section ?\n"), section->name); 2376 return 0; 2377 } 2378 2379 /* Then allocate an array to hold the information. */ 2380 debug_information = (debug_info *) cmalloc (num_units, 2381 sizeof (* debug_information)); 2382 if (debug_information == NULL) 2383 { 2384 error (_("Not enough memory for a debug info array of %u entries\n"), 2385 num_units); 2386 alloc_num_debug_info_entries = num_debug_info_entries = 0; 2387 return 0; 2388 } 2389 /* PR 17531: file: 92ca3797. 2390 We cannot rely upon the debug_information array being initialised 2391 before it is used. A corrupt file could easily contain references 2392 to a unit for which information has not been made available. So 2393 we ensure that the array is zeroed here. */ 2394 memset (debug_information, 0, num_units * sizeof (*debug_information)); 2395 2396 alloc_num_debug_info_entries = num_units; 2397 } 2398 2399 if (!do_loc) 2400 { 2401 if (dwarf_start_die == 0) 2402 printf (_("Contents of the %s section:\n\n"), section->name); 2403 2404 load_debug_section (str, file); 2405 load_debug_section (str_dwo, file); 2406 load_debug_section (str_index, file); 2407 load_debug_section (str_index_dwo, file); 2408 load_debug_section (debug_addr, file); 2409 } 2410 2411 load_debug_section (abbrev_sec, file); 2412 if (debug_displays [abbrev_sec].section.start == NULL) 2413 { 2414 warn (_("Unable to locate %s section!\n"), 2415 debug_displays [abbrev_sec].section.name); 2416 return 0; 2417 } 2418 2419 for (section_begin = start, unit = 0; start < end; unit++) 2420 { 2421 DWARF2_Internal_CompUnit compunit; 2422 unsigned char *hdrptr; 2423 unsigned char *tags; 2424 int level, last_level, saved_level; 2425 dwarf_vma cu_offset; 2426 unsigned int offset_size; 2427 int initial_length_size; 2428 dwarf_vma signature_high = 0; 2429 dwarf_vma signature_low = 0; 2430 dwarf_vma type_offset = 0; 2431 struct cu_tu_set *this_set; 2432 dwarf_vma abbrev_base; 2433 size_t abbrev_size; 2434 2435 hdrptr = start; 2436 2437 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end); 2438 2439 if (compunit.cu_length == 0xffffffff) 2440 { 2441 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end); 2442 offset_size = 8; 2443 initial_length_size = 12; 2444 } 2445 else 2446 { 2447 offset_size = 4; 2448 initial_length_size = 4; 2449 } 2450 2451 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end); 2452 2453 cu_offset = start - section_begin; 2454 2455 this_set = find_cu_tu_set_v2 (cu_offset, do_types); 2456 2457 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end); 2458 2459 if (this_set == NULL) 2460 { 2461 abbrev_base = 0; 2462 abbrev_size = debug_displays [abbrev_sec].section.size; 2463 } 2464 else 2465 { 2466 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV]; 2467 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV]; 2468 } 2469 2470 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end); 2471 /* PR 17512: file: 001-108546-0.001:0.1. */ 2472 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8) 2473 { 2474 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"), 2475 compunit.cu_pointer_size, offset_size); 2476 compunit.cu_pointer_size = offset_size; 2477 } 2478 2479 if (do_types) 2480 { 2481 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end); 2482 hdrptr += 8; 2483 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end); 2484 } 2485 2486 if ((do_loc || do_debug_loc || do_debug_ranges) 2487 && num_debug_info_entries == 0 2488 && ! do_types) 2489 { 2490 debug_information [unit].cu_offset = cu_offset; 2491 debug_information [unit].pointer_size 2492 = compunit.cu_pointer_size; 2493 debug_information [unit].offset_size = offset_size; 2494 debug_information [unit].dwarf_version = compunit.cu_version; 2495 debug_information [unit].base_address = 0; 2496 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE; 2497 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE; 2498 debug_information [unit].loc_offsets = NULL; 2499 debug_information [unit].have_frame_base = NULL; 2500 debug_information [unit].max_loc_offsets = 0; 2501 debug_information [unit].num_loc_offsets = 0; 2502 debug_information [unit].range_lists = NULL; 2503 debug_information [unit].max_range_lists= 0; 2504 debug_information [unit].num_range_lists = 0; 2505 } 2506 2507 if (!do_loc && dwarf_start_die == 0) 2508 { 2509 printf (_(" Compilation Unit @ offset 0x%s:\n"), 2510 dwarf_vmatoa ("x", cu_offset)); 2511 printf (_(" Length: 0x%s (%s)\n"), 2512 dwarf_vmatoa ("x", compunit.cu_length), 2513 offset_size == 8 ? "64-bit" : "32-bit"); 2514 printf (_(" Version: %d\n"), compunit.cu_version); 2515 printf (_(" Abbrev Offset: 0x%s\n"), 2516 dwarf_vmatoa ("x", compunit.cu_abbrev_offset)); 2517 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size); 2518 if (do_types) 2519 { 2520 char buf[64]; 2521 2522 printf (_(" Signature: 0x%s\n"), 2523 dwarf_vmatoa64 (signature_high, signature_low, 2524 buf, sizeof (buf))); 2525 printf (_(" Type Offset: 0x%s\n"), 2526 dwarf_vmatoa ("x", type_offset)); 2527 } 2528 if (this_set != NULL) 2529 { 2530 dwarf_vma *offsets = this_set->section_offsets; 2531 size_t *sizes = this_set->section_sizes; 2532 2533 printf (_(" Section contributions:\n")); 2534 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"), 2535 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]), 2536 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV])); 2537 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"), 2538 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]), 2539 dwarf_vmatoa ("x", sizes [DW_SECT_LINE])); 2540 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"), 2541 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]), 2542 dwarf_vmatoa ("x", sizes [DW_SECT_LOC])); 2543 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"), 2544 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]), 2545 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS])); 2546 } 2547 } 2548 2549 if (cu_offset + compunit.cu_length + initial_length_size 2550 > section->size) 2551 { 2552 warn (_("Debug info is corrupted, length of CU at %s" 2553 " extends beyond end of section (length = %s)\n"), 2554 dwarf_vmatoa ("x", cu_offset), 2555 dwarf_vmatoa ("x", compunit.cu_length)); 2556 num_units = unit; 2557 break; 2558 } 2559 tags = hdrptr; 2560 start += compunit.cu_length + initial_length_size; 2561 2562 if (start > end) 2563 { 2564 warn (_("Debug info is corrupt. CU at %s extends beyond end of section"), 2565 dwarf_vmatoa ("x", cu_offset)); 2566 start = end; 2567 } 2568 2569 if (compunit.cu_version != 2 2570 && compunit.cu_version != 3 2571 && compunit.cu_version != 4) 2572 { 2573 warn (_("CU at offset %s contains corrupt or " 2574 "unsupported version number: %d.\n"), 2575 dwarf_vmatoa ("x", cu_offset), compunit.cu_version); 2576 continue; 2577 } 2578 2579 free_abbrevs (); 2580 2581 /* Process the abbrevs used by this compilation unit. */ 2582 if (compunit.cu_abbrev_offset >= abbrev_size) 2583 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"), 2584 (unsigned long) compunit.cu_abbrev_offset, 2585 (unsigned long) abbrev_size); 2586 /* PR 17531: file:4bcd9ce9. */ 2587 else if ((abbrev_base + abbrev_size) 2588 > debug_displays [abbrev_sec].section.size) 2589 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"), 2590 (unsigned long) abbrev_base + abbrev_size, 2591 (unsigned long) debug_displays [abbrev_sec].section.size); 2592 else 2593 process_abbrev_section 2594 (((unsigned char *) debug_displays [abbrev_sec].section.start 2595 + abbrev_base + compunit.cu_abbrev_offset), 2596 ((unsigned char *) debug_displays [abbrev_sec].section.start 2597 + abbrev_base + abbrev_size)); 2598 2599 level = 0; 2600 last_level = level; 2601 saved_level = -1; 2602 while (tags < start) 2603 { 2604 unsigned int bytes_read; 2605 unsigned long abbrev_number; 2606 unsigned long die_offset; 2607 abbrev_entry *entry; 2608 abbrev_attr *attr; 2609 int do_printing = 1; 2610 2611 die_offset = tags - section_begin; 2612 2613 abbrev_number = read_uleb128 (tags, & bytes_read, start); 2614 tags += bytes_read; 2615 2616 /* A null DIE marks the end of a list of siblings or it may also be 2617 a section padding. */ 2618 if (abbrev_number == 0) 2619 { 2620 /* Check if it can be a section padding for the last CU. */ 2621 if (level == 0 && start == end) 2622 { 2623 unsigned char *chk; 2624 2625 for (chk = tags; chk < start; chk++) 2626 if (*chk != 0) 2627 break; 2628 if (chk == start) 2629 break; 2630 } 2631 2632 if (!do_loc && die_offset >= dwarf_start_die 2633 && (dwarf_cutoff_level == -1 2634 || level < dwarf_cutoff_level)) 2635 printf (_(" <%d><%lx>: Abbrev Number: 0\n"), 2636 level, die_offset); 2637 2638 --level; 2639 if (level < 0) 2640 { 2641 static unsigned num_bogus_warns = 0; 2642 2643 if (num_bogus_warns < 3) 2644 { 2645 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"), 2646 die_offset, section->name); 2647 num_bogus_warns ++; 2648 if (num_bogus_warns == 3) 2649 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n")); 2650 } 2651 } 2652 if (dwarf_start_die != 0 && level < saved_level) 2653 return 1; 2654 continue; 2655 } 2656 2657 if (!do_loc) 2658 { 2659 if (dwarf_start_die != 0 && die_offset < dwarf_start_die) 2660 do_printing = 0; 2661 else 2662 { 2663 if (dwarf_start_die != 0 && die_offset == dwarf_start_die) 2664 saved_level = level; 2665 do_printing = (dwarf_cutoff_level == -1 2666 || level < dwarf_cutoff_level); 2667 if (do_printing) 2668 printf (_(" <%d><%lx>: Abbrev Number: %lu"), 2669 level, die_offset, abbrev_number); 2670 else if (dwarf_cutoff_level == -1 2671 || last_level < dwarf_cutoff_level) 2672 printf (_(" <%d><%lx>: ...\n"), level, die_offset); 2673 last_level = level; 2674 } 2675 } 2676 2677 /* Scan through the abbreviation list until we reach the 2678 correct entry. */ 2679 for (entry = first_abbrev; 2680 entry && entry->entry != abbrev_number; 2681 entry = entry->next) 2682 continue; 2683 2684 if (entry == NULL) 2685 { 2686 if (!do_loc && do_printing) 2687 { 2688 printf ("\n"); 2689 fflush (stdout); 2690 } 2691 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"), 2692 die_offset, abbrev_number); 2693 return 0; 2694 } 2695 2696 if (!do_loc && do_printing) 2697 printf (" (%s)\n", get_TAG_name (entry->tag)); 2698 2699 switch (entry->tag) 2700 { 2701 default: 2702 need_base_address = 0; 2703 break; 2704 case DW_TAG_compile_unit: 2705 need_base_address = 1; 2706 break; 2707 case DW_TAG_entry_point: 2708 case DW_TAG_subprogram: 2709 need_base_address = 0; 2710 /* Assuming that there is no DW_AT_frame_base. */ 2711 have_frame_base = 0; 2712 break; 2713 } 2714 2715 for (attr = entry->first_attr; 2716 attr && attr->attribute; 2717 attr = attr->next) 2718 { 2719 debug_info *arg; 2720 2721 if (! do_loc && do_printing) 2722 /* Show the offset from where the tag was extracted. */ 2723 printf (" <%lx>", (unsigned long)(tags - section_begin)); 2724 2725 if (debug_information && unit < alloc_num_debug_info_entries) 2726 arg = debug_information + unit; 2727 else 2728 arg = NULL; 2729 2730 tags = read_and_display_attr (attr->attribute, 2731 attr->form, 2732 tags, 2733 end, 2734 cu_offset, 2735 compunit.cu_pointer_size, 2736 offset_size, 2737 compunit.cu_version, 2738 arg, 2739 do_loc || ! do_printing, 2740 section, 2741 this_set); 2742 } 2743 2744 if (entry->children) 2745 ++level; 2746 } 2747 } 2748 2749 /* Set num_debug_info_entries here so that it can be used to check if 2750 we need to process .debug_loc and .debug_ranges sections. */ 2751 if ((do_loc || do_debug_loc || do_debug_ranges) 2752 && num_debug_info_entries == 0 2753 && ! do_types) 2754 { 2755 if (num_units > alloc_num_debug_info_entries) 2756 num_debug_info_entries = alloc_num_debug_info_entries; 2757 else 2758 num_debug_info_entries = num_units; 2759 } 2760 2761 if (!do_loc) 2762 printf ("\n"); 2763 2764 return 1; 2765 } 2766 2767 /* Locate and scan the .debug_info section in the file and record the pointer 2768 sizes and offsets for the compilation units in it. Usually an executable 2769 will have just one pointer size, but this is not guaranteed, and so we try 2770 not to make any assumptions. Returns zero upon failure, or the number of 2771 compilation units upon success. */ 2772 2773 static unsigned int 2774 load_debug_info (void * file) 2775 { 2776 /* Reset the last pointer size so that we can issue correct error 2777 messages if we are displaying the contents of more than one section. */ 2778 last_pointer_size = 0; 2779 warned_about_missing_comp_units = FALSE; 2780 2781 /* If we have already tried and failed to load the .debug_info 2782 section then do not bother to repeat the task. */ 2783 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE) 2784 return 0; 2785 2786 /* If we already have the information there is nothing else to do. */ 2787 if (num_debug_info_entries > 0) 2788 return num_debug_info_entries; 2789 2790 /* If this is a DWARF package file, load the CU and TU indexes. */ 2791 load_cu_tu_indexes (file); 2792 2793 if (load_debug_section (info, file) 2794 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0)) 2795 return num_debug_info_entries; 2796 2797 if (load_debug_section (info_dwo, file) 2798 && process_debug_info (&debug_displays [info_dwo].section, file, 2799 abbrev_dwo, 1, 0)) 2800 return num_debug_info_entries; 2801 2802 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE; 2803 return 0; 2804 } 2805 2806 /* Experimental DWARF 5 extensions. 2807 See http://wiki.dwarfstd.org/index.php?title=TwoLevelLineTables. */ 2808 #define DWARF2_LINE_EXPERIMENTAL_VERSION 0xf006 2809 2810 /* Read a DWARF .debug_line section header starting at DATA. 2811 Upon success returns an updated DATA pointer and the LINFO 2812 structure and the END_OF_SEQUENCE pointer will be filled in. 2813 Otherwise returns NULL. */ 2814 2815 static unsigned char * 2816 read_debug_line_header (struct dwarf_section * section, 2817 unsigned char * data, 2818 unsigned char * end, 2819 DWARF2_Internal_LineInfo * linfo, 2820 unsigned char ** end_of_sequence, 2821 unsigned int * pinitial_length_size, 2822 unsigned int * poffset_size) 2823 { 2824 unsigned char *hdrptr; 2825 unsigned int offset_size; 2826 unsigned int initial_length_size; 2827 2828 /* Extract information from the Line Number Program Header. 2829 (section 6.2.4 in the Dwarf3 doc). */ 2830 hdrptr = data; 2831 2832 /* Get and check the length of the block. */ 2833 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end); 2834 2835 if (linfo->li_length == 0xffffffff) 2836 { 2837 /* This section is 64-bit DWARF 3. */ 2838 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end); 2839 offset_size = 8; 2840 initial_length_size = 12; 2841 } 2842 else 2843 { 2844 offset_size = 4; 2845 initial_length_size = 4; 2846 } 2847 *pinitial_length_size = initial_length_size; 2848 *poffset_size = offset_size; 2849 2850 if (linfo->li_length + initial_length_size > section->size) 2851 { 2852 /* If the length field has a relocation against it, then we should 2853 not complain if it is inaccurate (and probably negative). This 2854 happens in object files when the .debug_line section is actually 2855 comprised of several different .debug_line.* sections, (some of 2856 which may be removed by linker garbage collection), and a relocation 2857 is used to compute the correct length once that is done. */ 2858 if (reloc_at (section, (hdrptr - section->start) - offset_size)) 2859 { 2860 linfo->li_length = (end - data) - initial_length_size; 2861 } 2862 else 2863 { 2864 warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"), 2865 (long) linfo->li_length); 2866 return NULL; 2867 } 2868 } 2869 2870 /* Get and check the version number. */ 2871 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end); 2872 2873 /* Version 0xf006 is for experimental two-level line tables. */ 2874 if (linfo->li_version != 2 2875 && linfo->li_version != 3 2876 && linfo->li_version != 4 2877 && linfo->li_version != 5 2878 && linfo->li_version != DWARF2_LINE_EXPERIMENTAL_VERSION) 2879 { 2880 warn (_("Only DWARF versions 2-5 line info are currently supported.\n")); 2881 return NULL; 2882 } 2883 2884 if (linfo->li_version < 5) 2885 { 2886 linfo->li_address_size = 0; 2887 linfo->li_segment_size = 0; 2888 } 2889 else if (linfo->li_version != DWARF2_LINE_EXPERIMENTAL_VERSION) 2890 { 2891 SAFE_BYTE_GET_AND_INC (linfo->li_address_size, hdrptr, 1, end); 2892 SAFE_BYTE_GET_AND_INC (linfo->li_segment_size, hdrptr, 1, end); 2893 } 2894 2895 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end); 2896 2897 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end); 2898 2899 if (linfo->li_version >= 4) 2900 { 2901 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end); 2902 2903 if (linfo->li_max_ops_per_insn == 0) 2904 { 2905 warn (_("Invalid maximum operations per insn.\n")); 2906 return NULL; 2907 } 2908 } 2909 else 2910 linfo->li_max_ops_per_insn = 1; 2911 2912 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end); 2913 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end); 2914 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end); 2915 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end); 2916 2917 * end_of_sequence = data + linfo->li_length + initial_length_size; 2918 /* PR 17512: file:002-117414-0.004. */ 2919 if (* end_of_sequence > end) 2920 { 2921 warn (_("Line length %s extends beyond end of section\n"), 2922 dwarf_vmatoa ("u", linfo->li_length)); 2923 * end_of_sequence = end; 2924 return NULL; 2925 } 2926 2927 return hdrptr; 2928 } 2929 2930 static void 2931 display_directory_table_v4 (unsigned char *start, unsigned char *end, 2932 unsigned char **pdata) 2933 { 2934 unsigned char *data = *pdata; 2935 unsigned int last_dir_entry = 0; 2936 2937 if (*data == 0) 2938 printf (_("\n The Directory Table is empty.\n")); 2939 else 2940 { 2941 printf (_("\n The Directory Table (offset 0x%lx):\n"), 2942 (long)(data - start)); 2943 2944 while (data < end && *data != 0) 2945 { 2946 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data); 2947 2948 data += strnlen ((char *) data, end - data) + 1; 2949 } 2950 } 2951 2952 /* Skip the NUL at the end of the table. */ 2953 *pdata = data + 1; 2954 } 2955 2956 static void 2957 display_file_name_table_v4 (unsigned char *start, unsigned char *end, 2958 unsigned char **pdata) 2959 { 2960 unsigned char *data = *pdata; 2961 2962 if (*data == 0) 2963 printf (_("\n The File Name Table is empty.\n")); 2964 else 2965 { 2966 printf (_("\n The File Name Table (offset 0x%lx):\n"), 2967 (long)(data - start)); 2968 printf (_(" Entry\tDir\tTime\tSize\tName\n")); 2969 2970 while (data < end && *data != 0) 2971 { 2972 unsigned char *name; 2973 unsigned int bytes_read; 2974 2975 printf (" %d\t", ++state_machine_regs.last_file_entry); 2976 name = data; 2977 data += strnlen ((char *) data, end - data) + 1; 2978 2979 printf ("%s\t", 2980 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 2981 data += bytes_read; 2982 printf ("%s\t", 2983 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 2984 data += bytes_read; 2985 printf ("%s\t", 2986 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); 2987 data += bytes_read; 2988 printf ("%.*s\n", (int)(end - name), name); 2989 2990 if (data == end) 2991 { 2992 warn (_("Corrupt file name table entry\n")); 2993 break; 2994 } 2995 } 2996 } 2997 2998 /* Skip the NUL at the end of the table. */ 2999 *pdata = data + 1; 3000 } 3001 3002 static int 3003 display_dir_file_table_v5 (unsigned char *start, unsigned char *end, 3004 unsigned char **pdata, char *table_name, 3005 unsigned int offset_size) 3006 { 3007 unsigned char *data = *pdata; 3008 unsigned int bytes_read; 3009 unsigned int format_count; 3010 unsigned int *content_types; 3011 unsigned int *content_forms; 3012 unsigned int entry_count; 3013 unsigned int i, j; 3014 const unsigned char *name; 3015 dwarf_vma offset; 3016 unsigned int val; 3017 3018 format_count = read_uleb128 (data, & bytes_read, end); 3019 data += bytes_read; 3020 content_types = (unsigned int *) xmalloc (format_count * 3021 sizeof (unsigned int)); 3022 content_forms = (unsigned int *) xmalloc (format_count * 3023 sizeof (unsigned int)); 3024 for (j = 0; j < format_count; j++) 3025 { 3026 content_types[j] = read_uleb128 (data, & bytes_read, end); 3027 data += bytes_read; 3028 content_forms[j] = read_uleb128 (data, & bytes_read, end); 3029 data += bytes_read; 3030 } 3031 3032 entry_count = read_uleb128 (data, & bytes_read, end); 3033 data += bytes_read; 3034 3035 if (entry_count == 0) 3036 printf (_("\n The %s Table is empty.\n"), table_name); 3037 else 3038 { 3039 printf (_("\n The %s Table (offset 0x%lx):\n"), 3040 table_name, (long)(data - start)); 3041 3042 printf (_(" Entry")); 3043 for (j = 0; j < format_count; j++) 3044 { 3045 printf ("\t"); 3046 switch (content_types[j]) 3047 { 3048 case DW_LNCT_path: 3049 printf (_("Path")); 3050 break; 3051 case DW_LNCT_subprogram_name: 3052 printf (_("Name")); 3053 break; 3054 case DW_LNCT_directory_index: 3055 printf (_("Dir")); 3056 break; 3057 case DW_LNCT_decl_file: 3058 printf (_("File")); 3059 break; 3060 case DW_LNCT_decl_line: 3061 printf (_("Line")); 3062 break; 3063 } 3064 } 3065 printf ("\n"); 3066 } 3067 3068 for (i = 0; i < entry_count; i++) 3069 { 3070 printf (" %d", i + 1); 3071 for (j = 0; j < format_count; j++) 3072 { 3073 if (data >= end) 3074 break; 3075 switch (content_forms[j]) 3076 { 3077 case DW_FORM_string: 3078 printf ("\t%.*s", (int) (end - data), data); 3079 data += strnlen ((char *) data, end - data) + 1; 3080 break; 3081 case DW_FORM_line_strp: 3082 SAFE_BYTE_GET_AND_INC (offset, data, offset_size, end); 3083 name = fetch_indirect_line_string (offset); 3084 printf ("\t%s", name); 3085 break; 3086 case DW_FORM_udata: 3087 val = read_uleb128 (data, & bytes_read, end); 3088 data += bytes_read; 3089 printf ("\t%u", val); 3090 break; 3091 default: 3092 printf ("\t%s", _("(unrecognized FORM code)")); 3093 data = end; 3094 break; 3095 } 3096 } 3097 printf ("\n"); 3098 3099 /* PR 17512: file: 002-132094-0.004. */ 3100 if (data >= end - 1) 3101 break; 3102 } 3103 3104 free (content_types); 3105 free (content_forms); 3106 3107 *pdata = data; 3108 return entry_count; 3109 } 3110 3111 static void 3112 display_line_program (unsigned char *start, unsigned char *end, 3113 unsigned char **pdata, char *table_name, 3114 DWARF2_Internal_LineInfo *linfo, 3115 unsigned char *standard_opcodes, 3116 int is_logical) 3117 { 3118 unsigned char *data = *pdata; 3119 3120 if (data >= end) 3121 { 3122 printf (_(" No %s.\n"), table_name); 3123 return; 3124 } 3125 3126 printf (" %s:\n", table_name); 3127 3128 while (data < end) 3129 { 3130 unsigned char op_code; 3131 dwarf_signed_vma adv; 3132 dwarf_vma uladv; 3133 unsigned int bytes_read; 3134 unsigned int logical; 3135 int i; 3136 3137 printf (" [0x%08lx]", (long)(data - start)); 3138 3139 op_code = *data++; 3140 3141 if (op_code >= linfo->li_opcode_base) 3142 { 3143 op_code -= linfo->li_opcode_base; 3144 uladv = (op_code / linfo->li_line_range); 3145 if (linfo->li_max_ops_per_insn == 1) 3146 { 3147 uladv *= linfo->li_min_insn_length; 3148 state_machine_regs.address += uladv; 3149 printf (_(" Special opcode %d: " 3150 "advance Address by %s to 0x%s"), 3151 op_code, dwarf_vmatoa ("u", uladv), 3152 dwarf_vmatoa ("x", state_machine_regs.address)); 3153 } 3154 else 3155 { 3156 state_machine_regs.address 3157 += ((state_machine_regs.op_index + uladv) 3158 / linfo->li_max_ops_per_insn) 3159 * linfo->li_min_insn_length; 3160 state_machine_regs.op_index 3161 = (state_machine_regs.op_index + uladv) 3162 % linfo->li_max_ops_per_insn; 3163 printf (_(" Special opcode %d: " 3164 "advance Address by %s to 0x%s[%d]"), 3165 op_code, dwarf_vmatoa ("u", uladv), 3166 dwarf_vmatoa ("x", state_machine_regs.address), 3167 state_machine_regs.op_index); 3168 } 3169 adv = (op_code % linfo->li_line_range) + linfo->li_line_base; 3170 state_machine_regs.line += adv; 3171 printf (_(" and Line by %s to %d\n"), 3172 dwarf_vmatoa ("d", adv), state_machine_regs.line); 3173 if (is_logical) 3174 append_logical (); 3175 state_machine_regs.discriminator = 0; 3176 } 3177 else 3178 { 3179 switch (op_code) 3180 { 3181 case DW_LNS_extended_op: 3182 data += process_extended_line_op (data, linfo->li_default_is_stmt, 3183 end, is_logical); 3184 break; 3185 3186 case DW_LNS_copy: 3187 printf (_(" Copy\n")); 3188 if (is_logical) 3189 append_logical (); 3190 state_machine_regs.discriminator = 0; 3191 break; 3192 3193 case DW_LNS_advance_pc: 3194 uladv = read_uleb128 (data, & bytes_read, end); 3195 data += bytes_read; 3196 if (linfo->li_max_ops_per_insn == 1) 3197 { 3198 uladv *= linfo->li_min_insn_length; 3199 state_machine_regs.address += uladv; 3200 printf (_(" Advance PC by %s to 0x%s\n"), 3201 dwarf_vmatoa ("u", uladv), 3202 dwarf_vmatoa ("x", state_machine_regs.address)); 3203 } 3204 else 3205 { 3206 state_machine_regs.address 3207 += ((state_machine_regs.op_index + uladv) 3208 / linfo->li_max_ops_per_insn) 3209 * linfo->li_min_insn_length; 3210 state_machine_regs.op_index 3211 = (state_machine_regs.op_index + uladv) 3212 % linfo->li_max_ops_per_insn; 3213 printf (_(" Advance PC by %s to 0x%s[%d]\n"), 3214 dwarf_vmatoa ("u", uladv), 3215 dwarf_vmatoa ("x", state_machine_regs.address), 3216 state_machine_regs.op_index); 3217 } 3218 break; 3219 3220 case DW_LNS_advance_line: 3221 adv = read_sleb128 (data, & bytes_read, end); 3222 data += bytes_read; 3223 state_machine_regs.line += adv; 3224 printf (_(" Advance Line by %s to %d\n"), 3225 dwarf_vmatoa ("d", adv), 3226 state_machine_regs.line); 3227 break; 3228 3229 case DW_LNS_set_file: 3230 adv = read_uleb128 (data, & bytes_read, end); 3231 data += bytes_read; 3232 printf (_(" Set File Name to entry %s in the File Name Table\n"), 3233 dwarf_vmatoa ("d", adv)); 3234 state_machine_regs.file = adv; 3235 break; 3236 3237 case DW_LNS_set_column: 3238 uladv = read_uleb128 (data, & bytes_read, end); 3239 data += bytes_read; 3240 printf (_(" Set column to %s\n"), 3241 dwarf_vmatoa ("u", uladv)); 3242 state_machine_regs.column = uladv; 3243 break; 3244 3245 case DW_LNS_negate_stmt: 3246 adv = state_machine_regs.is_stmt; 3247 adv = ! adv; 3248 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv)); 3249 state_machine_regs.is_stmt = adv; 3250 break; 3251 3252 case DW_LNS_set_basic_block: 3253 printf (_(" Set basic block\n")); 3254 state_machine_regs.basic_block = 1; 3255 break; 3256 3257 case DW_LNS_const_add_pc: 3258 uladv = ((255 - linfo->li_opcode_base) / linfo->li_line_range); 3259 if (linfo->li_max_ops_per_insn) 3260 { 3261 uladv *= linfo->li_min_insn_length; 3262 state_machine_regs.address += uladv; 3263 printf (_(" Advance PC by constant %s to 0x%s\n"), 3264 dwarf_vmatoa ("u", uladv), 3265 dwarf_vmatoa ("x", state_machine_regs.address)); 3266 } 3267 else 3268 { 3269 state_machine_regs.address 3270 += ((state_machine_regs.op_index + uladv) 3271 / linfo->li_max_ops_per_insn) 3272 * linfo->li_min_insn_length; 3273 state_machine_regs.op_index 3274 = (state_machine_regs.op_index + uladv) 3275 % linfo->li_max_ops_per_insn; 3276 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"), 3277 dwarf_vmatoa ("u", uladv), 3278 dwarf_vmatoa ("x", state_machine_regs.address), 3279 state_machine_regs.op_index); 3280 } 3281 break; 3282 3283 case DW_LNS_fixed_advance_pc: 3284 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); 3285 state_machine_regs.address += uladv; 3286 state_machine_regs.op_index = 0; 3287 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"), 3288 dwarf_vmatoa ("u", uladv), 3289 dwarf_vmatoa ("x", state_machine_regs.address)); 3290 break; 3291 3292 case DW_LNS_set_prologue_end: 3293 printf (_(" Set prologue_end to true\n")); 3294 break; 3295 3296 case DW_LNS_set_epilogue_begin: 3297 printf (_(" Set epilogue_begin to true\n")); 3298 break; 3299 3300 case DW_LNS_set_isa: 3301 uladv = read_uleb128 (data, & bytes_read, end); 3302 data += bytes_read; 3303 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv)); 3304 break; 3305 3306 case DW_LNS_set_subprogram: 3307 /* This opcode is aliased with: */ 3308 /* case DW_LNS_set_address_from_logical: */ 3309 if (is_logical) 3310 { 3311 /* DW_LNS_set_subprogram */ 3312 state_machine_regs.context = 0; 3313 state_machine_regs.subprogram = read_uleb128 (data, & bytes_read, end); 3314 data += bytes_read; 3315 printf (_(" Set subprogram to %u and reset context to 0\n"), 3316 state_machine_regs.subprogram); 3317 } 3318 else 3319 { 3320 /* DW_LNS_set_address_from_logical */ 3321 adv = read_sleb128 (data, & bytes_read, end); 3322 data += bytes_read; 3323 state_machine_regs.line += adv; 3324 logical = state_machine_regs.line; 3325 if (logical - 1 < logicals_count) 3326 { 3327 state_machine_regs.address = logicals_table[logical - 1].address; 3328 state_machine_regs.op_index = logicals_table[logical - 1].op_index; 3329 } 3330 else 3331 warn (_("Logical row number outside range of logicals table\n")); 3332 printf (_(" Advance Line by %s to %u and set address from logical to 0x%s[%u]\n"), 3333 dwarf_vmatoa ("d", adv), 3334 logical, 3335 dwarf_vmatoa ("x", state_machine_regs.address), 3336 state_machine_regs.op_index); 3337 } 3338 break; 3339 3340 case DW_LNS_inlined_call: 3341 adv = read_sleb128 (data, & bytes_read, end); 3342 data += bytes_read; 3343 state_machine_regs.context = logicals_count + adv; 3344 state_machine_regs.subprogram = read_uleb128 (data, & bytes_read, end); 3345 data += bytes_read; 3346 printf (_(" Set context to %u and subprogram to %u\n"), 3347 state_machine_regs.context, 3348 state_machine_regs.subprogram); 3349 break; 3350 3351 case DW_LNS_pop_context: 3352 logical = state_machine_regs.context; 3353 printf (_(" Pop context to logical %u\n"), logical); 3354 if (logical - 1 < logicals_count) 3355 { 3356 state_machine_regs.file = logicals_table[logical - 1].file; 3357 state_machine_regs.line = logicals_table[logical - 1].line; 3358 state_machine_regs.column = logicals_table[logical - 1].column; 3359 state_machine_regs.discriminator = logicals_table[logical - 1].discriminator; 3360 state_machine_regs.is_stmt = logicals_table[logical - 1].is_stmt; 3361 state_machine_regs.context = logicals_table[logical - 1].context; 3362 state_machine_regs.subprogram = logicals_table[logical - 1].subprogram; 3363 } 3364 else 3365 warn (_("Context register outside range of logicals table\n")); 3366 break; 3367 3368 default: 3369 printf (_(" Unknown opcode %d with operands: "), op_code); 3370 3371 if (standard_opcodes != NULL) 3372 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) 3373 { 3374 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data, 3375 &bytes_read, end)), 3376 i == 1 ? "" : ", "); 3377 data += bytes_read; 3378 } 3379 putchar ('\n'); 3380 break; 3381 } 3382 } 3383 } 3384 3385 putchar ('\n'); 3386 *pdata = data; 3387 } 3388 3389 static int 3390 display_debug_lines_raw (struct dwarf_section *section, 3391 unsigned char *data, 3392 unsigned char *end) 3393 { 3394 unsigned char *start = section->start; 3395 unsigned int initial_length_size; 3396 unsigned int offset_size; 3397 3398 printf (_("Raw dump of debug contents of section %s:\n\n"), 3399 section->name); 3400 3401 while (data < end) 3402 { 3403 static DWARF2_Internal_LineInfo saved_linfo; 3404 DWARF2_Internal_LineInfo linfo; 3405 unsigned int logicals_table_offset = 0; 3406 unsigned int actuals_table_offset = 0; 3407 unsigned char *end_of_header_length; 3408 unsigned char *standard_opcodes; 3409 unsigned char *start_of_line_program; 3410 unsigned char *end_of_logicals; 3411 unsigned char *end_of_sequence; 3412 int i; 3413 unsigned char *hdrptr = NULL; 3414 3415 if (const_strneq (section->name, ".debug_line.") 3416 /* Note: the following does not apply to .debug_line.dwo sections. 3417 These are full debug_line sections. */ 3418 && strcmp (section->name, ".debug_line.dwo") != 0) 3419 { 3420 /* Sections named .debug_line.<foo> are fragments of a .debug_line 3421 section containing just the Line Number Statements. They are 3422 created by the assembler and intended to be used alongside gcc's 3423 -ffunction-sections command line option. When the linker's 3424 garbage collection decides to discard a .text.<foo> section it 3425 can then also discard the line number information in .debug_line.<foo>. 3426 3427 Since the section is a fragment it does not have the details 3428 needed to fill out a LineInfo structure, so instead we use the 3429 details from the last full debug_line section that we processed. */ 3430 start_of_line_program = data; 3431 end_of_sequence = end; 3432 end_of_logicals = end; 3433 standard_opcodes = NULL; 3434 linfo = saved_linfo; 3435 /* PR 17531: file: 0522b371. */ 3436 if (linfo.li_line_range == 0) 3437 { 3438 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n")); 3439 return 0; 3440 } 3441 reset_state_machine (linfo.li_default_is_stmt); 3442 } 3443 else 3444 { 3445 if ((hdrptr = read_debug_line_header (section, data, end, & linfo, 3446 & end_of_sequence, 3447 & initial_length_size, 3448 & offset_size)) == NULL) 3449 return 0; 3450 3451 printf (_(" Offset: 0x%lx\n"), (long)(data - start)); 3452 printf (_(" Length: %ld\n"), (long) linfo.li_length); 3453 printf (_(" DWARF Version: %d\n"), linfo.li_version); 3454 if (linfo.li_version >= 5 3455 && linfo.li_version != DWARF2_LINE_EXPERIMENTAL_VERSION) 3456 { 3457 printf (_(" Address Size: %u\n"), linfo.li_address_size); 3458 printf (_(" Segment Size: %u\n"), linfo.li_segment_size); 3459 } 3460 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length); 3461 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length); 3462 if (linfo.li_version >= 4) 3463 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn); 3464 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt); 3465 printf (_(" Line Base: %d\n"), linfo.li_line_base); 3466 printf (_(" Line Range: %d\n"), linfo.li_line_range); 3467 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base); 3468 3469 end_of_header_length = data + initial_length_size + 2 + offset_size; 3470 if (linfo.li_version >= 5 3471 && linfo.li_version != DWARF2_LINE_EXPERIMENTAL_VERSION) 3472 end_of_header_length += 2; 3473 start_of_line_program = end_of_header_length + linfo.li_prologue_length; 3474 end_of_logicals = end; 3475 3476 /* PR 17512: file: 1665-6428-0.004. */ 3477 if (linfo.li_line_range == 0) 3478 { 3479 warn (_("Line range of 0 is invalid, using 1 instead\n")); 3480 linfo.li_line_range = 1; 3481 } 3482 3483 reset_state_machine (linfo.li_default_is_stmt); 3484 3485 /* Display the contents of the Opcodes table. */ 3486 standard_opcodes = hdrptr; 3487 3488 /* PR 17512: file: 002-417945-0.004. */ 3489 if (standard_opcodes + linfo.li_opcode_base >= end) 3490 { 3491 warn (_("Line Base extends beyond end of section\n")); 3492 return 0; 3493 } 3494 3495 printf (_("\n Opcodes:\n")); 3496 3497 for (i = 1; i < linfo.li_opcode_base; i++) 3498 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]); 3499 3500 data = standard_opcodes + linfo.li_opcode_base - 1; 3501 3502 if (linfo.li_version == DWARF2_LINE_EXPERIMENTAL_VERSION) 3503 { 3504 /* Skip the fake directory and filename table. */ 3505 data += 2; 3506 3507 /* Skip the fake extended opcode that wraps the rest 3508 of the section. */ 3509 data += 5; 3510 3511 /* Read the logicals table offset and actuals table offset. */ 3512 SAFE_BYTE_GET_AND_INC (logicals_table_offset, data, offset_size, end); 3513 SAFE_BYTE_GET_AND_INC (actuals_table_offset, data, offset_size, end); 3514 3515 start_of_line_program = end_of_header_length + logicals_table_offset; 3516 3517 if (actuals_table_offset > 0) 3518 end_of_logicals = end_of_header_length + actuals_table_offset; 3519 3520 putchar ('\n'); 3521 printf (_(" Logicals Table Offset: 0x%x\n"), logicals_table_offset); 3522 printf (_(" Actuals Table Offset: 0x%x\n"), actuals_table_offset); 3523 } 3524 3525 /* Display the contents of the Directory table. */ 3526 if (linfo.li_version >= 5) 3527 display_dir_file_table_v5 (start, end, &data, _("Directory"), 3528 offset_size); 3529 else 3530 display_directory_table_v4 (start, end, &data); 3531 3532 /* PR 17512: file: 002-132094-0.004. */ 3533 if (data >= end - 1) 3534 break; 3535 3536 /* Display the contents of the File Name table. */ 3537 if (linfo.li_version >= 5) 3538 { 3539 unsigned int count; 3540 3541 count = display_dir_file_table_v5 (start, end, &data, 3542 _("File Name"), offset_size); 3543 state_machine_regs.last_file_entry = count - 1; 3544 } 3545 else 3546 display_file_name_table_v4 (start, end, &data); 3547 3548 /* Display the contents of the Subprogram table. */ 3549 if (linfo.li_version == DWARF2_LINE_EXPERIMENTAL_VERSION) 3550 display_dir_file_table_v5 (start, end, &data, _("Subprogram"), 3551 offset_size); 3552 3553 putchar ('\n'); 3554 saved_linfo = linfo; 3555 } 3556 3557 if (data > start_of_line_program) 3558 warn (_("Line table header is longer than header_length indicates\n")); 3559 else if (data < start_of_line_program) 3560 warn (_("Line table header is shorter than header_length indicates\n")); 3561 data = start_of_line_program; 3562 3563 if (linfo.li_version == DWARF2_LINE_EXPERIMENTAL_VERSION 3564 && hdrptr != NULL 3565 && actuals_table_offset > 0) 3566 { 3567 if (end_of_logicals > end) 3568 { 3569 warn (_("Actuals table offset %s extends beyond end of section\n"), 3570 dwarf_vmatoa ("u", actuals_table_offset)); 3571 end_of_logicals = end; 3572 } 3573 display_line_program (start, end_of_logicals, &data, 3574 _("Logicals Statements"), 3575 &linfo, standard_opcodes, 1); 3576 if (data > end_of_logicals) 3577 warn (_("Logicals table is longer than actuals_table_offset indicates\n")); 3578 else if (data < end_of_logicals) 3579 warn (_("Line table header is shorter than actuals_table_offset indicates\n")); 3580 data = end_of_logicals; 3581 reset_state_machine (linfo.li_default_is_stmt); 3582 display_line_program (start, end_of_sequence, &data, 3583 _("Actuals Statements"), 3584 &linfo, standard_opcodes, 0); 3585 free_logicals (); 3586 } 3587 else 3588 { 3589 display_line_program (start, end_of_sequence, &data, 3590 _("Line Number Statements"), 3591 &linfo, standard_opcodes, 0); 3592 } 3593 3594 } 3595 3596 return 1; 3597 } 3598 3599 typedef struct 3600 { 3601 unsigned char *name; 3602 unsigned int directory_index; 3603 unsigned int modification_date; 3604 unsigned int length; 3605 } File_Entry; 3606 3607 /* Output a decoded representation of the .debug_line section. */ 3608 3609 static int 3610 display_debug_lines_decoded (struct dwarf_section *section, 3611 unsigned char *data, 3612 unsigned char *end) 3613 { 3614 static DWARF2_Internal_LineInfo saved_linfo; 3615 unsigned int initial_length_size; 3616 unsigned int offset_size; 3617 3618 printf (_("Decoded dump of debug contents of section %s:\n\n"), 3619 section->name); 3620 3621 while (data < end) 3622 { 3623 /* This loop amounts to one iteration per compilation unit. */ 3624 DWARF2_Internal_LineInfo linfo; 3625 unsigned char *standard_opcodes; 3626 unsigned char *end_of_sequence; 3627 int i; 3628 File_Entry *file_table = NULL; 3629 unsigned int n_files = 0; 3630 unsigned char **directory_table = NULL; 3631 unsigned int n_directories = 0; 3632 3633 if (const_strneq (section->name, ".debug_line.") 3634 /* Note: the following does not apply to .debug_line.dwo sections. 3635 These are full debug_line sections. */ 3636 && strcmp (section->name, ".debug_line.dwo") != 0) 3637 { 3638 /* See comment in display_debug_lines_raw(). */ 3639 end_of_sequence = end; 3640 standard_opcodes = NULL; 3641 linfo = saved_linfo; 3642 /* PR 17531: file: 0522b371. */ 3643 if (linfo.li_line_range == 0) 3644 { 3645 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n")); 3646 return 0; 3647 } 3648 reset_state_machine (linfo.li_default_is_stmt); 3649 } 3650 else 3651 { 3652 unsigned char *hdrptr; 3653 3654 if ((hdrptr = read_debug_line_header (section, data, end, & linfo, 3655 & end_of_sequence, 3656 & initial_length_size, 3657 & offset_size)) == NULL) 3658 return 0; 3659 3660 /* PR 17531: file: 0522b371. */ 3661 if (linfo.li_line_range == 0) 3662 { 3663 warn (_("Line range of 0 is invalid, using 1 instead\n")); 3664 linfo.li_line_range = 1; 3665 } 3666 reset_state_machine (linfo.li_default_is_stmt); 3667 3668 /* Save a pointer to the contents of the Opcodes table. */ 3669 standard_opcodes = hdrptr; 3670 3671 /* Traverse the Directory table just to count entries. */ 3672 data = standard_opcodes + linfo.li_opcode_base - 1; 3673 if (*data != 0) 3674 { 3675 unsigned char *ptr_directory_table = data; 3676 3677 while (*data != 0) 3678 { 3679 data += strnlen ((char *) data, end - data) + 1; 3680 n_directories++; 3681 } 3682 3683 /* Go through the directory table again to save the directories. */ 3684 directory_table = (unsigned char **) 3685 xmalloc (n_directories * sizeof (unsigned char *)); 3686 3687 i = 0; 3688 while (*ptr_directory_table != 0) 3689 { 3690 directory_table[i] = ptr_directory_table; 3691 ptr_directory_table += strnlen ((char *) ptr_directory_table, 3692 ptr_directory_table - end) + 1; 3693 i++; 3694 } 3695 } 3696 /* Skip the NUL at the end of the table. */ 3697 data++; 3698 3699 /* Traverse the File Name table just to count the entries. */ 3700 if (*data != 0) 3701 { 3702 unsigned char *ptr_file_name_table = data; 3703 3704 while (*data != 0) 3705 { 3706 unsigned int bytes_read; 3707 3708 /* Skip Name, directory index, last modification time and length 3709 of file. */ 3710 data += strnlen ((char *) data, end - data) + 1; 3711 read_uleb128 (data, & bytes_read, end); 3712 data += bytes_read; 3713 read_uleb128 (data, & bytes_read, end); 3714 data += bytes_read; 3715 read_uleb128 (data, & bytes_read, end); 3716 data += bytes_read; 3717 3718 n_files++; 3719 } 3720 3721 /* Go through the file table again to save the strings. */ 3722 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry)); 3723 3724 i = 0; 3725 while (*ptr_file_name_table != 0) 3726 { 3727 unsigned int bytes_read; 3728 3729 file_table[i].name = ptr_file_name_table; 3730 ptr_file_name_table += strnlen ((char *) ptr_file_name_table, 3731 end - ptr_file_name_table) + 1; 3732 3733 /* We are not interested in directory, time or size. */ 3734 file_table[i].directory_index = read_uleb128 (ptr_file_name_table, 3735 & bytes_read, end); 3736 ptr_file_name_table += bytes_read; 3737 file_table[i].modification_date = read_uleb128 (ptr_file_name_table, 3738 & bytes_read, end); 3739 ptr_file_name_table += bytes_read; 3740 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end); 3741 ptr_file_name_table += bytes_read; 3742 i++; 3743 } 3744 i = 0; 3745 3746 /* Print the Compilation Unit's name and a header. */ 3747 if (directory_table == NULL) 3748 { 3749 printf (_("CU: %s:\n"), file_table[0].name); 3750 printf (_("File name Line number Starting address\n")); 3751 } 3752 else 3753 { 3754 unsigned int ix = file_table[0].directory_index; 3755 const char *directory = ix ? (char *)directory_table[ix - 1] : "."; 3756 3757 if (do_wide || strlen (directory) < 76) 3758 printf (_("CU: %s/%s:\n"), directory, file_table[0].name); 3759 else 3760 printf ("%s:\n", file_table[0].name); 3761 3762 printf (_("File name Line number Starting address\n")); 3763 } 3764 } 3765 3766 /* Skip the NUL at the end of the table. */ 3767 data++; 3768 3769 saved_linfo = linfo; 3770 } 3771 3772 /* This loop iterates through the Dwarf Line Number Program. */ 3773 while (data < end_of_sequence) 3774 { 3775 unsigned char op_code; 3776 int adv; 3777 unsigned long int uladv; 3778 unsigned int bytes_read; 3779 int is_special_opcode = 0; 3780 3781 op_code = *data++; 3782 3783 if (op_code >= linfo.li_opcode_base) 3784 { 3785 op_code -= linfo.li_opcode_base; 3786 uladv = (op_code / linfo.li_line_range); 3787 if (linfo.li_max_ops_per_insn == 1) 3788 { 3789 uladv *= linfo.li_min_insn_length; 3790 state_machine_regs.address += uladv; 3791 } 3792 else 3793 { 3794 state_machine_regs.address 3795 += ((state_machine_regs.op_index + uladv) 3796 / linfo.li_max_ops_per_insn) 3797 * linfo.li_min_insn_length; 3798 state_machine_regs.op_index 3799 = (state_machine_regs.op_index + uladv) 3800 % linfo.li_max_ops_per_insn; 3801 } 3802 3803 adv = (op_code % linfo.li_line_range) + linfo.li_line_base; 3804 state_machine_regs.line += adv; 3805 is_special_opcode = 1; 3806 } 3807 else switch (op_code) 3808 { 3809 case DW_LNS_extended_op: 3810 { 3811 unsigned int ext_op_code_len; 3812 unsigned char ext_op_code; 3813 unsigned char *op_code_data = data; 3814 3815 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read, 3816 end_of_sequence); 3817 op_code_data += bytes_read; 3818 3819 if (ext_op_code_len == 0) 3820 { 3821 warn (_("Badly formed extended line op encountered!\n")); 3822 break; 3823 } 3824 ext_op_code_len += bytes_read; 3825 ext_op_code = *op_code_data++; 3826 3827 switch (ext_op_code) 3828 { 3829 case DW_LNE_end_sequence: 3830 reset_state_machine (linfo.li_default_is_stmt); 3831 break; 3832 case DW_LNE_set_address: 3833 SAFE_BYTE_GET_AND_INC (state_machine_regs.address, 3834 op_code_data, 3835 ext_op_code_len - bytes_read - 1, 3836 end); 3837 state_machine_regs.op_index = 0; 3838 break; 3839 case DW_LNE_define_file: 3840 { 3841 file_table = (File_Entry *) xrealloc 3842 (file_table, (n_files + 1) * sizeof (File_Entry)); 3843 3844 ++state_machine_regs.last_file_entry; 3845 /* Source file name. */ 3846 file_table[n_files].name = op_code_data; 3847 op_code_data += strlen ((char *) op_code_data) + 1; 3848 /* Directory index. */ 3849 file_table[n_files].directory_index = 3850 read_uleb128 (op_code_data, & bytes_read, 3851 end_of_sequence); 3852 op_code_data += bytes_read; 3853 /* Last modification time. */ 3854 file_table[n_files].modification_date = 3855 read_uleb128 (op_code_data, & bytes_read, 3856 end_of_sequence); 3857 op_code_data += bytes_read; 3858 /* File length. */ 3859 file_table[n_files].length = 3860 read_uleb128 (op_code_data, & bytes_read, 3861 end_of_sequence); 3862 3863 n_files++; 3864 break; 3865 } 3866 case DW_LNE_set_discriminator: 3867 case DW_LNE_HP_set_sequence: 3868 /* Simply ignored. */ 3869 break; 3870 3871 default: 3872 printf (_("UNKNOWN (%u): length %d\n"), 3873 ext_op_code, ext_op_code_len - bytes_read); 3874 break; 3875 } 3876 data += ext_op_code_len; 3877 break; 3878 } 3879 case DW_LNS_copy: 3880 break; 3881 3882 case DW_LNS_advance_pc: 3883 uladv = read_uleb128 (data, & bytes_read, end); 3884 data += bytes_read; 3885 if (linfo.li_max_ops_per_insn == 1) 3886 { 3887 uladv *= linfo.li_min_insn_length; 3888 state_machine_regs.address += uladv; 3889 } 3890 else 3891 { 3892 state_machine_regs.address 3893 += ((state_machine_regs.op_index + uladv) 3894 / linfo.li_max_ops_per_insn) 3895 * linfo.li_min_insn_length; 3896 state_machine_regs.op_index 3897 = (state_machine_regs.op_index + uladv) 3898 % linfo.li_max_ops_per_insn; 3899 } 3900 break; 3901 3902 case DW_LNS_advance_line: 3903 adv = read_sleb128 (data, & bytes_read, end); 3904 data += bytes_read; 3905 state_machine_regs.line += adv; 3906 break; 3907 3908 case DW_LNS_set_file: 3909 adv = read_uleb128 (data, & bytes_read, end); 3910 data += bytes_read; 3911 state_machine_regs.file = adv; 3912 3913 if (file_table == NULL) 3914 printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1); 3915 else if (file_table[state_machine_regs.file - 1].directory_index == 0) 3916 /* If directory index is 0, that means current directory. */ 3917 printf ("\n./%s:[++]\n", 3918 file_table[state_machine_regs.file - 1].name); 3919 else if (directory_table == NULL) 3920 printf (_("\n [Use directory table entry %d]\n"), 3921 file_table[state_machine_regs.file - 1].directory_index - 1); 3922 else 3923 /* The directory index starts counting at 1. */ 3924 printf ("\n%s/%s:\n", 3925 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1], 3926 file_table[state_machine_regs.file - 1].name); 3927 break; 3928 3929 case DW_LNS_set_column: 3930 uladv = read_uleb128 (data, & bytes_read, end); 3931 data += bytes_read; 3932 state_machine_regs.column = uladv; 3933 break; 3934 3935 case DW_LNS_negate_stmt: 3936 adv = state_machine_regs.is_stmt; 3937 adv = ! adv; 3938 state_machine_regs.is_stmt = adv; 3939 break; 3940 3941 case DW_LNS_set_basic_block: 3942 state_machine_regs.basic_block = 1; 3943 break; 3944 3945 case DW_LNS_const_add_pc: 3946 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range); 3947 if (linfo.li_max_ops_per_insn == 1) 3948 { 3949 uladv *= linfo.li_min_insn_length; 3950 state_machine_regs.address += uladv; 3951 } 3952 else 3953 { 3954 state_machine_regs.address 3955 += ((state_machine_regs.op_index + uladv) 3956 / linfo.li_max_ops_per_insn) 3957 * linfo.li_min_insn_length; 3958 state_machine_regs.op_index 3959 = (state_machine_regs.op_index + uladv) 3960 % linfo.li_max_ops_per_insn; 3961 } 3962 break; 3963 3964 case DW_LNS_fixed_advance_pc: 3965 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); 3966 state_machine_regs.address += uladv; 3967 state_machine_regs.op_index = 0; 3968 break; 3969 3970 case DW_LNS_set_prologue_end: 3971 break; 3972 3973 case DW_LNS_set_epilogue_begin: 3974 break; 3975 3976 case DW_LNS_set_isa: 3977 uladv = read_uleb128 (data, & bytes_read, end); 3978 data += bytes_read; 3979 printf (_(" Set ISA to %lu\n"), uladv); 3980 break; 3981 3982 default: 3983 printf (_(" Unknown opcode %d with operands: "), op_code); 3984 3985 if (standard_opcodes != NULL) 3986 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) 3987 { 3988 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data, 3989 &bytes_read, end)), 3990 i == 1 ? "" : ", "); 3991 data += bytes_read; 3992 } 3993 putchar ('\n'); 3994 break; 3995 } 3996 3997 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row 3998 to the DWARF address/line matrix. */ 3999 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence) 4000 || (op_code == DW_LNS_copy)) 4001 { 4002 const unsigned int MAX_FILENAME_LENGTH = 35; 4003 char *fileName; 4004 char *newFileName = NULL; 4005 size_t fileNameLength; 4006 4007 if (file_table) 4008 fileName = (char *) file_table[state_machine_regs.file - 1].name; 4009 else 4010 fileName = "<unknown>"; 4011 4012 fileNameLength = strlen (fileName); 4013 4014 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide)) 4015 { 4016 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1); 4017 /* Truncate file name */ 4018 strncpy (newFileName, 4019 fileName + fileNameLength - MAX_FILENAME_LENGTH, 4020 MAX_FILENAME_LENGTH + 1); 4021 } 4022 else 4023 { 4024 newFileName = (char *) xmalloc (fileNameLength + 1); 4025 strncpy (newFileName, fileName, fileNameLength + 1); 4026 } 4027 4028 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH)) 4029 { 4030 if (linfo.li_max_ops_per_insn == 1) 4031 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n", 4032 newFileName, state_machine_regs.line, 4033 state_machine_regs.address); 4034 else 4035 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n", 4036 newFileName, state_machine_regs.line, 4037 state_machine_regs.address, 4038 state_machine_regs.op_index); 4039 } 4040 else 4041 { 4042 if (linfo.li_max_ops_per_insn == 1) 4043 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n", 4044 newFileName, state_machine_regs.line, 4045 state_machine_regs.address); 4046 else 4047 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n", 4048 newFileName, state_machine_regs.line, 4049 state_machine_regs.address, 4050 state_machine_regs.op_index); 4051 } 4052 4053 if (op_code == DW_LNE_end_sequence) 4054 printf ("\n"); 4055 4056 free (newFileName); 4057 } 4058 } 4059 4060 if (file_table) 4061 { 4062 free (file_table); 4063 file_table = NULL; 4064 n_files = 0; 4065 } 4066 4067 if (directory_table) 4068 { 4069 free (directory_table); 4070 directory_table = NULL; 4071 n_directories = 0; 4072 } 4073 4074 putchar ('\n'); 4075 } 4076 4077 return 1; 4078 } 4079 4080 static int 4081 display_debug_lines (struct dwarf_section *section, void *file) 4082 { 4083 unsigned char *data = section->start; 4084 unsigned char *end = data + section->size; 4085 int retValRaw = 1; 4086 int retValDecoded = 1; 4087 4088 if (do_debug_lines == 0) 4089 do_debug_lines |= FLAG_DEBUG_LINES_RAW; 4090 4091 load_debug_section (line_str, file); 4092 4093 if (do_debug_lines & FLAG_DEBUG_LINES_RAW) 4094 retValRaw = display_debug_lines_raw (section, data, end); 4095 4096 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED) 4097 retValDecoded = display_debug_lines_decoded (section, data, end); 4098 4099 if (!retValRaw || !retValDecoded) 4100 return 0; 4101 4102 return 1; 4103 } 4104 4105 static debug_info * 4106 find_debug_info_for_offset (unsigned long offset) 4107 { 4108 unsigned int i; 4109 4110 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE) 4111 return NULL; 4112 4113 for (i = 0; i < num_debug_info_entries; i++) 4114 if (debug_information[i].cu_offset == offset) 4115 return debug_information + i; 4116 4117 return NULL; 4118 } 4119 4120 static const char * 4121 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind) 4122 { 4123 /* See gdb/gdb-index.h. */ 4124 static const char * const kinds[] = 4125 { 4126 N_ ("no info"), 4127 N_ ("type"), 4128 N_ ("variable"), 4129 N_ ("function"), 4130 N_ ("other"), 4131 N_ ("unused5"), 4132 N_ ("unused6"), 4133 N_ ("unused7") 4134 }; 4135 4136 return _ (kinds[kind]); 4137 } 4138 4139 static int 4140 display_debug_pubnames_worker (struct dwarf_section *section, 4141 void *file ATTRIBUTE_UNUSED, 4142 int is_gnu) 4143 { 4144 DWARF2_Internal_PubNames names; 4145 unsigned char *start = section->start; 4146 unsigned char *end = start + section->size; 4147 4148 /* It does not matter if this load fails, 4149 we test for that later on. */ 4150 load_debug_info (file); 4151 4152 printf (_("Contents of the %s section:\n\n"), section->name); 4153 4154 while (start < end) 4155 { 4156 unsigned char *data; 4157 unsigned char *adr; 4158 dwarf_vma offset; 4159 unsigned int offset_size, initial_length_size; 4160 4161 data = start; 4162 4163 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end); 4164 if (names.pn_length == 0xffffffff) 4165 { 4166 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end); 4167 offset_size = 8; 4168 initial_length_size = 12; 4169 } 4170 else 4171 { 4172 offset_size = 4; 4173 initial_length_size = 4; 4174 } 4175 4176 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end); 4177 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end); 4178 4179 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE 4180 && num_debug_info_entries > 0 4181 && find_debug_info_for_offset (names.pn_offset) == NULL) 4182 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"), 4183 (unsigned long) names.pn_offset, section->name); 4184 4185 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end); 4186 4187 adr = start + names.pn_length + initial_length_size; 4188 /* PR 17531: file: 7615b6b2. */ 4189 if ((dwarf_signed_vma) names.pn_length < 0 4190 /* PR 17531: file: a5dbeaa7. */ 4191 || adr < start) 4192 { 4193 warn (_("Negative length for public name: 0x%lx\n"), (long) names.pn_length); 4194 start = end; 4195 } 4196 else 4197 start = adr; 4198 4199 printf (_(" Length: %ld\n"), 4200 (long) names.pn_length); 4201 printf (_(" Version: %d\n"), 4202 names.pn_version); 4203 printf (_(" Offset into .debug_info section: 0x%lx\n"), 4204 (unsigned long) names.pn_offset); 4205 printf (_(" Size of area in .debug_info section: %ld\n"), 4206 (long) names.pn_size); 4207 4208 if (names.pn_version != 2 && names.pn_version != 3) 4209 { 4210 static int warned = 0; 4211 4212 if (! warned) 4213 { 4214 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n")); 4215 warned = 1; 4216 } 4217 4218 continue; 4219 } 4220 4221 if (is_gnu) 4222 printf (_("\n Offset Kind Name\n")); 4223 else 4224 printf (_("\n Offset\tName\n")); 4225 4226 do 4227 { 4228 bfd_size_type maxprint; 4229 4230 SAFE_BYTE_GET (offset, data, offset_size, end); 4231 4232 if (offset != 0) 4233 { 4234 data += offset_size; 4235 if (data >= end) 4236 break; 4237 maxprint = (end - data) - 1; 4238 4239 if (is_gnu) 4240 { 4241 unsigned int kind_data; 4242 gdb_index_symbol_kind kind; 4243 const char *kind_name; 4244 int is_static; 4245 4246 SAFE_BYTE_GET (kind_data, data, 1, end); 4247 data++; 4248 maxprint --; 4249 /* GCC computes the kind as the upper byte in the CU index 4250 word, and then right shifts it by the CU index size. 4251 Left shift KIND to where the gdb-index.h accessor macros 4252 can use it. */ 4253 kind_data <<= GDB_INDEX_CU_BITSIZE; 4254 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data); 4255 kind_name = get_gdb_index_symbol_kind_name (kind); 4256 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data); 4257 printf (" %-6lx %s,%-10s %.*s\n", 4258 (unsigned long) offset, is_static ? _("s") : _("g"), 4259 kind_name, (int) maxprint, data); 4260 } 4261 else 4262 printf (" %-6lx\t%.*s\n", 4263 (unsigned long) offset, (int) maxprint, data); 4264 4265 data += strnlen ((char *) data, maxprint) + 1; 4266 if (data >= end) 4267 break; 4268 } 4269 } 4270 while (offset != 0); 4271 } 4272 4273 printf ("\n"); 4274 return 1; 4275 } 4276 4277 static int 4278 display_debug_pubnames (struct dwarf_section *section, void *file) 4279 { 4280 return display_debug_pubnames_worker (section, file, 0); 4281 } 4282 4283 static int 4284 display_debug_gnu_pubnames (struct dwarf_section *section, void *file) 4285 { 4286 return display_debug_pubnames_worker (section, file, 1); 4287 } 4288 4289 static int 4290 display_debug_macinfo (struct dwarf_section *section, 4291 void *file ATTRIBUTE_UNUSED) 4292 { 4293 unsigned char *start = section->start; 4294 unsigned char *end = start + section->size; 4295 unsigned char *curr = start; 4296 unsigned int bytes_read; 4297 enum dwarf_macinfo_record_type op; 4298 4299 printf (_("Contents of the %s section:\n\n"), section->name); 4300 4301 while (curr < end) 4302 { 4303 unsigned int lineno; 4304 const unsigned char *string; 4305 4306 op = (enum dwarf_macinfo_record_type) *curr; 4307 curr++; 4308 4309 switch (op) 4310 { 4311 case DW_MACINFO_start_file: 4312 { 4313 unsigned int filenum; 4314 4315 lineno = read_uleb128 (curr, & bytes_read, end); 4316 curr += bytes_read; 4317 filenum = read_uleb128 (curr, & bytes_read, end); 4318 curr += bytes_read; 4319 4320 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), 4321 lineno, filenum); 4322 } 4323 break; 4324 4325 case DW_MACINFO_end_file: 4326 printf (_(" DW_MACINFO_end_file\n")); 4327 break; 4328 4329 case DW_MACINFO_define: 4330 lineno = read_uleb128 (curr, & bytes_read, end); 4331 curr += bytes_read; 4332 string = curr; 4333 curr += strnlen ((char *) string, end - string) + 1; 4334 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), 4335 lineno, string); 4336 break; 4337 4338 case DW_MACINFO_undef: 4339 lineno = read_uleb128 (curr, & bytes_read, end); 4340 curr += bytes_read; 4341 string = curr; 4342 curr += strnlen ((char *) string, end - string) + 1; 4343 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), 4344 lineno, string); 4345 break; 4346 4347 case DW_MACINFO_vendor_ext: 4348 { 4349 unsigned int constant; 4350 4351 constant = read_uleb128 (curr, & bytes_read, end); 4352 curr += bytes_read; 4353 string = curr; 4354 curr += strnlen ((char *) string, end - string) + 1; 4355 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), 4356 constant, string); 4357 } 4358 break; 4359 } 4360 } 4361 4362 return 1; 4363 } 4364 4365 /* Given LINE_OFFSET into the .debug_line section, attempt to return 4366 filename and dirname corresponding to file name table entry with index 4367 FILEIDX. Return NULL on failure. */ 4368 4369 static unsigned char * 4370 get_line_filename_and_dirname (dwarf_vma line_offset, 4371 dwarf_vma fileidx, 4372 unsigned char **dir_name) 4373 { 4374 struct dwarf_section *section = &debug_displays [line].section; 4375 unsigned char *hdrptr, *dirtable, *file_name; 4376 unsigned int offset_size, initial_length_size; 4377 unsigned int version, opcode_base, bytes_read; 4378 dwarf_vma length, diridx; 4379 const unsigned char * end; 4380 4381 *dir_name = NULL; 4382 if (section->start == NULL 4383 || line_offset >= section->size 4384 || fileidx == 0) 4385 return NULL; 4386 4387 hdrptr = section->start + line_offset; 4388 end = section->start + section->size; 4389 4390 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end); 4391 if (length == 0xffffffff) 4392 { 4393 /* This section is 64-bit DWARF 3. */ 4394 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end); 4395 offset_size = 8; 4396 initial_length_size = 12; 4397 } 4398 else 4399 { 4400 offset_size = 4; 4401 initial_length_size = 4; 4402 } 4403 if (length + initial_length_size > section->size) 4404 return NULL; 4405 4406 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end); 4407 if (version != 2 && version != 3 && version != 4) 4408 return NULL; 4409 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */ 4410 if (version >= 4) 4411 hdrptr++; /* Skip max_ops_per_insn. */ 4412 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */ 4413 4414 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end); 4415 if (opcode_base == 0) 4416 return NULL; 4417 4418 hdrptr += opcode_base - 1; 4419 dirtable = hdrptr; 4420 /* Skip over dirname table. */ 4421 while (*hdrptr != '\0') 4422 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1; 4423 hdrptr++; /* Skip the NUL at the end of the table. */ 4424 /* Now skip over preceding filename table entries. */ 4425 for (; *hdrptr != '\0' && fileidx > 1; fileidx--) 4426 { 4427 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1; 4428 read_uleb128 (hdrptr, &bytes_read, end); 4429 hdrptr += bytes_read; 4430 read_uleb128 (hdrptr, &bytes_read, end); 4431 hdrptr += bytes_read; 4432 read_uleb128 (hdrptr, &bytes_read, end); 4433 hdrptr += bytes_read; 4434 } 4435 if (hdrptr == end || *hdrptr == '\0') 4436 return NULL; 4437 file_name = hdrptr; 4438 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1; 4439 diridx = read_uleb128 (hdrptr, &bytes_read, end); 4440 if (diridx == 0) 4441 return file_name; 4442 for (; *dirtable != '\0' && diridx > 1; diridx--) 4443 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1; 4444 if (*dirtable == '\0') 4445 return NULL; 4446 *dir_name = dirtable; 4447 return file_name; 4448 } 4449 4450 static int 4451 display_debug_macro (struct dwarf_section *section, 4452 void *file) 4453 { 4454 unsigned char *start = section->start; 4455 unsigned char *end = start + section->size; 4456 unsigned char *curr = start; 4457 unsigned char *extended_op_buf[256]; 4458 unsigned int bytes_read; 4459 4460 load_debug_section (str, file); 4461 load_debug_section (line, file); 4462 4463 printf (_("Contents of the %s section:\n\n"), section->name); 4464 4465 while (curr < end) 4466 { 4467 unsigned int lineno, version, flags; 4468 unsigned int offset_size = 4; 4469 const unsigned char *string; 4470 dwarf_vma line_offset = 0, sec_offset = curr - start, offset; 4471 unsigned char **extended_ops = NULL; 4472 4473 SAFE_BYTE_GET_AND_INC (version, curr, 2, end); 4474 if (version != 4) 4475 { 4476 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"), 4477 section->name); 4478 return 0; 4479 } 4480 4481 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end); 4482 if (flags & 1) 4483 offset_size = 8; 4484 printf (_(" Offset: 0x%lx\n"), 4485 (unsigned long) sec_offset); 4486 printf (_(" Version: %d\n"), version); 4487 printf (_(" Offset size: %d\n"), offset_size); 4488 if (flags & 2) 4489 { 4490 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end); 4491 printf (_(" Offset into .debug_line: 0x%lx\n"), 4492 (unsigned long) line_offset); 4493 } 4494 if (flags & 4) 4495 { 4496 unsigned int i, count, op; 4497 dwarf_vma nargs, n; 4498 4499 SAFE_BYTE_GET_AND_INC (count, curr, 1, end); 4500 4501 memset (extended_op_buf, 0, sizeof (extended_op_buf)); 4502 extended_ops = extended_op_buf; 4503 if (count) 4504 { 4505 printf (_(" Extension opcode arguments:\n")); 4506 for (i = 0; i < count; i++) 4507 { 4508 SAFE_BYTE_GET_AND_INC (op, curr, 1, end); 4509 extended_ops[op] = curr; 4510 nargs = read_uleb128 (curr, &bytes_read, end); 4511 curr += bytes_read; 4512 if (nargs == 0) 4513 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op); 4514 else 4515 { 4516 printf (_(" DW_MACRO_GNU_%02x arguments: "), op); 4517 for (n = 0; n < nargs; n++) 4518 { 4519 unsigned int form; 4520 4521 SAFE_BYTE_GET_AND_INC (form, curr, 1, end); 4522 printf ("%s%s", get_FORM_name (form), 4523 n == nargs - 1 ? "\n" : ", "); 4524 switch (form) 4525 { 4526 case DW_FORM_data1: 4527 case DW_FORM_data2: 4528 case DW_FORM_data4: 4529 case DW_FORM_data8: 4530 case DW_FORM_sdata: 4531 case DW_FORM_udata: 4532 case DW_FORM_block: 4533 case DW_FORM_block1: 4534 case DW_FORM_block2: 4535 case DW_FORM_block4: 4536 case DW_FORM_flag: 4537 case DW_FORM_string: 4538 case DW_FORM_strp: 4539 case DW_FORM_sec_offset: 4540 break; 4541 default: 4542 error (_("Invalid extension opcode form %s\n"), 4543 get_FORM_name (form)); 4544 return 0; 4545 } 4546 } 4547 } 4548 } 4549 } 4550 } 4551 printf ("\n"); 4552 4553 while (1) 4554 { 4555 unsigned int op; 4556 4557 if (curr >= end) 4558 { 4559 error (_(".debug_macro section not zero terminated\n")); 4560 return 0; 4561 } 4562 4563 SAFE_BYTE_GET_AND_INC (op, curr, 1, end); 4564 if (op == 0) 4565 break; 4566 4567 switch (op) 4568 { 4569 case DW_MACRO_GNU_start_file: 4570 { 4571 unsigned int filenum; 4572 unsigned char *file_name = NULL, *dir_name = NULL; 4573 4574 lineno = read_uleb128 (curr, &bytes_read, end); 4575 curr += bytes_read; 4576 filenum = read_uleb128 (curr, &bytes_read, end); 4577 curr += bytes_read; 4578 4579 if ((flags & 2) == 0) 4580 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n")); 4581 else 4582 file_name 4583 = get_line_filename_and_dirname (line_offset, filenum, 4584 &dir_name); 4585 if (file_name == NULL) 4586 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"), 4587 lineno, filenum); 4588 else 4589 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"), 4590 lineno, filenum, 4591 dir_name != NULL ? (const char *) dir_name : "", 4592 dir_name != NULL ? "/" : "", file_name); 4593 } 4594 break; 4595 4596 case DW_MACRO_GNU_end_file: 4597 printf (_(" DW_MACRO_GNU_end_file\n")); 4598 break; 4599 4600 case DW_MACRO_GNU_define: 4601 lineno = read_uleb128 (curr, &bytes_read, end); 4602 curr += bytes_read; 4603 string = curr; 4604 curr += strnlen ((char *) string, end - string) + 1; 4605 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"), 4606 lineno, string); 4607 break; 4608 4609 case DW_MACRO_GNU_undef: 4610 lineno = read_uleb128 (curr, &bytes_read, end); 4611 curr += bytes_read; 4612 string = curr; 4613 curr += strnlen ((char *) string, end - string) + 1; 4614 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"), 4615 lineno, string); 4616 break; 4617 4618 case DW_MACRO_GNU_define_indirect: 4619 lineno = read_uleb128 (curr, &bytes_read, end); 4620 curr += bytes_read; 4621 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4622 string = fetch_indirect_string (offset); 4623 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"), 4624 lineno, string); 4625 break; 4626 4627 case DW_MACRO_GNU_undef_indirect: 4628 lineno = read_uleb128 (curr, &bytes_read, end); 4629 curr += bytes_read; 4630 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4631 string = fetch_indirect_string (offset); 4632 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"), 4633 lineno, string); 4634 break; 4635 4636 case DW_MACRO_GNU_transparent_include: 4637 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4638 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"), 4639 (unsigned long) offset); 4640 break; 4641 4642 case DW_MACRO_GNU_define_indirect_alt: 4643 lineno = read_uleb128 (curr, &bytes_read, end); 4644 curr += bytes_read; 4645 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4646 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"), 4647 lineno, (unsigned long) offset); 4648 break; 4649 4650 case DW_MACRO_GNU_undef_indirect_alt: 4651 lineno = read_uleb128 (curr, &bytes_read, end); 4652 curr += bytes_read; 4653 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4654 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"), 4655 lineno, (unsigned long) offset); 4656 break; 4657 4658 case DW_MACRO_GNU_transparent_include_alt: 4659 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); 4660 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"), 4661 (unsigned long) offset); 4662 break; 4663 4664 default: 4665 if (extended_ops == NULL || extended_ops[op] == NULL) 4666 { 4667 error (_(" Unknown macro opcode %02x seen\n"), op); 4668 return 0; 4669 } 4670 else 4671 { 4672 /* Skip over unhandled opcodes. */ 4673 dwarf_vma nargs, n; 4674 unsigned char *desc = extended_ops[op]; 4675 nargs = read_uleb128 (desc, &bytes_read, end); 4676 desc += bytes_read; 4677 if (nargs == 0) 4678 { 4679 printf (_(" DW_MACRO_GNU_%02x\n"), op); 4680 break; 4681 } 4682 printf (_(" DW_MACRO_GNU_%02x -"), op); 4683 for (n = 0; n < nargs; n++) 4684 { 4685 int val; 4686 4687 SAFE_BYTE_GET_AND_INC (val, desc, 1, end); 4688 curr 4689 = read_and_display_attr_value (0, val, 4690 curr, end, 0, 0, offset_size, 4691 version, NULL, 0, NULL, 4692 NULL); 4693 if (n != nargs - 1) 4694 printf (","); 4695 } 4696 printf ("\n"); 4697 } 4698 break; 4699 } 4700 } 4701 4702 printf ("\n"); 4703 } 4704 4705 return 1; 4706 } 4707 4708 static int 4709 display_debug_abbrev (struct dwarf_section *section, 4710 void *file ATTRIBUTE_UNUSED) 4711 { 4712 abbrev_entry *entry; 4713 unsigned char *start = section->start; 4714 unsigned char *end = start + section->size; 4715 4716 printf (_("Contents of the %s section:\n\n"), section->name); 4717 4718 do 4719 { 4720 unsigned char *last; 4721 4722 free_abbrevs (); 4723 4724 last = start; 4725 start = process_abbrev_section (start, end); 4726 4727 if (first_abbrev == NULL) 4728 continue; 4729 4730 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start)); 4731 4732 for (entry = first_abbrev; entry; entry = entry->next) 4733 { 4734 abbrev_attr *attr; 4735 4736 printf (" %ld %s [%s]\n", 4737 entry->entry, 4738 get_TAG_name (entry->tag), 4739 entry->children ? _("has children") : _("no children")); 4740 4741 for (attr = entry->first_attr; attr; attr = attr->next) 4742 printf (" %-18s %s\n", 4743 get_AT_name (attr->attribute), 4744 get_FORM_name (attr->form)); 4745 } 4746 } 4747 while (start); 4748 4749 printf ("\n"); 4750 4751 return 1; 4752 } 4753 4754 /* Return true when ADDR is the maximum address, when addresses are 4755 POINTER_SIZE bytes long. */ 4756 4757 static bfd_boolean 4758 is_max_address (dwarf_vma addr, unsigned int pointer_size) 4759 { 4760 dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1)); 4761 return ((addr & mask) == mask); 4762 } 4763 4764 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */ 4765 4766 static void 4767 display_loc_list (struct dwarf_section *section, 4768 unsigned char **start_ptr, 4769 unsigned int debug_info_entry, 4770 unsigned long offset, 4771 unsigned long base_address, 4772 int has_frame_base) 4773 { 4774 unsigned char *start = *start_ptr; 4775 unsigned char *section_end = section->start + section->size; 4776 unsigned long cu_offset; 4777 unsigned int pointer_size; 4778 unsigned int offset_size; 4779 int dwarf_version; 4780 4781 dwarf_vma begin; 4782 dwarf_vma end; 4783 unsigned short length; 4784 int need_frame_base; 4785 4786 if (debug_info_entry >= num_debug_info_entries) 4787 { 4788 warn (_("No debug information available for loc lists of entry: %u\n"), 4789 debug_info_entry); 4790 return; 4791 } 4792 4793 cu_offset = debug_information [debug_info_entry].cu_offset; 4794 pointer_size = debug_information [debug_info_entry].pointer_size; 4795 offset_size = debug_information [debug_info_entry].offset_size; 4796 dwarf_version = debug_information [debug_info_entry].dwarf_version; 4797 4798 if (pointer_size < 2 || pointer_size > 8) 4799 { 4800 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"), 4801 pointer_size, debug_info_entry); 4802 return; 4803 } 4804 4805 while (1) 4806 { 4807 unsigned long off = offset + (start - *start_ptr); 4808 4809 if (start + 2 * pointer_size > section_end) 4810 { 4811 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 4812 offset); 4813 break; 4814 } 4815 4816 printf (" %8.8lx ", off); 4817 4818 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end); 4819 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end); 4820 4821 if (begin == 0 && end == 0) 4822 { 4823 /* PR 18374: In a object file we can have a location list that 4824 starts with a begin and end of 0 because there are relocations 4825 that need to be applied to the addresses. Actually applying 4826 the relocations now does not help as they will probably resolve 4827 to 0, since the object file has not been fully linked. Real 4828 end of list markers will not have any relocations against them. */ 4829 if (! reloc_at (section, off) 4830 && ! reloc_at (section, off + pointer_size)) 4831 { 4832 printf (_("<End of list>\n")); 4833 break; 4834 } 4835 } 4836 4837 /* Check base address specifiers. */ 4838 if (is_max_address (begin, pointer_size) 4839 && !is_max_address (end, pointer_size)) 4840 { 4841 base_address = end; 4842 print_dwarf_vma (begin, pointer_size); 4843 print_dwarf_vma (end, pointer_size); 4844 printf (_("(base address)\n")); 4845 continue; 4846 } 4847 4848 if (start + 2 > section_end) 4849 { 4850 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 4851 offset); 4852 break; 4853 } 4854 4855 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end); 4856 4857 if (start + length > section_end) 4858 { 4859 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 4860 offset); 4861 break; 4862 } 4863 4864 print_dwarf_vma (begin + base_address, pointer_size); 4865 print_dwarf_vma (end + base_address, pointer_size); 4866 4867 putchar ('('); 4868 need_frame_base = decode_location_expression (start, 4869 pointer_size, 4870 offset_size, 4871 dwarf_version, 4872 length, 4873 cu_offset, section); 4874 putchar (')'); 4875 4876 if (need_frame_base && !has_frame_base) 4877 printf (_(" [without DW_AT_frame_base]")); 4878 4879 if (begin == end) 4880 fputs (_(" (start == end)"), stdout); 4881 else if (begin > end) 4882 fputs (_(" (start > end)"), stdout); 4883 4884 putchar ('\n'); 4885 4886 start += length; 4887 } 4888 4889 *start_ptr = start; 4890 } 4891 4892 /* Print a .debug_addr table index in decimal, surrounded by square brackets, 4893 right-adjusted in a field of length LEN, and followed by a space. */ 4894 4895 static void 4896 print_addr_index (unsigned int idx, unsigned int len) 4897 { 4898 static char buf[15]; 4899 snprintf (buf, sizeof (buf), "[%d]", idx); 4900 printf ("%*s ", len, buf); 4901 } 4902 4903 /* Display a location list from a .dwo section. It uses address indexes rather 4904 than embedded addresses. This code closely follows display_loc_list, but the 4905 two are sufficiently different that combining things is very ugly. */ 4906 4907 static void 4908 display_loc_list_dwo (struct dwarf_section *section, 4909 unsigned char **start_ptr, 4910 unsigned int debug_info_entry, 4911 unsigned long offset, 4912 int has_frame_base) 4913 { 4914 unsigned char *start = *start_ptr; 4915 unsigned char *section_end = section->start + section->size; 4916 unsigned long cu_offset; 4917 unsigned int pointer_size; 4918 unsigned int offset_size; 4919 int dwarf_version; 4920 int entry_type; 4921 unsigned short length; 4922 int need_frame_base; 4923 unsigned int idx; 4924 unsigned int bytes_read; 4925 4926 if (debug_info_entry >= num_debug_info_entries) 4927 { 4928 warn (_("No debug information for loc lists of entry: %u\n"), 4929 debug_info_entry); 4930 return; 4931 } 4932 4933 cu_offset = debug_information [debug_info_entry].cu_offset; 4934 pointer_size = debug_information [debug_info_entry].pointer_size; 4935 offset_size = debug_information [debug_info_entry].offset_size; 4936 dwarf_version = debug_information [debug_info_entry].dwarf_version; 4937 4938 if (pointer_size < 2 || pointer_size > 8) 4939 { 4940 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"), 4941 pointer_size, debug_info_entry); 4942 return; 4943 } 4944 4945 while (1) 4946 { 4947 printf (" %8.8lx ", offset + (start - *start_ptr)); 4948 4949 if (start >= section_end) 4950 { 4951 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 4952 offset); 4953 break; 4954 } 4955 4956 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end); 4957 switch (entry_type) 4958 { 4959 case 0: /* A terminating entry. */ 4960 *start_ptr = start; 4961 printf (_("<End of list>\n")); 4962 return; 4963 case 1: /* A base-address entry. */ 4964 idx = read_uleb128 (start, &bytes_read, section_end); 4965 start += bytes_read; 4966 print_addr_index (idx, 8); 4967 printf (" "); 4968 printf (_("(base address selection entry)\n")); 4969 continue; 4970 case 2: /* A start/end entry. */ 4971 idx = read_uleb128 (start, &bytes_read, section_end); 4972 start += bytes_read; 4973 print_addr_index (idx, 8); 4974 idx = read_uleb128 (start, &bytes_read, section_end); 4975 start += bytes_read; 4976 print_addr_index (idx, 8); 4977 break; 4978 case 3: /* A start/length entry. */ 4979 idx = read_uleb128 (start, &bytes_read, section_end); 4980 start += bytes_read; 4981 print_addr_index (idx, 8); 4982 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end); 4983 printf ("%08x ", idx); 4984 break; 4985 case 4: /* An offset pair entry. */ 4986 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end); 4987 printf ("%08x ", idx); 4988 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end); 4989 printf ("%08x ", idx); 4990 break; 4991 default: 4992 warn (_("Unknown location list entry type 0x%x.\n"), entry_type); 4993 *start_ptr = start; 4994 return; 4995 } 4996 4997 if (start + 2 > section_end) 4998 { 4999 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 5000 offset); 5001 break; 5002 } 5003 5004 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end); 5005 if (start + length > section_end) 5006 { 5007 warn (_("Location list starting at offset 0x%lx is not terminated.\n"), 5008 offset); 5009 break; 5010 } 5011 5012 putchar ('('); 5013 need_frame_base = decode_location_expression (start, 5014 pointer_size, 5015 offset_size, 5016 dwarf_version, 5017 length, 5018 cu_offset, section); 5019 putchar (')'); 5020 5021 if (need_frame_base && !has_frame_base) 5022 printf (_(" [without DW_AT_frame_base]")); 5023 5024 putchar ('\n'); 5025 5026 start += length; 5027 } 5028 5029 *start_ptr = start; 5030 } 5031 5032 /* Sort array of indexes in ascending order of loc_offsets[idx]. */ 5033 5034 static dwarf_vma *loc_offsets; 5035 5036 static int 5037 loc_offsets_compar (const void *ap, const void *bp) 5038 { 5039 dwarf_vma a = loc_offsets[*(const unsigned int *) ap]; 5040 dwarf_vma b = loc_offsets[*(const unsigned int *) bp]; 5041 5042 return (a > b) - (b > a); 5043 } 5044 5045 static int 5046 display_debug_loc (struct dwarf_section *section, void *file) 5047 { 5048 unsigned char *start = section->start; 5049 unsigned long bytes; 5050 unsigned char *section_begin = start; 5051 unsigned int num_loc_list = 0; 5052 unsigned long last_offset = 0; 5053 unsigned int first = 0; 5054 unsigned int i; 5055 unsigned int j; 5056 int seen_first_offset = 0; 5057 int locs_sorted = 1; 5058 unsigned char *next; 5059 unsigned int *array = NULL; 5060 const char *suffix = strrchr (section->name, '.'); 5061 int is_dwo = 0; 5062 5063 if (suffix && strcmp (suffix, ".dwo") == 0) 5064 is_dwo = 1; 5065 5066 bytes = section->size; 5067 5068 if (bytes == 0) 5069 { 5070 printf (_("\nThe %s section is empty.\n"), section->name); 5071 return 0; 5072 } 5073 5074 if (load_debug_info (file) == 0) 5075 { 5076 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"), 5077 section->name); 5078 return 0; 5079 } 5080 5081 /* Check the order of location list in .debug_info section. If 5082 offsets of location lists are in the ascending order, we can 5083 use `debug_information' directly. */ 5084 for (i = 0; i < num_debug_info_entries; i++) 5085 { 5086 unsigned int num; 5087 5088 num = debug_information [i].num_loc_offsets; 5089 if (num > num_loc_list) 5090 num_loc_list = num; 5091 5092 /* Check if we can use `debug_information' directly. */ 5093 if (locs_sorted && num != 0) 5094 { 5095 if (!seen_first_offset) 5096 { 5097 /* This is the first location list. */ 5098 last_offset = debug_information [i].loc_offsets [0]; 5099 first = i; 5100 seen_first_offset = 1; 5101 j = 1; 5102 } 5103 else 5104 j = 0; 5105 5106 for (; j < num; j++) 5107 { 5108 if (last_offset > 5109 debug_information [i].loc_offsets [j]) 5110 { 5111 locs_sorted = 0; 5112 break; 5113 } 5114 last_offset = debug_information [i].loc_offsets [j]; 5115 } 5116 } 5117 } 5118 5119 if (!seen_first_offset) 5120 error (_("No location lists in .debug_info section!\n")); 5121 5122 if (debug_information [first].num_loc_offsets > 0 5123 && debug_information [first].loc_offsets [0] != 0) 5124 warn (_("Location lists in %s section start at 0x%s\n"), 5125 section->name, 5126 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0])); 5127 5128 if (!locs_sorted) 5129 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int)); 5130 printf (_("Contents of the %s section:\n\n"), section->name); 5131 if (reloc_at (section, 0)) 5132 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n")); 5133 printf (_(" Offset Begin End Expression\n")); 5134 5135 seen_first_offset = 0; 5136 for (i = first; i < num_debug_info_entries; i++) 5137 { 5138 unsigned long offset; 5139 unsigned long base_address; 5140 unsigned int k; 5141 int has_frame_base; 5142 5143 if (!locs_sorted) 5144 { 5145 for (k = 0; k < debug_information [i].num_loc_offsets; k++) 5146 array[k] = k; 5147 loc_offsets = debug_information [i].loc_offsets; 5148 qsort (array, debug_information [i].num_loc_offsets, 5149 sizeof (*array), loc_offsets_compar); 5150 } 5151 5152 for (k = 0; k < debug_information [i].num_loc_offsets; k++) 5153 { 5154 j = locs_sorted ? k : array[k]; 5155 if (k 5156 && debug_information [i].loc_offsets [locs_sorted 5157 ? k - 1 : array [k - 1]] 5158 == debug_information [i].loc_offsets [j]) 5159 continue; 5160 has_frame_base = debug_information [i].have_frame_base [j]; 5161 offset = debug_information [i].loc_offsets [j]; 5162 next = section_begin + offset; 5163 base_address = debug_information [i].base_address; 5164 5165 if (!seen_first_offset) 5166 seen_first_offset = 1; 5167 else 5168 { 5169 if (start < next) 5170 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"), 5171 (unsigned long) (start - section_begin), 5172 (unsigned long) offset); 5173 else if (start > next) 5174 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"), 5175 (unsigned long) (start - section_begin), 5176 (unsigned long) offset); 5177 } 5178 start = next; 5179 5180 if (offset >= bytes) 5181 { 5182 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"), 5183 offset); 5184 continue; 5185 } 5186 5187 if (is_dwo) 5188 display_loc_list_dwo (section, &start, i, offset, has_frame_base); 5189 else 5190 display_loc_list (section, &start, i, offset, base_address, 5191 has_frame_base); 5192 } 5193 } 5194 5195 if (start < section->start + section->size) 5196 warn (_("There are %ld unused bytes at the end of section %s\n"), 5197 (long) (section->start + section->size - start), section->name); 5198 putchar ('\n'); 5199 free (array); 5200 return 1; 5201 } 5202 5203 static int 5204 display_debug_str (struct dwarf_section *section, 5205 void *file ATTRIBUTE_UNUSED) 5206 { 5207 unsigned char *start = section->start; 5208 unsigned long bytes = section->size; 5209 dwarf_vma addr = section->address; 5210 5211 if (bytes == 0) 5212 { 5213 printf (_("\nThe %s section is empty.\n"), section->name); 5214 return 0; 5215 } 5216 5217 printf (_("Contents of the %s section:\n\n"), section->name); 5218 5219 while (bytes) 5220 { 5221 int j; 5222 int k; 5223 int lbytes; 5224 5225 lbytes = (bytes > 16 ? 16 : bytes); 5226 5227 printf (" 0x%8.8lx ", (unsigned long) addr); 5228 5229 for (j = 0; j < 16; j++) 5230 { 5231 if (j < lbytes) 5232 printf ("%2.2x", start[j]); 5233 else 5234 printf (" "); 5235 5236 if ((j & 3) == 3) 5237 printf (" "); 5238 } 5239 5240 for (j = 0; j < lbytes; j++) 5241 { 5242 k = start[j]; 5243 if (k >= ' ' && k < 0x80) 5244 printf ("%c", k); 5245 else 5246 printf ("."); 5247 } 5248 5249 putchar ('\n'); 5250 5251 start += lbytes; 5252 addr += lbytes; 5253 bytes -= lbytes; 5254 } 5255 5256 putchar ('\n'); 5257 5258 return 1; 5259 } 5260 5261 static int 5262 display_debug_info (struct dwarf_section *section, void *file) 5263 { 5264 return process_debug_info (section, file, section->abbrev_sec, 0, 0); 5265 } 5266 5267 static int 5268 display_debug_types (struct dwarf_section *section, void *file) 5269 { 5270 return process_debug_info (section, file, section->abbrev_sec, 0, 1); 5271 } 5272 5273 static int 5274 display_trace_info (struct dwarf_section *section, void *file) 5275 { 5276 return process_debug_info (section, file, section->abbrev_sec, 0, 0); 5277 } 5278 5279 static int 5280 display_debug_aranges (struct dwarf_section *section, 5281 void *file ATTRIBUTE_UNUSED) 5282 { 5283 unsigned char *start = section->start; 5284 unsigned char *end = start + section->size; 5285 5286 printf (_("Contents of the %s section:\n\n"), section->name); 5287 5288 /* It does not matter if this load fails, 5289 we test for that later on. */ 5290 load_debug_info (file); 5291 5292 while (start < end) 5293 { 5294 unsigned char *hdrptr; 5295 DWARF2_Internal_ARange arange; 5296 unsigned char *addr_ranges; 5297 dwarf_vma length; 5298 dwarf_vma address; 5299 unsigned char address_size; 5300 int excess; 5301 unsigned int offset_size; 5302 unsigned int initial_length_size; 5303 5304 hdrptr = start; 5305 5306 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end); 5307 if (arange.ar_length == 0xffffffff) 5308 { 5309 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end); 5310 offset_size = 8; 5311 initial_length_size = 12; 5312 } 5313 else 5314 { 5315 offset_size = 4; 5316 initial_length_size = 4; 5317 } 5318 5319 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end); 5320 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end); 5321 5322 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE 5323 && num_debug_info_entries > 0 5324 && find_debug_info_for_offset (arange.ar_info_offset) == NULL) 5325 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"), 5326 (unsigned long) arange.ar_info_offset, section->name); 5327 5328 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end); 5329 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end); 5330 5331 if (arange.ar_version != 2 && arange.ar_version != 3) 5332 { 5333 /* PR 19872: A version number of 0 probably means that there is 5334 padding at the end of the .debug_aranges section. Gold puts 5335 it there when performing an incremental link, for example. 5336 So do not generate a warning in this case. */ 5337 if (arange.ar_version) 5338 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n")); 5339 break; 5340 } 5341 5342 printf (_(" Length: %ld\n"), 5343 (long) arange.ar_length); 5344 printf (_(" Version: %d\n"), arange.ar_version); 5345 printf (_(" Offset into .debug_info: 0x%lx\n"), 5346 (unsigned long) arange.ar_info_offset); 5347 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size); 5348 printf (_(" Segment Size: %d\n"), arange.ar_segment_size); 5349 5350 address_size = arange.ar_pointer_size + arange.ar_segment_size; 5351 5352 /* PR 17512: file: 001-108546-0.001:0.1. */ 5353 if (address_size == 0 || address_size > 8) 5354 { 5355 error (_("Invalid address size in %s section!\n"), 5356 section->name); 5357 break; 5358 } 5359 5360 /* The DWARF spec does not require that the address size be a power 5361 of two, but we do. This will have to change if we ever encounter 5362 an uneven architecture. */ 5363 if ((address_size & (address_size - 1)) != 0) 5364 { 5365 warn (_("Pointer size + Segment size is not a power of two.\n")); 5366 break; 5367 } 5368 5369 if (address_size > 4) 5370 printf (_("\n Address Length\n")); 5371 else 5372 printf (_("\n Address Length\n")); 5373 5374 addr_ranges = hdrptr; 5375 5376 /* Must pad to an alignment boundary that is twice the address size. */ 5377 excess = (hdrptr - start) % (2 * address_size); 5378 if (excess) 5379 addr_ranges += (2 * address_size) - excess; 5380 5381 hdrptr = start + arange.ar_length + initial_length_size; 5382 if (hdrptr < start || hdrptr > end) 5383 { 5384 error (_("Excessive header length: %lx\n"), (long) arange.ar_length); 5385 break; 5386 } 5387 start = hdrptr; 5388 5389 while (addr_ranges + 2 * address_size <= start) 5390 { 5391 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end); 5392 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end); 5393 5394 printf (" "); 5395 print_dwarf_vma (address, address_size); 5396 print_dwarf_vma (length, address_size); 5397 putchar ('\n'); 5398 } 5399 } 5400 5401 printf ("\n"); 5402 5403 return 1; 5404 } 5405 5406 /* Comparison function for qsort. */ 5407 static int 5408 comp_addr_base (const void * v0, const void * v1) 5409 { 5410 debug_info * info0 = (debug_info *) v0; 5411 debug_info * info1 = (debug_info *) v1; 5412 return info0->addr_base - info1->addr_base; 5413 } 5414 5415 /* Display the debug_addr section. */ 5416 static int 5417 display_debug_addr (struct dwarf_section *section, 5418 void *file) 5419 { 5420 debug_info **debug_addr_info; 5421 unsigned char *entry; 5422 unsigned char *end; 5423 unsigned int i; 5424 unsigned int count; 5425 5426 if (section->size == 0) 5427 { 5428 printf (_("\nThe %s section is empty.\n"), section->name); 5429 return 0; 5430 } 5431 5432 if (load_debug_info (file) == 0) 5433 { 5434 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"), 5435 section->name); 5436 return 0; 5437 } 5438 5439 printf (_("Contents of the %s section:\n\n"), section->name); 5440 5441 /* PR 17531: file: cf38d01b. 5442 We use xcalloc because a corrupt file may not have initialised all of the 5443 fields in the debug_info structure, which means that the sort below might 5444 try to move uninitialised data. */ 5445 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1), 5446 sizeof (debug_info *)); 5447 5448 count = 0; 5449 for (i = 0; i < num_debug_info_entries; i++) 5450 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE) 5451 { 5452 /* PR 17531: file: cf38d01b. */ 5453 if (debug_information[i].addr_base >= section->size) 5454 warn (_("Corrupt address base (%lx) found in debug section %u\n"), 5455 (unsigned long) debug_information[i].addr_base, i); 5456 else 5457 debug_addr_info [count++] = debug_information + i; 5458 } 5459 5460 /* Add a sentinel to make iteration convenient. */ 5461 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info)); 5462 debug_addr_info [count]->addr_base = section->size; 5463 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base); 5464 5465 for (i = 0; i < count; i++) 5466 { 5467 unsigned int idx; 5468 unsigned int address_size = debug_addr_info [i]->pointer_size; 5469 5470 printf (_(" For compilation unit at offset 0x%s:\n"), 5471 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset)); 5472 5473 printf (_("\tIndex\tAddress\n")); 5474 entry = section->start + debug_addr_info [i]->addr_base; 5475 end = section->start + debug_addr_info [i + 1]->addr_base; 5476 idx = 0; 5477 while (entry < end) 5478 { 5479 dwarf_vma base = byte_get (entry, address_size); 5480 printf (_("\t%d:\t"), idx); 5481 print_dwarf_vma (base, address_size); 5482 printf ("\n"); 5483 entry += address_size; 5484 idx++; 5485 } 5486 } 5487 printf ("\n"); 5488 5489 free (debug_addr_info); 5490 return 1; 5491 } 5492 5493 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */ 5494 static int 5495 display_debug_str_offsets (struct dwarf_section *section, 5496 void *file ATTRIBUTE_UNUSED) 5497 { 5498 if (section->size == 0) 5499 { 5500 printf (_("\nThe %s section is empty.\n"), section->name); 5501 return 0; 5502 } 5503 /* TODO: Dump the contents. This is made somewhat difficult by not knowing 5504 what the offset size is for this section. */ 5505 return 1; 5506 } 5507 5508 /* Each debug_information[x].range_lists[y] gets this representation for 5509 sorting purposes. */ 5510 5511 struct range_entry 5512 { 5513 /* The debug_information[x].range_lists[y] value. */ 5514 unsigned long ranges_offset; 5515 5516 /* Original debug_information to find parameters of the data. */ 5517 debug_info *debug_info_p; 5518 }; 5519 5520 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */ 5521 5522 static int 5523 range_entry_compar (const void *ap, const void *bp) 5524 { 5525 const struct range_entry *a_re = (const struct range_entry *) ap; 5526 const struct range_entry *b_re = (const struct range_entry *) bp; 5527 const unsigned long a = a_re->ranges_offset; 5528 const unsigned long b = b_re->ranges_offset; 5529 5530 return (a > b) - (b > a); 5531 } 5532 5533 static int 5534 display_debug_ranges (struct dwarf_section *section, 5535 void *file ATTRIBUTE_UNUSED) 5536 { 5537 unsigned char *start = section->start; 5538 unsigned char *last_start = start; 5539 unsigned long bytes = section->size; 5540 unsigned char *section_begin = start; 5541 unsigned char *finish = start + bytes; 5542 unsigned int num_range_list, i; 5543 struct range_entry *range_entries, *range_entry_fill; 5544 5545 if (bytes == 0) 5546 { 5547 printf (_("\nThe %s section is empty.\n"), section->name); 5548 return 0; 5549 } 5550 5551 if (load_debug_info (file) == 0) 5552 { 5553 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"), 5554 section->name); 5555 return 0; 5556 } 5557 5558 num_range_list = 0; 5559 for (i = 0; i < num_debug_info_entries; i++) 5560 num_range_list += debug_information [i].num_range_lists; 5561 5562 if (num_range_list == 0) 5563 { 5564 /* This can happen when the file was compiled with -gsplit-debug 5565 which removes references to range lists from the primary .o file. */ 5566 printf (_("No range lists in .debug_info section.\n")); 5567 return 1; 5568 } 5569 5570 range_entries = (struct range_entry *) 5571 xmalloc (sizeof (*range_entries) * num_range_list); 5572 range_entry_fill = range_entries; 5573 5574 for (i = 0; i < num_debug_info_entries; i++) 5575 { 5576 debug_info *debug_info_p = &debug_information[i]; 5577 unsigned int j; 5578 5579 for (j = 0; j < debug_info_p->num_range_lists; j++) 5580 { 5581 range_entry_fill->ranges_offset = debug_info_p->range_lists[j]; 5582 range_entry_fill->debug_info_p = debug_info_p; 5583 range_entry_fill++; 5584 } 5585 } 5586 5587 qsort (range_entries, num_range_list, sizeof (*range_entries), 5588 range_entry_compar); 5589 5590 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0) 5591 warn (_("Range lists in %s section start at 0x%lx\n"), 5592 section->name, range_entries[0].ranges_offset); 5593 5594 printf (_("Contents of the %s section:\n\n"), section->name); 5595 printf (_(" Offset Begin End\n")); 5596 5597 for (i = 0; i < num_range_list; i++) 5598 { 5599 struct range_entry *range_entry = &range_entries[i]; 5600 debug_info *debug_info_p = range_entry->debug_info_p; 5601 unsigned int pointer_size; 5602 unsigned long offset; 5603 unsigned char *next; 5604 unsigned long base_address; 5605 5606 pointer_size = debug_info_p->pointer_size; 5607 offset = range_entry->ranges_offset; 5608 next = section_begin + offset; 5609 base_address = debug_info_p->base_address; 5610 5611 /* PR 17512: file: 001-101485-0.001:0.1. */ 5612 if (pointer_size < 2 || pointer_size > 8) 5613 { 5614 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"), 5615 pointer_size, offset); 5616 continue; 5617 } 5618 5619 if (dwarf_check != 0 && i > 0) 5620 { 5621 if (start < next) 5622 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"), 5623 (unsigned long) (start - section_begin), 5624 (unsigned long) (next - section_begin), section->name); 5625 else if (start > next) 5626 { 5627 if (next == last_start) 5628 continue; 5629 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"), 5630 (unsigned long) (start - section_begin), 5631 (unsigned long) (next - section_begin), section->name); 5632 } 5633 } 5634 start = next; 5635 last_start = next; 5636 5637 while (start < finish) 5638 { 5639 dwarf_vma begin; 5640 dwarf_vma end; 5641 5642 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish); 5643 if (start >= finish) 5644 break; 5645 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish); 5646 5647 printf (" %8.8lx ", offset); 5648 5649 if (begin == 0 && end == 0) 5650 { 5651 printf (_("<End of list>\n")); 5652 break; 5653 } 5654 5655 /* Check base address specifiers. */ 5656 if (is_max_address (begin, pointer_size) 5657 && !is_max_address (end, pointer_size)) 5658 { 5659 base_address = end; 5660 print_dwarf_vma (begin, pointer_size); 5661 print_dwarf_vma (end, pointer_size); 5662 printf ("(base address)\n"); 5663 continue; 5664 } 5665 5666 print_dwarf_vma (begin + base_address, pointer_size); 5667 print_dwarf_vma (end + base_address, pointer_size); 5668 5669 if (begin == end) 5670 fputs (_("(start == end)"), stdout); 5671 else if (begin > end) 5672 fputs (_("(start > end)"), stdout); 5673 5674 putchar ('\n'); 5675 } 5676 } 5677 putchar ('\n'); 5678 5679 free (range_entries); 5680 5681 return 1; 5682 } 5683 5684 typedef struct Frame_Chunk 5685 { 5686 struct Frame_Chunk *next; 5687 unsigned char *chunk_start; 5688 unsigned int ncols; 5689 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */ 5690 short int *col_type; 5691 int *col_offset; 5692 char *augmentation; 5693 unsigned int code_factor; 5694 int data_factor; 5695 dwarf_vma pc_begin; 5696 dwarf_vma pc_range; 5697 int cfa_reg; 5698 dwarf_vma cfa_offset; 5699 unsigned int ra; 5700 unsigned char fde_encoding; 5701 unsigned char cfa_exp; 5702 unsigned char ptr_size; 5703 unsigned char segment_size; 5704 } 5705 Frame_Chunk; 5706 5707 static const char *const *dwarf_regnames; 5708 static unsigned int dwarf_regnames_count; 5709 5710 /* A marker for a col_type that means this column was never referenced 5711 in the frame info. */ 5712 #define DW_CFA_unreferenced (-1) 5713 5714 /* Return 0 if no more space is needed, 1 if more space is needed, 5715 -1 for invalid reg. */ 5716 5717 static int 5718 frame_need_space (Frame_Chunk *fc, unsigned int reg) 5719 { 5720 unsigned int prev = fc->ncols; 5721 5722 if (reg < (unsigned int) fc->ncols) 5723 return 0; 5724 5725 if (dwarf_regnames_count 5726 && reg > dwarf_regnames_count) 5727 return -1; 5728 5729 fc->ncols = reg + 1; 5730 /* PR 17512: file: 10450-2643-0.004. 5731 If reg == -1 then this can happen... */ 5732 if (fc->ncols == 0) 5733 return -1; 5734 5735 /* PR 17512: file: 2844a11d. */ 5736 if (fc->ncols > 1024) 5737 { 5738 error (_("Unfeasibly large register number: %u\n"), reg); 5739 fc->ncols = 0; 5740 /* FIXME: 1024 is an arbitrary limit. Increase it if 5741 we ever encounter a valid binary that exceeds it. */ 5742 return -1; 5743 } 5744 5745 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols, 5746 sizeof (short int)); 5747 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int)); 5748 /* PR 17512: file:002-10025-0.005. */ 5749 if (fc->col_type == NULL || fc->col_offset == NULL) 5750 { 5751 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"), 5752 fc->ncols); 5753 fc->ncols = 0; 5754 return -1; 5755 } 5756 5757 while (prev < fc->ncols) 5758 { 5759 fc->col_type[prev] = DW_CFA_unreferenced; 5760 fc->col_offset[prev] = 0; 5761 prev++; 5762 } 5763 return 1; 5764 } 5765 5766 static const char *const dwarf_regnames_i386[] = 5767 { 5768 "eax", "ecx", "edx", "ebx", /* 0 - 3 */ 5769 "esp", "ebp", "esi", "edi", /* 4 - 7 */ 5770 "eip", "eflags", NULL, /* 8 - 10 */ 5771 "st0", "st1", "st2", "st3", /* 11 - 14 */ 5772 "st4", "st5", "st6", "st7", /* 15 - 18 */ 5773 NULL, NULL, /* 19 - 20 */ 5774 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */ 5775 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */ 5776 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */ 5777 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */ 5778 "fcw", "fsw", "mxcsr", /* 37 - 39 */ 5779 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */ 5780 "tr", "ldtr", /* 48 - 49 */ 5781 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */ 5782 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */ 5783 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */ 5784 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */ 5785 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */ 5786 NULL, NULL, NULL, /* 90 - 92 */ 5787 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */ 5788 }; 5789 5790 static const char *const dwarf_regnames_iamcu[] = 5791 { 5792 "eax", "ecx", "edx", "ebx", /* 0 - 3 */ 5793 "esp", "ebp", "esi", "edi", /* 4 - 7 */ 5794 "eip", "eflags", NULL, /* 8 - 10 */ 5795 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18 */ 5796 NULL, NULL, /* 19 - 20 */ 5797 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28 */ 5798 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36 */ 5799 NULL, NULL, NULL, /* 37 - 39 */ 5800 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */ 5801 "tr", "ldtr", /* 48 - 49 */ 5802 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */ 5803 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */ 5804 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */ 5805 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */ 5806 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */ 5807 NULL, NULL, NULL, /* 90 - 92 */ 5808 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* 93 - 100 */ 5809 }; 5810 5811 void 5812 init_dwarf_regnames_i386 (void) 5813 { 5814 dwarf_regnames = dwarf_regnames_i386; 5815 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386); 5816 } 5817 5818 void 5819 init_dwarf_regnames_iamcu (void) 5820 { 5821 dwarf_regnames = dwarf_regnames_iamcu; 5822 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu); 5823 } 5824 5825 static const char *const dwarf_regnames_x86_64[] = 5826 { 5827 "rax", "rdx", "rcx", "rbx", 5828 "rsi", "rdi", "rbp", "rsp", 5829 "r8", "r9", "r10", "r11", 5830 "r12", "r13", "r14", "r15", 5831 "rip", 5832 "xmm0", "xmm1", "xmm2", "xmm3", 5833 "xmm4", "xmm5", "xmm6", "xmm7", 5834 "xmm8", "xmm9", "xmm10", "xmm11", 5835 "xmm12", "xmm13", "xmm14", "xmm15", 5836 "st0", "st1", "st2", "st3", 5837 "st4", "st5", "st6", "st7", 5838 "mm0", "mm1", "mm2", "mm3", 5839 "mm4", "mm5", "mm6", "mm7", 5840 "rflags", 5841 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, 5842 "fs.base", "gs.base", NULL, NULL, 5843 "tr", "ldtr", 5844 "mxcsr", "fcw", "fsw", 5845 "xmm16", "xmm17", "xmm18", "xmm19", 5846 "xmm20", "xmm21", "xmm22", "xmm23", 5847 "xmm24", "xmm25", "xmm26", "xmm27", 5848 "xmm28", "xmm29", "xmm30", "xmm31", 5849 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */ 5850 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */ 5851 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */ 5852 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */ 5853 NULL, NULL, NULL, /* 115 - 117 */ 5854 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" 5855 }; 5856 5857 void 5858 init_dwarf_regnames_x86_64 (void) 5859 { 5860 dwarf_regnames = dwarf_regnames_x86_64; 5861 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64); 5862 } 5863 5864 static const char *const dwarf_regnames_aarch64[] = 5865 { 5866 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", 5867 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", 5868 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", 5869 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", 5870 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL, 5871 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5872 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5873 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5874 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 5875 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 5876 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 5877 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 5878 }; 5879 5880 void 5881 init_dwarf_regnames_aarch64 (void) 5882 { 5883 dwarf_regnames = dwarf_regnames_aarch64; 5884 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64); 5885 } 5886 5887 static const char *const dwarf_regnames_s390[] = 5888 { 5889 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */ 5890 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5891 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5892 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7", 5893 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15", 5894 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 5895 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15", 5896 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", 5897 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", 5898 "pswm", "pswa", 5899 NULL, NULL, 5900 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23", 5901 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31", 5902 }; 5903 5904 void 5905 init_dwarf_regnames_s390 (void) 5906 { 5907 dwarf_regnames = dwarf_regnames_s390; 5908 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390); 5909 } 5910 5911 void 5912 init_dwarf_regnames (unsigned int e_machine) 5913 { 5914 switch (e_machine) 5915 { 5916 case EM_386: 5917 init_dwarf_regnames_i386 (); 5918 break; 5919 5920 case EM_IAMCU: 5921 init_dwarf_regnames_iamcu (); 5922 break; 5923 5924 case EM_X86_64: 5925 case EM_L1OM: 5926 case EM_K1OM: 5927 init_dwarf_regnames_x86_64 (); 5928 break; 5929 5930 case EM_AARCH64: 5931 init_dwarf_regnames_aarch64 (); 5932 break; 5933 5934 case EM_S390: 5935 init_dwarf_regnames_s390 (); 5936 break; 5937 5938 default: 5939 break; 5940 } 5941 } 5942 5943 static const char * 5944 regname (unsigned int regno, int row) 5945 { 5946 static char reg[64]; 5947 if (dwarf_regnames 5948 && regno < dwarf_regnames_count 5949 && dwarf_regnames [regno] != NULL) 5950 { 5951 if (row) 5952 return dwarf_regnames [regno]; 5953 snprintf (reg, sizeof (reg), "r%d (%s)", regno, 5954 dwarf_regnames [regno]); 5955 } 5956 else 5957 snprintf (reg, sizeof (reg), "r%d", regno); 5958 return reg; 5959 } 5960 5961 static void 5962 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs) 5963 { 5964 unsigned int r; 5965 char tmp[100]; 5966 5967 if (*max_regs < fc->ncols) 5968 *max_regs = fc->ncols; 5969 5970 if (*need_col_headers) 5971 { 5972 static const char *sloc = " LOC"; 5973 5974 *need_col_headers = 0; 5975 5976 printf ("%-*s CFA ", eh_addr_size * 2, sloc); 5977 5978 for (r = 0; r < *max_regs; r++) 5979 if (fc->col_type[r] != DW_CFA_unreferenced) 5980 { 5981 if (r == fc->ra) 5982 printf ("ra "); 5983 else 5984 printf ("%-5s ", regname (r, 1)); 5985 } 5986 5987 printf ("\n"); 5988 } 5989 5990 print_dwarf_vma (fc->pc_begin, eh_addr_size); 5991 if (fc->cfa_exp) 5992 strcpy (tmp, "exp"); 5993 else 5994 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset); 5995 printf ("%-8s ", tmp); 5996 5997 for (r = 0; r < fc->ncols; r++) 5998 { 5999 if (fc->col_type[r] != DW_CFA_unreferenced) 6000 { 6001 switch (fc->col_type[r]) 6002 { 6003 case DW_CFA_undefined: 6004 strcpy (tmp, "u"); 6005 break; 6006 case DW_CFA_same_value: 6007 strcpy (tmp, "s"); 6008 break; 6009 case DW_CFA_offset: 6010 sprintf (tmp, "c%+d", fc->col_offset[r]); 6011 break; 6012 case DW_CFA_val_offset: 6013 sprintf (tmp, "v%+d", fc->col_offset[r]); 6014 break; 6015 case DW_CFA_register: 6016 sprintf (tmp, "%s", regname (fc->col_offset[r], 0)); 6017 break; 6018 case DW_CFA_expression: 6019 strcpy (tmp, "exp"); 6020 break; 6021 case DW_CFA_val_expression: 6022 strcpy (tmp, "vexp"); 6023 break; 6024 default: 6025 strcpy (tmp, "n/a"); 6026 break; 6027 } 6028 printf ("%-5s ", tmp); 6029 } 6030 } 6031 printf ("\n"); 6032 } 6033 6034 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end) 6035 #define LEB() read_uleb128 (start, & length_return, end); start += length_return 6036 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return 6037 6038 static unsigned char * 6039 read_cie (unsigned char *start, unsigned char *end, 6040 Frame_Chunk **p_cie, int *p_version, 6041 unsigned long *p_aug_len, unsigned char **p_aug) 6042 { 6043 int version; 6044 Frame_Chunk *fc; 6045 unsigned int length_return; 6046 unsigned char *augmentation_data = NULL; 6047 unsigned long augmentation_data_len = 0; 6048 6049 * p_cie = NULL; 6050 /* PR 17512: file: 001-228113-0.004. */ 6051 if (start >= end) 6052 return end; 6053 6054 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk)); 6055 memset (fc, 0, sizeof (Frame_Chunk)); 6056 6057 fc->col_type = (short int *) xmalloc (sizeof (short int)); 6058 fc->col_offset = (int *) xmalloc (sizeof (int)); 6059 6060 version = *start++; 6061 6062 fc->augmentation = (char *) start; 6063 /* PR 17512: file: 001-228113-0.004. 6064 Skip past augmentation name, but avoid running off the end of the data. */ 6065 while (start < end) 6066 if (* start ++ == '\0') 6067 break; 6068 if (start == end) 6069 { 6070 warn (_("No terminator for augmentation name\n")); 6071 return start; 6072 } 6073 6074 if (strcmp (fc->augmentation, "eh") == 0) 6075 start += eh_addr_size; 6076 6077 if (version >= 4) 6078 { 6079 GET (fc->ptr_size, 1); 6080 if (fc->ptr_size < 1 || fc->ptr_size > 8) 6081 { 6082 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size); 6083 return end; 6084 } 6085 6086 GET (fc->segment_size, 1); 6087 /* PR 17512: file: e99d2804. */ 6088 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8) 6089 { 6090 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size); 6091 return end; 6092 } 6093 6094 eh_addr_size = fc->ptr_size; 6095 } 6096 else 6097 { 6098 fc->ptr_size = eh_addr_size; 6099 fc->segment_size = 0; 6100 } 6101 fc->code_factor = LEB (); 6102 fc->data_factor = SLEB (); 6103 if (version == 1) 6104 { 6105 GET (fc->ra, 1); 6106 } 6107 else 6108 { 6109 fc->ra = LEB (); 6110 } 6111 6112 if (fc->augmentation[0] == 'z') 6113 { 6114 augmentation_data_len = LEB (); 6115 augmentation_data = start; 6116 start += augmentation_data_len; 6117 /* PR 17512: file: 11042-2589-0.004. */ 6118 if (start > end) 6119 { 6120 warn (_("Augmentation data too long: 0x%lx\n"), augmentation_data_len); 6121 return end; 6122 } 6123 } 6124 6125 if (augmentation_data_len) 6126 { 6127 unsigned char *p; 6128 unsigned char *q; 6129 unsigned char *qend; 6130 6131 p = (unsigned char *) fc->augmentation + 1; 6132 q = augmentation_data; 6133 qend = q + augmentation_data_len; 6134 6135 /* PR 17531: file: 015adfaa. */ 6136 if (qend < q) 6137 { 6138 warn (_("Negative augmentation data length: 0x%lx"), augmentation_data_len); 6139 augmentation_data_len = 0; 6140 } 6141 6142 while (p < end && q < augmentation_data + augmentation_data_len) 6143 { 6144 if (*p == 'L') 6145 q++; 6146 else if (*p == 'P') 6147 q += 1 + size_of_encoded_value (*q); 6148 else if (*p == 'R') 6149 fc->fde_encoding = *q++; 6150 else if (*p == 'S') 6151 ; 6152 else 6153 break; 6154 p++; 6155 } 6156 /* Note - it is OK if this loop terminates with q < qend. 6157 Padding may have been inserted to align the end of the CIE. */ 6158 } 6159 6160 *p_cie = fc; 6161 if (p_version) 6162 *p_version = version; 6163 if (p_aug_len) 6164 { 6165 *p_aug_len = augmentation_data_len; 6166 *p_aug = augmentation_data; 6167 } 6168 return start; 6169 } 6170 6171 static int 6172 display_debug_frames (struct dwarf_section *section, 6173 void *file ATTRIBUTE_UNUSED) 6174 { 6175 unsigned char *start = section->start; 6176 unsigned char *end = start + section->size; 6177 unsigned char *section_start = start; 6178 Frame_Chunk *chunks = 0, *forward_refs = 0; 6179 Frame_Chunk *remembered_state = 0; 6180 Frame_Chunk *rs; 6181 int is_eh = strcmp (section->name, ".eh_frame") == 0; 6182 unsigned int length_return; 6183 unsigned int max_regs = 0; 6184 const char *bad_reg = _("bad register: "); 6185 unsigned int saved_eh_addr_size = eh_addr_size; 6186 6187 printf (_("Contents of the %s section:\n"), section->name); 6188 6189 while (start < end) 6190 { 6191 unsigned char *saved_start; 6192 unsigned char *block_end; 6193 dwarf_vma length; 6194 dwarf_vma cie_id; 6195 Frame_Chunk *fc; 6196 Frame_Chunk *cie; 6197 int need_col_headers = 1; 6198 unsigned char *augmentation_data = NULL; 6199 unsigned long augmentation_data_len = 0; 6200 unsigned int encoded_ptr_size = saved_eh_addr_size; 6201 unsigned int offset_size; 6202 unsigned int initial_length_size; 6203 bfd_boolean all_nops; 6204 6205 saved_start = start; 6206 6207 SAFE_BYTE_GET_AND_INC (length, start, 4, end); 6208 6209 if (length == 0) 6210 { 6211 printf ("\n%08lx ZERO terminator\n\n", 6212 (unsigned long)(saved_start - section_start)); 6213 /* Skip any zero terminators that directly follow. 6214 A corrupt section size could have loaded a whole 6215 slew of zero filled memory bytes. eg 6216 PR 17512: file: 070-19381-0.004. */ 6217 while (start < end && * start == 0) 6218 ++ start; 6219 continue; 6220 } 6221 6222 if (length == 0xffffffff) 6223 { 6224 SAFE_BYTE_GET_AND_INC (length, start, 8, end); 6225 offset_size = 8; 6226 initial_length_size = 12; 6227 } 6228 else 6229 { 6230 offset_size = 4; 6231 initial_length_size = 4; 6232 } 6233 6234 block_end = saved_start + length + initial_length_size; 6235 if (block_end > end || block_end < start) 6236 { 6237 warn ("Invalid length 0x%s in FDE at %#08lx\n", 6238 dwarf_vmatoa_1 (NULL, length, offset_size), 6239 (unsigned long) (saved_start - section_start)); 6240 block_end = end; 6241 } 6242 6243 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end); 6244 6245 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID) 6246 || (offset_size == 8 && cie_id == DW64_CIE_ID))) 6247 { 6248 int version; 6249 unsigned int mreg; 6250 6251 start = read_cie (start, end, &cie, &version, 6252 &augmentation_data_len, &augmentation_data); 6253 /* PR 17512: file: 027-135133-0.005. */ 6254 if (cie == NULL) 6255 break; 6256 6257 fc = cie; 6258 fc->next = chunks; 6259 chunks = fc; 6260 fc->chunk_start = saved_start; 6261 mreg = max_regs > 0 ? max_regs - 1 : 0; 6262 if (mreg < fc->ra) 6263 mreg = fc->ra; 6264 if (frame_need_space (fc, mreg) < 0) 6265 break; 6266 if (fc->fde_encoding) 6267 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding); 6268 6269 printf ("\n%08lx ", (unsigned long) (saved_start - section_start)); 6270 print_dwarf_vma (length, fc->ptr_size); 6271 print_dwarf_vma (cie_id, offset_size); 6272 6273 if (do_debug_frames_interp) 6274 { 6275 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation, 6276 fc->code_factor, fc->data_factor, fc->ra); 6277 } 6278 else 6279 { 6280 printf ("CIE\n"); 6281 printf (" Version: %d\n", version); 6282 printf (" Augmentation: \"%s\"\n", fc->augmentation); 6283 if (version >= 4) 6284 { 6285 printf (" Pointer Size: %u\n", fc->ptr_size); 6286 printf (" Segment Size: %u\n", fc->segment_size); 6287 } 6288 printf (" Code alignment factor: %u\n", fc->code_factor); 6289 printf (" Data alignment factor: %d\n", fc->data_factor); 6290 printf (" Return address column: %d\n", fc->ra); 6291 6292 if (augmentation_data_len) 6293 { 6294 unsigned long i; 6295 6296 printf (" Augmentation data: "); 6297 for (i = 0; i < augmentation_data_len; ++i) 6298 /* FIXME: If do_wide is FALSE, then we should 6299 add carriage returns at 80 columns... */ 6300 printf (" %02x", augmentation_data[i]); 6301 putchar ('\n'); 6302 } 6303 putchar ('\n'); 6304 } 6305 } 6306 else 6307 { 6308 unsigned char *look_for; 6309 static Frame_Chunk fde_fc; 6310 unsigned long segment_selector; 6311 6312 if (is_eh) 6313 { 6314 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1); 6315 look_for = start - 4 - ((cie_id ^ sign) - sign); 6316 } 6317 else 6318 look_for = section_start + cie_id; 6319 6320 if (look_for <= saved_start) 6321 { 6322 for (cie = chunks; cie ; cie = cie->next) 6323 if (cie->chunk_start == look_for) 6324 break; 6325 } 6326 else 6327 { 6328 for (cie = forward_refs; cie ; cie = cie->next) 6329 if (cie->chunk_start == look_for) 6330 break; 6331 if (!cie) 6332 { 6333 unsigned int off_size; 6334 unsigned char *cie_scan; 6335 6336 cie_scan = look_for; 6337 off_size = 4; 6338 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end); 6339 if (length == 0xffffffff) 6340 { 6341 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end); 6342 off_size = 8; 6343 } 6344 if (length != 0) 6345 { 6346 dwarf_vma c_id; 6347 6348 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end); 6349 if (is_eh 6350 ? c_id == 0 6351 : ((off_size == 4 && c_id == DW_CIE_ID) 6352 || (off_size == 8 && c_id == DW64_CIE_ID))) 6353 { 6354 int version; 6355 unsigned int mreg; 6356 6357 read_cie (cie_scan, end, &cie, &version, 6358 &augmentation_data_len, &augmentation_data); 6359 /* PR 17512: file: 3450-2098-0.004. */ 6360 if (cie == NULL) 6361 { 6362 warn (_("Failed to read CIE information\n")); 6363 break; 6364 } 6365 cie->next = forward_refs; 6366 forward_refs = cie; 6367 cie->chunk_start = look_for; 6368 mreg = max_regs > 0 ? max_regs - 1 : 0; 6369 if (mreg < cie->ra) 6370 mreg = cie->ra; 6371 if (frame_need_space (cie, mreg) < 0) 6372 { 6373 warn (_("Invalid max register\n")); 6374 break; 6375 } 6376 if (cie->fde_encoding) 6377 encoded_ptr_size 6378 = size_of_encoded_value (cie->fde_encoding); 6379 } 6380 } 6381 } 6382 } 6383 6384 fc = &fde_fc; 6385 memset (fc, 0, sizeof (Frame_Chunk)); 6386 6387 if (!cie) 6388 { 6389 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n", 6390 dwarf_vmatoa_1 (NULL, cie_id, offset_size), 6391 (unsigned long) (saved_start - section_start)); 6392 fc->ncols = 0; 6393 fc->col_type = (short int *) xmalloc (sizeof (short int)); 6394 fc->col_offset = (int *) xmalloc (sizeof (int)); 6395 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0) 6396 { 6397 warn (_("Invalid max register\n")); 6398 break; 6399 } 6400 cie = fc; 6401 fc->augmentation = ""; 6402 fc->fde_encoding = 0; 6403 fc->ptr_size = eh_addr_size; 6404 fc->segment_size = 0; 6405 } 6406 else 6407 { 6408 fc->ncols = cie->ncols; 6409 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int)); 6410 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int)); 6411 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int)); 6412 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int)); 6413 fc->augmentation = cie->augmentation; 6414 fc->ptr_size = cie->ptr_size; 6415 eh_addr_size = cie->ptr_size; 6416 fc->segment_size = cie->segment_size; 6417 fc->code_factor = cie->code_factor; 6418 fc->data_factor = cie->data_factor; 6419 fc->cfa_reg = cie->cfa_reg; 6420 fc->cfa_offset = cie->cfa_offset; 6421 fc->ra = cie->ra; 6422 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0) 6423 { 6424 warn (_("Invalid max register\n")); 6425 break; 6426 } 6427 fc->fde_encoding = cie->fde_encoding; 6428 } 6429 6430 if (fc->fde_encoding) 6431 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding); 6432 6433 segment_selector = 0; 6434 if (fc->segment_size) 6435 { 6436 if (fc->segment_size > sizeof (segment_selector)) 6437 { 6438 /* PR 17512: file: 9e196b3e. */ 6439 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size); 6440 fc->segment_size = 4; 6441 } 6442 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end); 6443 } 6444 6445 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end); 6446 6447 /* FIXME: It appears that sometimes the final pc_range value is 6448 encoded in less than encoded_ptr_size bytes. See the x86_64 6449 run of the "objcopy on compressed debug sections" test for an 6450 example of this. */ 6451 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end); 6452 6453 if (cie->augmentation[0] == 'z') 6454 { 6455 augmentation_data_len = LEB (); 6456 augmentation_data = start; 6457 start += augmentation_data_len; 6458 /* PR 17512: file: 722-8446-0.004. */ 6459 if (start >= end || ((signed long) augmentation_data_len) < 0) 6460 { 6461 warn (_("Corrupt augmentation data length: %lx\n"), 6462 augmentation_data_len); 6463 start = end; 6464 augmentation_data = NULL; 6465 augmentation_data_len = 0; 6466 } 6467 } 6468 6469 printf ("\n%08lx %s %s FDE cie=%08lx pc=", 6470 (unsigned long)(saved_start - section_start), 6471 dwarf_vmatoa_1 (NULL, length, fc->ptr_size), 6472 dwarf_vmatoa_1 (NULL, cie_id, offset_size), 6473 (unsigned long)(cie->chunk_start - section_start)); 6474 6475 if (fc->segment_size) 6476 printf ("%04lx:", segment_selector); 6477 6478 printf ("%s..%s\n", 6479 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size), 6480 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size)); 6481 6482 if (! do_debug_frames_interp && augmentation_data_len) 6483 { 6484 unsigned long i; 6485 6486 printf (" Augmentation data: "); 6487 for (i = 0; i < augmentation_data_len; ++i) 6488 printf (" %02x", augmentation_data[i]); 6489 putchar ('\n'); 6490 putchar ('\n'); 6491 } 6492 } 6493 6494 /* At this point, fc is the current chunk, cie (if any) is set, and 6495 we're about to interpret instructions for the chunk. */ 6496 /* ??? At present we need to do this always, since this sizes the 6497 fc->col_type and fc->col_offset arrays, which we write into always. 6498 We should probably split the interpreted and non-interpreted bits 6499 into two different routines, since there's so much that doesn't 6500 really overlap between them. */ 6501 if (1 || do_debug_frames_interp) 6502 { 6503 /* Start by making a pass over the chunk, allocating storage 6504 and taking note of what registers are used. */ 6505 unsigned char *tmp = start; 6506 6507 while (start < block_end) 6508 { 6509 unsigned int reg, op, opa; 6510 unsigned long temp; 6511 unsigned char * new_start; 6512 6513 op = *start++; 6514 opa = op & 0x3f; 6515 if (op & 0xc0) 6516 op &= 0xc0; 6517 6518 /* Warning: if you add any more cases to this switch, be 6519 sure to add them to the corresponding switch below. */ 6520 switch (op) 6521 { 6522 case DW_CFA_advance_loc: 6523 break; 6524 case DW_CFA_offset: 6525 LEB (); 6526 if (frame_need_space (fc, opa) >= 0) 6527 fc->col_type[opa] = DW_CFA_undefined; 6528 break; 6529 case DW_CFA_restore: 6530 if (frame_need_space (fc, opa) >= 0) 6531 fc->col_type[opa] = DW_CFA_undefined; 6532 break; 6533 case DW_CFA_set_loc: 6534 start += encoded_ptr_size; 6535 break; 6536 case DW_CFA_advance_loc1: 6537 start += 1; 6538 break; 6539 case DW_CFA_advance_loc2: 6540 start += 2; 6541 break; 6542 case DW_CFA_advance_loc4: 6543 start += 4; 6544 break; 6545 case DW_CFA_offset_extended: 6546 case DW_CFA_val_offset: 6547 reg = LEB (); LEB (); 6548 if (frame_need_space (fc, reg) >= 0) 6549 fc->col_type[reg] = DW_CFA_undefined; 6550 break; 6551 case DW_CFA_restore_extended: 6552 reg = LEB (); 6553 if (frame_need_space (fc, reg) >= 0) 6554 fc->col_type[reg] = DW_CFA_undefined; 6555 break; 6556 case DW_CFA_undefined: 6557 reg = LEB (); 6558 if (frame_need_space (fc, reg) >= 0) 6559 fc->col_type[reg] = DW_CFA_undefined; 6560 break; 6561 case DW_CFA_same_value: 6562 reg = LEB (); 6563 if (frame_need_space (fc, reg) >= 0) 6564 fc->col_type[reg] = DW_CFA_undefined; 6565 break; 6566 case DW_CFA_register: 6567 reg = LEB (); LEB (); 6568 if (frame_need_space (fc, reg) >= 0) 6569 fc->col_type[reg] = DW_CFA_undefined; 6570 break; 6571 case DW_CFA_def_cfa: 6572 LEB (); LEB (); 6573 break; 6574 case DW_CFA_def_cfa_register: 6575 LEB (); 6576 break; 6577 case DW_CFA_def_cfa_offset: 6578 LEB (); 6579 break; 6580 case DW_CFA_def_cfa_expression: 6581 temp = LEB (); 6582 new_start = start + temp; 6583 if (new_start < start) 6584 { 6585 warn (_("Corrupt CFA_def expression value: %lu\n"), temp); 6586 start = block_end; 6587 } 6588 else 6589 start = new_start; 6590 break; 6591 case DW_CFA_expression: 6592 case DW_CFA_val_expression: 6593 reg = LEB (); 6594 temp = LEB (); 6595 new_start = start + temp; 6596 if (new_start < start) 6597 { 6598 /* PR 17512: file:306-192417-0.005. */ 6599 warn (_("Corrupt CFA expression value: %lu\n"), temp); 6600 start = block_end; 6601 } 6602 else 6603 start = new_start; 6604 if (frame_need_space (fc, reg) >= 0) 6605 fc->col_type[reg] = DW_CFA_undefined; 6606 break; 6607 case DW_CFA_offset_extended_sf: 6608 case DW_CFA_val_offset_sf: 6609 reg = LEB (); SLEB (); 6610 if (frame_need_space (fc, reg) >= 0) 6611 fc->col_type[reg] = DW_CFA_undefined; 6612 break; 6613 case DW_CFA_def_cfa_sf: 6614 LEB (); SLEB (); 6615 break; 6616 case DW_CFA_def_cfa_offset_sf: 6617 SLEB (); 6618 break; 6619 case DW_CFA_MIPS_advance_loc8: 6620 start += 8; 6621 break; 6622 case DW_CFA_GNU_args_size: 6623 LEB (); 6624 break; 6625 case DW_CFA_GNU_negative_offset_extended: 6626 reg = LEB (); LEB (); 6627 if (frame_need_space (fc, reg) >= 0) 6628 fc->col_type[reg] = DW_CFA_undefined; 6629 break; 6630 default: 6631 break; 6632 } 6633 } 6634 start = tmp; 6635 } 6636 6637 all_nops = TRUE; 6638 6639 /* Now we know what registers are used, make a second pass over 6640 the chunk, this time actually printing out the info. */ 6641 6642 while (start < block_end) 6643 { 6644 unsigned char * tmp; 6645 unsigned op, opa; 6646 unsigned long ul, reg, roffs; 6647 dwarf_vma l; 6648 dwarf_vma ofs; 6649 dwarf_vma vma; 6650 const char *reg_prefix = ""; 6651 6652 op = *start++; 6653 opa = op & 0x3f; 6654 if (op & 0xc0) 6655 op &= 0xc0; 6656 6657 /* Make a note if something other than DW_CFA_nop happens. */ 6658 if (op != DW_CFA_nop) 6659 all_nops = FALSE; 6660 6661 /* Warning: if you add any more cases to this switch, be 6662 sure to add them to the corresponding switch above. */ 6663 switch (op) 6664 { 6665 case DW_CFA_advance_loc: 6666 if (do_debug_frames_interp) 6667 frame_display_row (fc, &need_col_headers, &max_regs); 6668 else 6669 printf (" DW_CFA_advance_loc: %d to %s\n", 6670 opa * fc->code_factor, 6671 dwarf_vmatoa_1 (NULL, 6672 fc->pc_begin + opa * fc->code_factor, 6673 fc->ptr_size)); 6674 fc->pc_begin += opa * fc->code_factor; 6675 break; 6676 6677 case DW_CFA_offset: 6678 roffs = LEB (); 6679 if (opa >= (unsigned int) fc->ncols) 6680 reg_prefix = bad_reg; 6681 if (! do_debug_frames_interp || *reg_prefix != '\0') 6682 printf (" DW_CFA_offset: %s%s at cfa%+ld\n", 6683 reg_prefix, regname (opa, 0), 6684 roffs * fc->data_factor); 6685 if (*reg_prefix == '\0') 6686 { 6687 fc->col_type[opa] = DW_CFA_offset; 6688 fc->col_offset[opa] = roffs * fc->data_factor; 6689 } 6690 break; 6691 6692 case DW_CFA_restore: 6693 if (opa >= (unsigned int) cie->ncols 6694 || opa >= (unsigned int) fc->ncols) 6695 reg_prefix = bad_reg; 6696 if (! do_debug_frames_interp || *reg_prefix != '\0') 6697 printf (" DW_CFA_restore: %s%s\n", 6698 reg_prefix, regname (opa, 0)); 6699 if (*reg_prefix == '\0') 6700 { 6701 fc->col_type[opa] = cie->col_type[opa]; 6702 fc->col_offset[opa] = cie->col_offset[opa]; 6703 if (do_debug_frames_interp 6704 && fc->col_type[opa] == DW_CFA_unreferenced) 6705 fc->col_type[opa] = DW_CFA_undefined; 6706 } 6707 break; 6708 6709 case DW_CFA_set_loc: 6710 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end); 6711 if (do_debug_frames_interp) 6712 frame_display_row (fc, &need_col_headers, &max_regs); 6713 else 6714 printf (" DW_CFA_set_loc: %s\n", 6715 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size)); 6716 fc->pc_begin = vma; 6717 break; 6718 6719 case DW_CFA_advance_loc1: 6720 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end); 6721 if (do_debug_frames_interp) 6722 frame_display_row (fc, &need_col_headers, &max_regs); 6723 else 6724 printf (" DW_CFA_advance_loc1: %ld to %s\n", 6725 (unsigned long) (ofs * fc->code_factor), 6726 dwarf_vmatoa_1 (NULL, 6727 fc->pc_begin + ofs * fc->code_factor, 6728 fc->ptr_size)); 6729 fc->pc_begin += ofs * fc->code_factor; 6730 break; 6731 6732 case DW_CFA_advance_loc2: 6733 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end); 6734 if (do_debug_frames_interp) 6735 frame_display_row (fc, &need_col_headers, &max_regs); 6736 else 6737 printf (" DW_CFA_advance_loc2: %ld to %s\n", 6738 (unsigned long) (ofs * fc->code_factor), 6739 dwarf_vmatoa_1 (NULL, 6740 fc->pc_begin + ofs * fc->code_factor, 6741 fc->ptr_size)); 6742 fc->pc_begin += ofs * fc->code_factor; 6743 break; 6744 6745 case DW_CFA_advance_loc4: 6746 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end); 6747 if (do_debug_frames_interp) 6748 frame_display_row (fc, &need_col_headers, &max_regs); 6749 else 6750 printf (" DW_CFA_advance_loc4: %ld to %s\n", 6751 (unsigned long) (ofs * fc->code_factor), 6752 dwarf_vmatoa_1 (NULL, 6753 fc->pc_begin + ofs * fc->code_factor, 6754 fc->ptr_size)); 6755 fc->pc_begin += ofs * fc->code_factor; 6756 break; 6757 6758 case DW_CFA_offset_extended: 6759 reg = LEB (); 6760 roffs = LEB (); 6761 if (reg >= (unsigned int) fc->ncols) 6762 reg_prefix = bad_reg; 6763 if (! do_debug_frames_interp || *reg_prefix != '\0') 6764 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n", 6765 reg_prefix, regname (reg, 0), 6766 roffs * fc->data_factor); 6767 if (*reg_prefix == '\0') 6768 { 6769 fc->col_type[reg] = DW_CFA_offset; 6770 fc->col_offset[reg] = roffs * fc->data_factor; 6771 } 6772 break; 6773 6774 case DW_CFA_val_offset: 6775 reg = LEB (); 6776 roffs = LEB (); 6777 if (reg >= (unsigned int) fc->ncols) 6778 reg_prefix = bad_reg; 6779 if (! do_debug_frames_interp || *reg_prefix != '\0') 6780 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n", 6781 reg_prefix, regname (reg, 0), 6782 roffs * fc->data_factor); 6783 if (*reg_prefix == '\0') 6784 { 6785 fc->col_type[reg] = DW_CFA_val_offset; 6786 fc->col_offset[reg] = roffs * fc->data_factor; 6787 } 6788 break; 6789 6790 case DW_CFA_restore_extended: 6791 reg = LEB (); 6792 if (reg >= (unsigned int) cie->ncols 6793 || reg >= (unsigned int) fc->ncols) 6794 reg_prefix = bad_reg; 6795 if (! do_debug_frames_interp || *reg_prefix != '\0') 6796 printf (" DW_CFA_restore_extended: %s%s\n", 6797 reg_prefix, regname (reg, 0)); 6798 if (*reg_prefix == '\0') 6799 { 6800 fc->col_type[reg] = cie->col_type[reg]; 6801 fc->col_offset[reg] = cie->col_offset[reg]; 6802 } 6803 break; 6804 6805 case DW_CFA_undefined: 6806 reg = LEB (); 6807 if (reg >= (unsigned int) fc->ncols) 6808 reg_prefix = bad_reg; 6809 if (! do_debug_frames_interp || *reg_prefix != '\0') 6810 printf (" DW_CFA_undefined: %s%s\n", 6811 reg_prefix, regname (reg, 0)); 6812 if (*reg_prefix == '\0') 6813 { 6814 fc->col_type[reg] = DW_CFA_undefined; 6815 fc->col_offset[reg] = 0; 6816 } 6817 break; 6818 6819 case DW_CFA_same_value: 6820 reg = LEB (); 6821 if (reg >= (unsigned int) fc->ncols) 6822 reg_prefix = bad_reg; 6823 if (! do_debug_frames_interp || *reg_prefix != '\0') 6824 printf (" DW_CFA_same_value: %s%s\n", 6825 reg_prefix, regname (reg, 0)); 6826 if (*reg_prefix == '\0') 6827 { 6828 fc->col_type[reg] = DW_CFA_same_value; 6829 fc->col_offset[reg] = 0; 6830 } 6831 break; 6832 6833 case DW_CFA_register: 6834 reg = LEB (); 6835 roffs = LEB (); 6836 if (reg >= (unsigned int) fc->ncols) 6837 reg_prefix = bad_reg; 6838 if (! do_debug_frames_interp || *reg_prefix != '\0') 6839 { 6840 printf (" DW_CFA_register: %s%s in ", 6841 reg_prefix, regname (reg, 0)); 6842 puts (regname (roffs, 0)); 6843 } 6844 if (*reg_prefix == '\0') 6845 { 6846 fc->col_type[reg] = DW_CFA_register; 6847 fc->col_offset[reg] = roffs; 6848 } 6849 break; 6850 6851 case DW_CFA_remember_state: 6852 if (! do_debug_frames_interp) 6853 printf (" DW_CFA_remember_state\n"); 6854 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk)); 6855 rs->cfa_offset = fc->cfa_offset; 6856 rs->cfa_reg = fc->cfa_reg; 6857 rs->ra = fc->ra; 6858 rs->cfa_exp = fc->cfa_exp; 6859 rs->ncols = fc->ncols; 6860 rs->col_type = (short int *) xcmalloc (rs->ncols, 6861 sizeof (* rs->col_type)); 6862 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset)); 6863 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type)); 6864 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset)); 6865 rs->next = remembered_state; 6866 remembered_state = rs; 6867 break; 6868 6869 case DW_CFA_restore_state: 6870 if (! do_debug_frames_interp) 6871 printf (" DW_CFA_restore_state\n"); 6872 rs = remembered_state; 6873 if (rs) 6874 { 6875 remembered_state = rs->next; 6876 fc->cfa_offset = rs->cfa_offset; 6877 fc->cfa_reg = rs->cfa_reg; 6878 fc->ra = rs->ra; 6879 fc->cfa_exp = rs->cfa_exp; 6880 if (frame_need_space (fc, rs->ncols - 1) < 0) 6881 { 6882 warn (_("Invalid column number in saved frame state\n")); 6883 fc->ncols = 0; 6884 break; 6885 } 6886 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type)); 6887 memcpy (fc->col_offset, rs->col_offset, 6888 rs->ncols * sizeof (* rs->col_offset)); 6889 free (rs->col_type); 6890 free (rs->col_offset); 6891 free (rs); 6892 } 6893 else if (do_debug_frames_interp) 6894 printf ("Mismatched DW_CFA_restore_state\n"); 6895 break; 6896 6897 case DW_CFA_def_cfa: 6898 fc->cfa_reg = LEB (); 6899 fc->cfa_offset = LEB (); 6900 fc->cfa_exp = 0; 6901 if (! do_debug_frames_interp) 6902 printf (" DW_CFA_def_cfa: %s ofs %d\n", 6903 regname (fc->cfa_reg, 0), (int) fc->cfa_offset); 6904 break; 6905 6906 case DW_CFA_def_cfa_register: 6907 fc->cfa_reg = LEB (); 6908 fc->cfa_exp = 0; 6909 if (! do_debug_frames_interp) 6910 printf (" DW_CFA_def_cfa_register: %s\n", 6911 regname (fc->cfa_reg, 0)); 6912 break; 6913 6914 case DW_CFA_def_cfa_offset: 6915 fc->cfa_offset = LEB (); 6916 if (! do_debug_frames_interp) 6917 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset); 6918 break; 6919 6920 case DW_CFA_nop: 6921 if (! do_debug_frames_interp) 6922 printf (" DW_CFA_nop\n"); 6923 break; 6924 6925 case DW_CFA_def_cfa_expression: 6926 ul = LEB (); 6927 if (start >= block_end || ul > (unsigned long) (block_end - start)) 6928 { 6929 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul); 6930 break; 6931 } 6932 if (! do_debug_frames_interp) 6933 { 6934 printf (" DW_CFA_def_cfa_expression ("); 6935 decode_location_expression (start, eh_addr_size, 0, -1, 6936 ul, 0, section); 6937 printf (")\n"); 6938 } 6939 fc->cfa_exp = 1; 6940 start += ul; 6941 break; 6942 6943 case DW_CFA_expression: 6944 reg = LEB (); 6945 ul = LEB (); 6946 if (reg >= (unsigned int) fc->ncols) 6947 reg_prefix = bad_reg; 6948 /* PR 17512: file: 069-133014-0.006. */ 6949 /* PR 17512: file: 98c02eb4. */ 6950 tmp = start + ul; 6951 if (start >= block_end || tmp > block_end || tmp < start) 6952 { 6953 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul); 6954 break; 6955 } 6956 if (! do_debug_frames_interp || *reg_prefix != '\0') 6957 { 6958 printf (" DW_CFA_expression: %s%s (", 6959 reg_prefix, regname (reg, 0)); 6960 decode_location_expression (start, eh_addr_size, 0, -1, 6961 ul, 0, section); 6962 printf (")\n"); 6963 } 6964 if (*reg_prefix == '\0') 6965 fc->col_type[reg] = DW_CFA_expression; 6966 start = tmp; 6967 break; 6968 6969 case DW_CFA_val_expression: 6970 reg = LEB (); 6971 ul = LEB (); 6972 if (reg >= (unsigned int) fc->ncols) 6973 reg_prefix = bad_reg; 6974 tmp = start + ul; 6975 if (start >= block_end || tmp > block_end || tmp < start) 6976 { 6977 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul); 6978 break; 6979 } 6980 if (! do_debug_frames_interp || *reg_prefix != '\0') 6981 { 6982 printf (" DW_CFA_val_expression: %s%s (", 6983 reg_prefix, regname (reg, 0)); 6984 decode_location_expression (start, eh_addr_size, 0, -1, 6985 ul, 0, section); 6986 printf (")\n"); 6987 } 6988 if (*reg_prefix == '\0') 6989 fc->col_type[reg] = DW_CFA_val_expression; 6990 start = tmp; 6991 break; 6992 6993 case DW_CFA_offset_extended_sf: 6994 reg = LEB (); 6995 l = SLEB (); 6996 if (frame_need_space (fc, reg) < 0) 6997 reg_prefix = bad_reg; 6998 if (! do_debug_frames_interp || *reg_prefix != '\0') 6999 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n", 7000 reg_prefix, regname (reg, 0), 7001 (long)(l * fc->data_factor)); 7002 if (*reg_prefix == '\0') 7003 { 7004 fc->col_type[reg] = DW_CFA_offset; 7005 fc->col_offset[reg] = l * fc->data_factor; 7006 } 7007 break; 7008 7009 case DW_CFA_val_offset_sf: 7010 reg = LEB (); 7011 l = SLEB (); 7012 if (frame_need_space (fc, reg) < 0) 7013 reg_prefix = bad_reg; 7014 if (! do_debug_frames_interp || *reg_prefix != '\0') 7015 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n", 7016 reg_prefix, regname (reg, 0), 7017 (long)(l * fc->data_factor)); 7018 if (*reg_prefix == '\0') 7019 { 7020 fc->col_type[reg] = DW_CFA_val_offset; 7021 fc->col_offset[reg] = l * fc->data_factor; 7022 } 7023 break; 7024 7025 case DW_CFA_def_cfa_sf: 7026 fc->cfa_reg = LEB (); 7027 fc->cfa_offset = SLEB (); 7028 fc->cfa_offset = fc->cfa_offset * fc->data_factor; 7029 fc->cfa_exp = 0; 7030 if (! do_debug_frames_interp) 7031 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n", 7032 regname (fc->cfa_reg, 0), (int) fc->cfa_offset); 7033 break; 7034 7035 case DW_CFA_def_cfa_offset_sf: 7036 fc->cfa_offset = SLEB (); 7037 fc->cfa_offset *= fc->data_factor; 7038 if (! do_debug_frames_interp) 7039 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset); 7040 break; 7041 7042 case DW_CFA_MIPS_advance_loc8: 7043 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end); 7044 if (do_debug_frames_interp) 7045 frame_display_row (fc, &need_col_headers, &max_regs); 7046 else 7047 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n", 7048 (unsigned long) (ofs * fc->code_factor), 7049 dwarf_vmatoa_1 (NULL, 7050 fc->pc_begin + ofs * fc->code_factor, 7051 fc->ptr_size)); 7052 fc->pc_begin += ofs * fc->code_factor; 7053 break; 7054 7055 case DW_CFA_GNU_window_save: 7056 if (! do_debug_frames_interp) 7057 printf (" DW_CFA_GNU_window_save\n"); 7058 break; 7059 7060 case DW_CFA_GNU_args_size: 7061 ul = LEB (); 7062 if (! do_debug_frames_interp) 7063 printf (" DW_CFA_GNU_args_size: %ld\n", ul); 7064 break; 7065 7066 case DW_CFA_GNU_negative_offset_extended: 7067 reg = LEB (); 7068 l = - LEB (); 7069 if (frame_need_space (fc, reg) < 0) 7070 reg_prefix = bad_reg; 7071 if (! do_debug_frames_interp || *reg_prefix != '\0') 7072 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n", 7073 reg_prefix, regname (reg, 0), 7074 (long)(l * fc->data_factor)); 7075 if (*reg_prefix == '\0') 7076 { 7077 fc->col_type[reg] = DW_CFA_offset; 7078 fc->col_offset[reg] = l * fc->data_factor; 7079 } 7080 break; 7081 7082 default: 7083 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user) 7084 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op); 7085 else 7086 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op); 7087 start = block_end; 7088 } 7089 } 7090 7091 /* Interpret the CFA - as long as it is not completely full of NOPs. */ 7092 if (do_debug_frames_interp && ! all_nops) 7093 frame_display_row (fc, &need_col_headers, &max_regs); 7094 7095 start = block_end; 7096 eh_addr_size = saved_eh_addr_size; 7097 } 7098 7099 printf ("\n"); 7100 7101 return 1; 7102 } 7103 7104 #undef GET 7105 #undef LEB 7106 #undef SLEB 7107 7108 static int 7109 display_gdb_index (struct dwarf_section *section, 7110 void *file ATTRIBUTE_UNUSED) 7111 { 7112 unsigned char *start = section->start; 7113 uint32_t version; 7114 uint32_t cu_list_offset, tu_list_offset; 7115 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset; 7116 unsigned int cu_list_elements, tu_list_elements; 7117 unsigned int address_table_size, symbol_table_slots; 7118 unsigned char *cu_list, *tu_list; 7119 unsigned char *address_table, *symbol_table, *constant_pool; 7120 unsigned int i; 7121 7122 /* The documentation for the format of this file is in gdb/dwarf2read.c. */ 7123 7124 printf (_("Contents of the %s section:\n"), section->name); 7125 7126 if (section->size < 6 * sizeof (uint32_t)) 7127 { 7128 warn (_("Truncated header in the %s section.\n"), section->name); 7129 return 0; 7130 } 7131 7132 version = byte_get_little_endian (start, 4); 7133 printf (_("Version %ld\n"), (long) version); 7134 7135 /* Prior versions are obsolete, and future versions may not be 7136 backwards compatible. */ 7137 if (version < 3 || version > 8) 7138 { 7139 warn (_("Unsupported version %lu.\n"), (unsigned long) version); 7140 return 0; 7141 } 7142 if (version < 4) 7143 warn (_("The address table data in version 3 may be wrong.\n")); 7144 if (version < 5) 7145 warn (_("Version 4 does not support case insensitive lookups.\n")); 7146 if (version < 6) 7147 warn (_("Version 5 does not include inlined functions.\n")); 7148 if (version < 7) 7149 warn (_("Version 6 does not include symbol attributes.\n")); 7150 /* Version 7 indices generated by Gold have bad type unit references, 7151 PR binutils/15021. But we don't know if the index was generated by 7152 Gold or not, so to avoid worrying users with gdb-generated indices 7153 we say nothing for version 7 here. */ 7154 7155 cu_list_offset = byte_get_little_endian (start + 4, 4); 7156 tu_list_offset = byte_get_little_endian (start + 8, 4); 7157 address_table_offset = byte_get_little_endian (start + 12, 4); 7158 symbol_table_offset = byte_get_little_endian (start + 16, 4); 7159 constant_pool_offset = byte_get_little_endian (start + 20, 4); 7160 7161 if (cu_list_offset > section->size 7162 || tu_list_offset > section->size 7163 || address_table_offset > section->size 7164 || symbol_table_offset > section->size 7165 || constant_pool_offset > section->size) 7166 { 7167 warn (_("Corrupt header in the %s section.\n"), section->name); 7168 return 0; 7169 } 7170 7171 /* PR 17531: file: 418d0a8a. */ 7172 if (tu_list_offset < cu_list_offset) 7173 { 7174 warn (_("TU offset (%x) is less than CU offset (%x)\n"), 7175 tu_list_offset, cu_list_offset); 7176 return 0; 7177 } 7178 7179 cu_list_elements = (tu_list_offset - cu_list_offset) / 8; 7180 7181 if (address_table_offset < tu_list_offset) 7182 { 7183 warn (_("Address table offset (%x) is less than TU offset (%x)\n"), 7184 address_table_offset, tu_list_offset); 7185 return 0; 7186 } 7187 7188 tu_list_elements = (address_table_offset - tu_list_offset) / 8; 7189 7190 /* PR 17531: file: 18a47d3d. */ 7191 if (symbol_table_offset < address_table_offset) 7192 { 7193 warn (_("Symbol table offset (%xl) is less then Address table offset (%x)\n"), 7194 symbol_table_offset, address_table_offset); 7195 return 0; 7196 } 7197 7198 address_table_size = symbol_table_offset - address_table_offset; 7199 7200 if (constant_pool_offset < symbol_table_offset) 7201 { 7202 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"), 7203 constant_pool_offset, symbol_table_offset); 7204 return 0; 7205 } 7206 7207 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8; 7208 7209 cu_list = start + cu_list_offset; 7210 tu_list = start + tu_list_offset; 7211 address_table = start + address_table_offset; 7212 symbol_table = start + symbol_table_offset; 7213 constant_pool = start + constant_pool_offset; 7214 7215 if (address_table + address_table_size * (2 + 8 + 4) > section->start + section->size) 7216 { 7217 warn (_("Address table extends beyond end of section.\n")); 7218 return 0; 7219 } 7220 7221 printf (_("\nCU table:\n")); 7222 for (i = 0; i < cu_list_elements; i += 2) 7223 { 7224 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8); 7225 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8); 7226 7227 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2, 7228 (unsigned long) cu_offset, 7229 (unsigned long) (cu_offset + cu_length - 1)); 7230 } 7231 7232 printf (_("\nTU table:\n")); 7233 for (i = 0; i < tu_list_elements; i += 3) 7234 { 7235 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8); 7236 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8); 7237 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8); 7238 7239 printf (_("[%3u] 0x%lx 0x%lx "), i / 3, 7240 (unsigned long) tu_offset, 7241 (unsigned long) type_offset); 7242 print_dwarf_vma (signature, 8); 7243 printf ("\n"); 7244 } 7245 7246 printf (_("\nAddress table:\n")); 7247 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4); 7248 i += 2 * 8 + 4) 7249 { 7250 uint64_t low = byte_get_little_endian (address_table + i, 8); 7251 uint64_t high = byte_get_little_endian (address_table + i + 8, 8); 7252 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4); 7253 7254 print_dwarf_vma (low, 8); 7255 print_dwarf_vma (high, 8); 7256 printf (_("%lu\n"), (unsigned long) cu_index); 7257 } 7258 7259 printf (_("\nSymbol table:\n")); 7260 for (i = 0; i < symbol_table_slots; ++i) 7261 { 7262 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4); 7263 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4); 7264 uint32_t num_cus, cu; 7265 7266 if (name_offset != 0 7267 || cu_vector_offset != 0) 7268 { 7269 unsigned int j; 7270 unsigned char * adr; 7271 7272 adr = constant_pool + name_offset; 7273 /* PR 17531: file: 5b7b07ad. */ 7274 if (adr < constant_pool || adr >= section->start + section->size) 7275 { 7276 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset); 7277 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"), 7278 name_offset, i); 7279 } 7280 else 7281 printf ("[%3u] %.*s:", i, 7282 (int) (section->size - (constant_pool_offset + name_offset)), 7283 constant_pool + name_offset); 7284 7285 adr = constant_pool + cu_vector_offset; 7286 if (adr < constant_pool || adr >= section->start + section->size - 3) 7287 { 7288 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset); 7289 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"), 7290 cu_vector_offset, i); 7291 continue; 7292 } 7293 7294 num_cus = byte_get_little_endian (adr, 4); 7295 7296 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4; 7297 if (num_cus * 4 < num_cus 7298 || adr >= section->start + section->size 7299 || adr < constant_pool) 7300 { 7301 printf ("<invalid number of CUs: %d>\n", num_cus); 7302 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"), 7303 num_cus, i); 7304 continue; 7305 } 7306 7307 if (num_cus > 1) 7308 printf ("\n"); 7309 7310 for (j = 0; j < num_cus; ++j) 7311 { 7312 int is_static; 7313 gdb_index_symbol_kind kind; 7314 7315 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4); 7316 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu); 7317 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu); 7318 cu = GDB_INDEX_CU_VALUE (cu); 7319 /* Convert to TU number if it's for a type unit. */ 7320 if (cu >= cu_list_elements / 2) 7321 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ', 7322 (unsigned long) (cu - cu_list_elements / 2)); 7323 else 7324 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu); 7325 7326 printf (" [%s, %s]", 7327 is_static ? _("static") : _("global"), 7328 get_gdb_index_symbol_kind_name (kind)); 7329 if (num_cus > 1) 7330 printf ("\n"); 7331 } 7332 if (num_cus <= 1) 7333 printf ("\n"); 7334 } 7335 } 7336 7337 return 1; 7338 } 7339 7340 /* Pre-allocate enough space for the CU/TU sets needed. */ 7341 7342 static void 7343 prealloc_cu_tu_list (unsigned int nshndx) 7344 { 7345 if (shndx_pool == NULL) 7346 { 7347 shndx_pool_size = nshndx; 7348 shndx_pool_used = 0; 7349 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size, 7350 sizeof (unsigned int)); 7351 } 7352 else 7353 { 7354 shndx_pool_size = shndx_pool_used + nshndx; 7355 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size, 7356 sizeof (unsigned int)); 7357 } 7358 } 7359 7360 static void 7361 add_shndx_to_cu_tu_entry (unsigned int shndx) 7362 { 7363 if (shndx_pool_used >= shndx_pool_size) 7364 { 7365 error (_("Internal error: out of space in the shndx pool.\n")); 7366 return; 7367 } 7368 shndx_pool [shndx_pool_used++] = shndx; 7369 } 7370 7371 static void 7372 end_cu_tu_entry (void) 7373 { 7374 if (shndx_pool_used >= shndx_pool_size) 7375 { 7376 error (_("Internal error: out of space in the shndx pool.\n")); 7377 return; 7378 } 7379 shndx_pool [shndx_pool_used++] = 0; 7380 } 7381 7382 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */ 7383 7384 static const char * 7385 get_DW_SECT_short_name (unsigned int dw_sect) 7386 { 7387 static char buf[16]; 7388 7389 switch (dw_sect) 7390 { 7391 case DW_SECT_INFO: 7392 return "info"; 7393 case DW_SECT_TYPES: 7394 return "types"; 7395 case DW_SECT_ABBREV: 7396 return "abbrev"; 7397 case DW_SECT_LINE: 7398 return "line"; 7399 case DW_SECT_LOC: 7400 return "loc"; 7401 case DW_SECT_STR_OFFSETS: 7402 return "str_off"; 7403 case DW_SECT_MACINFO: 7404 return "macinfo"; 7405 case DW_SECT_MACRO: 7406 return "macro"; 7407 default: 7408 break; 7409 } 7410 7411 snprintf (buf, sizeof (buf), "%d", dw_sect); 7412 return buf; 7413 } 7414 7415 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents. 7416 These sections are extensions for Fission. 7417 See http://gcc.gnu.org/wiki/DebugFissionDWP. */ 7418 7419 static int 7420 process_cu_tu_index (struct dwarf_section *section, int do_display) 7421 { 7422 unsigned char *phdr = section->start; 7423 unsigned char *limit = phdr + section->size; 7424 unsigned char *phash; 7425 unsigned char *pindex; 7426 unsigned char *ppool; 7427 unsigned int version; 7428 unsigned int ncols = 0; 7429 unsigned int nused; 7430 unsigned int nslots; 7431 unsigned int i; 7432 unsigned int j; 7433 dwarf_vma signature_high; 7434 dwarf_vma signature_low; 7435 char buf[64]; 7436 7437 /* PR 17512: file: 002-168123-0.004. */ 7438 if (phdr == NULL) 7439 { 7440 warn (_("Section %s is empty\n"), section->name); 7441 return 0; 7442 } 7443 /* PR 17512: file: 002-376-0.004. */ 7444 if (section->size < 24) 7445 { 7446 warn (_("Section %s is too small to contain a CU/TU header\n"), 7447 section->name); 7448 return 0; 7449 } 7450 7451 SAFE_BYTE_GET (version, phdr, 4, limit); 7452 if (version >= 2) 7453 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit); 7454 SAFE_BYTE_GET (nused, phdr + 8, 4, limit); 7455 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit); 7456 7457 phash = phdr + 16; 7458 pindex = phash + nslots * 8; 7459 ppool = pindex + nslots * 4; 7460 7461 /* PR 17531: file: 45d69832. */ 7462 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0)) 7463 { 7464 warn (_("Section %s is too small for %d slots\n"), 7465 section->name, nslots); 7466 return 0; 7467 } 7468 7469 if (do_display) 7470 { 7471 printf (_("Contents of the %s section:\n\n"), section->name); 7472 printf (_(" Version: %d\n"), version); 7473 if (version >= 2) 7474 printf (_(" Number of columns: %d\n"), ncols); 7475 printf (_(" Number of used entries: %d\n"), nused); 7476 printf (_(" Number of slots: %d\n\n"), nslots); 7477 } 7478 7479 if (ppool > limit || ppool < phdr) 7480 { 7481 warn (_("Section %s too small for %d hash table entries\n"), 7482 section->name, nslots); 7483 return 0; 7484 } 7485 7486 if (version == 1) 7487 { 7488 if (!do_display) 7489 prealloc_cu_tu_list ((limit - ppool) / 4); 7490 for (i = 0; i < nslots; i++) 7491 { 7492 unsigned char *shndx_list; 7493 unsigned int shndx; 7494 7495 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit); 7496 if (signature_high != 0 || signature_low != 0) 7497 { 7498 SAFE_BYTE_GET (j, pindex, 4, limit); 7499 shndx_list = ppool + j * 4; 7500 /* PR 17531: file: 705e010d. */ 7501 if (shndx_list < ppool) 7502 { 7503 warn (_("Section index pool located before start of section\n")); 7504 return 0; 7505 } 7506 7507 if (do_display) 7508 printf (_(" [%3d] Signature: 0x%s Sections: "), 7509 i, dwarf_vmatoa64 (signature_high, signature_low, 7510 buf, sizeof (buf))); 7511 for (;;) 7512 { 7513 if (shndx_list >= limit) 7514 { 7515 warn (_("Section %s too small for shndx pool\n"), 7516 section->name); 7517 return 0; 7518 } 7519 SAFE_BYTE_GET (shndx, shndx_list, 4, limit); 7520 if (shndx == 0) 7521 break; 7522 if (do_display) 7523 printf (" %d", shndx); 7524 else 7525 add_shndx_to_cu_tu_entry (shndx); 7526 shndx_list += 4; 7527 } 7528 if (do_display) 7529 printf ("\n"); 7530 else 7531 end_cu_tu_entry (); 7532 } 7533 phash += 8; 7534 pindex += 4; 7535 } 7536 } 7537 else if (version == 2) 7538 { 7539 unsigned int val; 7540 unsigned int dw_sect; 7541 unsigned char *ph = phash; 7542 unsigned char *pi = pindex; 7543 unsigned char *poffsets = ppool + ncols * 4; 7544 unsigned char *psizes = poffsets + nused * ncols * 4; 7545 unsigned char *pend = psizes + nused * ncols * 4; 7546 bfd_boolean is_tu_index; 7547 struct cu_tu_set *this_set = NULL; 7548 unsigned int row; 7549 unsigned char *prow; 7550 7551 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0; 7552 7553 /* PR 17531: file: 0dd159bf. 7554 Check for wraparound with an overlarge ncols value. */ 7555 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols) 7556 { 7557 warn (_("Overlarge number of columns: %x\n"), ncols); 7558 return 0; 7559 } 7560 7561 if (pend > limit) 7562 { 7563 warn (_("Section %s too small for offset and size tables\n"), 7564 section->name); 7565 return 0; 7566 } 7567 7568 if (do_display) 7569 { 7570 printf (_(" Offset table\n")); 7571 printf (" slot %-16s ", 7572 is_tu_index ? _("signature") : _("dwo_id")); 7573 } 7574 else 7575 { 7576 if (is_tu_index) 7577 { 7578 tu_count = nused; 7579 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set)); 7580 this_set = tu_sets; 7581 } 7582 else 7583 { 7584 cu_count = nused; 7585 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set)); 7586 this_set = cu_sets; 7587 } 7588 } 7589 7590 if (do_display) 7591 { 7592 for (j = 0; j < ncols; j++) 7593 { 7594 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit); 7595 printf (" %8s", get_DW_SECT_short_name (dw_sect)); 7596 } 7597 printf ("\n"); 7598 } 7599 7600 for (i = 0; i < nslots; i++) 7601 { 7602 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit); 7603 7604 SAFE_BYTE_GET (row, pi, 4, limit); 7605 if (row != 0) 7606 { 7607 /* PR 17531: file: a05f6ab3. */ 7608 if (row > nused) 7609 { 7610 warn (_("Row index (%u) is larger than number of used entries (%u)\n"), 7611 row, nused); 7612 return 0; 7613 } 7614 7615 if (!do_display) 7616 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t)); 7617 7618 prow = poffsets + (row - 1) * ncols * 4; 7619 /* PR 17531: file: b8ce60a8. */ 7620 if (prow < poffsets || prow > limit) 7621 { 7622 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"), 7623 row, ncols); 7624 return 0; 7625 } 7626 7627 if (do_display) 7628 printf (_(" [%3d] 0x%s"), 7629 i, dwarf_vmatoa64 (signature_high, signature_low, 7630 buf, sizeof (buf))); 7631 for (j = 0; j < ncols; j++) 7632 { 7633 SAFE_BYTE_GET (val, prow + j * 4, 4, limit); 7634 if (do_display) 7635 printf (" %8d", val); 7636 else 7637 { 7638 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit); 7639 7640 /* PR 17531: file: 10796eb3. */ 7641 if (dw_sect >= DW_SECT_MAX) 7642 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect); 7643 else 7644 this_set [row - 1].section_offsets [dw_sect] = val; 7645 } 7646 } 7647 7648 if (do_display) 7649 printf ("\n"); 7650 } 7651 ph += 8; 7652 pi += 4; 7653 } 7654 7655 ph = phash; 7656 pi = pindex; 7657 if (do_display) 7658 { 7659 printf ("\n"); 7660 printf (_(" Size table\n")); 7661 printf (" slot %-16s ", 7662 is_tu_index ? _("signature") : _("dwo_id")); 7663 } 7664 7665 for (j = 0; j < ncols; j++) 7666 { 7667 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit); 7668 if (do_display) 7669 printf (" %8s", get_DW_SECT_short_name (val)); 7670 } 7671 7672 if (do_display) 7673 printf ("\n"); 7674 7675 for (i = 0; i < nslots; i++) 7676 { 7677 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit); 7678 7679 SAFE_BYTE_GET (row, pi, 4, limit); 7680 if (row != 0) 7681 { 7682 prow = psizes + (row - 1) * ncols * 4; 7683 7684 if (do_display) 7685 printf (_(" [%3d] 0x%s"), 7686 i, dwarf_vmatoa64 (signature_high, signature_low, 7687 buf, sizeof (buf))); 7688 7689 for (j = 0; j < ncols; j++) 7690 { 7691 SAFE_BYTE_GET (val, prow + j * 4, 4, limit); 7692 if (do_display) 7693 printf (" %8d", val); 7694 else 7695 { 7696 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit); 7697 if (dw_sect >= DW_SECT_MAX) 7698 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect); 7699 else 7700 this_set [row - 1].section_sizes [dw_sect] = val; 7701 } 7702 } 7703 7704 if (do_display) 7705 printf ("\n"); 7706 } 7707 7708 ph += 8; 7709 pi += 4; 7710 } 7711 } 7712 else if (do_display) 7713 printf (_(" Unsupported version (%d)\n"), version); 7714 7715 if (do_display) 7716 printf ("\n"); 7717 7718 return 1; 7719 } 7720 7721 /* Load the CU and TU indexes if present. This will build a list of 7722 section sets that we can use to associate a .debug_info.dwo section 7723 with its associated .debug_abbrev.dwo section in a .dwp file. */ 7724 7725 static void 7726 load_cu_tu_indexes (void *file) 7727 { 7728 /* If we have already loaded (or tried to load) the CU and TU indexes 7729 then do not bother to repeat the task. */ 7730 if (cu_tu_indexes_read) 7731 return; 7732 7733 if (load_debug_section (dwp_cu_index, file)) 7734 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0); 7735 7736 if (load_debug_section (dwp_tu_index, file)) 7737 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0); 7738 7739 cu_tu_indexes_read = 1; 7740 } 7741 7742 /* Find the set of sections that includes section SHNDX. */ 7743 7744 unsigned int * 7745 find_cu_tu_set (void *file, unsigned int shndx) 7746 { 7747 unsigned int i; 7748 7749 load_cu_tu_indexes (file); 7750 7751 /* Find SHNDX in the shndx pool. */ 7752 for (i = 0; i < shndx_pool_used; i++) 7753 if (shndx_pool [i] == shndx) 7754 break; 7755 7756 if (i >= shndx_pool_used) 7757 return NULL; 7758 7759 /* Now backup to find the first entry in the set. */ 7760 while (i > 0 && shndx_pool [i - 1] != 0) 7761 i--; 7762 7763 return shndx_pool + i; 7764 } 7765 7766 /* Display a .debug_cu_index or .debug_tu_index section. */ 7767 7768 static int 7769 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED) 7770 { 7771 return process_cu_tu_index (section, 1); 7772 } 7773 7774 static int 7775 display_debug_not_supported (struct dwarf_section *section, 7776 void *file ATTRIBUTE_UNUSED) 7777 { 7778 printf (_("Displaying the debug contents of section %s is not yet supported.\n"), 7779 section->name); 7780 7781 return 1; 7782 } 7783 7784 /* Like malloc, but takes two parameters like calloc. 7785 Verifies that the first parameter is not too large. 7786 Note: does *not* initialise the allocated memory to zero. */ 7787 void * 7788 cmalloc (size_t nmemb, size_t size) 7789 { 7790 /* Check for overflow. */ 7791 if (nmemb >= ~(size_t) 0 / size) 7792 return NULL; 7793 7794 return xmalloc (nmemb * size); 7795 } 7796 7797 /* Like xmalloc, but takes two parameters like calloc. 7798 Verifies that the first parameter is not too large. 7799 Note: does *not* initialise the allocated memory to zero. */ 7800 void * 7801 xcmalloc (size_t nmemb, size_t size) 7802 { 7803 /* Check for overflow. */ 7804 if (nmemb >= ~(size_t) 0 / size) 7805 { 7806 fprintf (stderr, 7807 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"), 7808 (long) nmemb); 7809 xexit (1); 7810 } 7811 7812 return xmalloc (nmemb * size); 7813 } 7814 7815 /* Like xrealloc, but takes three parameters. 7816 Verifies that the second parameter is not too large. 7817 Note: does *not* initialise any new memory to zero. */ 7818 void * 7819 xcrealloc (void *ptr, size_t nmemb, size_t size) 7820 { 7821 /* Check for overflow. */ 7822 if (nmemb >= ~(size_t) 0 / size) 7823 { 7824 fprintf (stderr, 7825 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"), 7826 (long) nmemb); 7827 xexit (1); 7828 } 7829 7830 return xrealloc (ptr, nmemb * size); 7831 } 7832 7833 /* Like xcalloc, but verifies that the first parameter is not too large. */ 7834 void * 7835 xcalloc2 (size_t nmemb, size_t size) 7836 { 7837 /* Check for overflow. */ 7838 if (nmemb >= ~(size_t) 0 / size) 7839 { 7840 fprintf (stderr, 7841 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"), 7842 (long) nmemb); 7843 xexit (1); 7844 } 7845 7846 return xcalloc (nmemb, size); 7847 } 7848 7849 void 7850 free_debug_memory (void) 7851 { 7852 unsigned int i; 7853 7854 free_abbrevs (); 7855 7856 for (i = 0; i < max; i++) 7857 free_debug_section ((enum dwarf_section_display_enum) i); 7858 7859 if (debug_information != NULL) 7860 { 7861 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE) 7862 { 7863 for (i = 0; i < num_debug_info_entries; i++) 7864 { 7865 if (!debug_information [i].max_loc_offsets) 7866 { 7867 free (debug_information [i].loc_offsets); 7868 free (debug_information [i].have_frame_base); 7869 } 7870 if (!debug_information [i].max_range_lists) 7871 free (debug_information [i].range_lists); 7872 } 7873 } 7874 free (debug_information); 7875 debug_information = NULL; 7876 alloc_num_debug_info_entries = num_debug_info_entries = 0; 7877 } 7878 } 7879 7880 void 7881 dwarf_select_sections_by_names (const char *names) 7882 { 7883 typedef struct 7884 { 7885 const char * option; 7886 int * variable; 7887 int val; 7888 } 7889 debug_dump_long_opts; 7890 7891 static const debug_dump_long_opts opts_table [] = 7892 { 7893 /* Please keep this table alpha- sorted. */ 7894 { "Ranges", & do_debug_ranges, 1 }, 7895 { "abbrev", & do_debug_abbrevs, 1 }, 7896 { "addr", & do_debug_addr, 1 }, 7897 { "aranges", & do_debug_aranges, 1 }, 7898 { "cu_index", & do_debug_cu_index, 1 }, 7899 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED }, 7900 { "frames", & do_debug_frames, 1 }, 7901 { "frames-interp", & do_debug_frames_interp, 1 }, 7902 /* The special .gdb_index section. */ 7903 { "gdb_index", & do_gdb_index, 1 }, 7904 { "info", & do_debug_info, 1 }, 7905 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */ 7906 { "loc", & do_debug_loc, 1 }, 7907 { "macro", & do_debug_macinfo, 1 }, 7908 { "pubnames", & do_debug_pubnames, 1 }, 7909 { "pubtypes", & do_debug_pubtypes, 1 }, 7910 /* This entry is for compatability 7911 with earlier versions of readelf. */ 7912 { "ranges", & do_debug_aranges, 1 }, 7913 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, 7914 { "str", & do_debug_str, 1 }, 7915 /* These trace_* sections are used by Itanium VMS. */ 7916 { "trace_abbrev", & do_trace_abbrevs, 1 }, 7917 { "trace_aranges", & do_trace_aranges, 1 }, 7918 { "trace_info", & do_trace_info, 1 }, 7919 { NULL, NULL, 0 } 7920 }; 7921 7922 const char *p; 7923 7924 p = names; 7925 while (*p) 7926 { 7927 const debug_dump_long_opts * entry; 7928 7929 for (entry = opts_table; entry->option; entry++) 7930 { 7931 size_t len = strlen (entry->option); 7932 7933 if (strncmp (p, entry->option, len) == 0 7934 && (p[len] == ',' || p[len] == '\0')) 7935 { 7936 * entry->variable |= entry->val; 7937 7938 /* The --debug-dump=frames-interp option also 7939 enables the --debug-dump=frames option. */ 7940 if (do_debug_frames_interp) 7941 do_debug_frames = 1; 7942 7943 p += len; 7944 break; 7945 } 7946 } 7947 7948 if (entry->option == NULL) 7949 { 7950 warn (_("Unrecognized debug option '%s'\n"), p); 7951 p = strchr (p, ','); 7952 if (p == NULL) 7953 break; 7954 } 7955 7956 if (*p == ',') 7957 p++; 7958 } 7959 } 7960 7961 void 7962 dwarf_select_sections_by_letters (const char *letters) 7963 { 7964 unsigned int lindex = 0; 7965 7966 while (letters[lindex]) 7967 switch (letters[lindex++]) 7968 { 7969 case 'i': 7970 do_debug_info = 1; 7971 break; 7972 7973 case 'a': 7974 do_debug_abbrevs = 1; 7975 break; 7976 7977 case 'l': 7978 do_debug_lines |= FLAG_DEBUG_LINES_RAW; 7979 break; 7980 7981 case 'L': 7982 do_debug_lines |= FLAG_DEBUG_LINES_DECODED; 7983 break; 7984 7985 case 'p': 7986 do_debug_pubnames = 1; 7987 break; 7988 7989 case 't': 7990 do_debug_pubtypes = 1; 7991 break; 7992 7993 case 'r': 7994 do_debug_aranges = 1; 7995 break; 7996 7997 case 'R': 7998 do_debug_ranges = 1; 7999 break; 8000 8001 case 'F': 8002 do_debug_frames_interp = 1; 8003 case 'f': 8004 do_debug_frames = 1; 8005 break; 8006 8007 case 'm': 8008 do_debug_macinfo = 1; 8009 break; 8010 8011 case 's': 8012 do_debug_str = 1; 8013 break; 8014 8015 case 'o': 8016 do_debug_loc = 1; 8017 break; 8018 8019 default: 8020 warn (_("Unrecognized debug option '%s'\n"), letters); 8021 break; 8022 } 8023 } 8024 8025 void 8026 dwarf_select_sections_all (void) 8027 { 8028 do_debug_info = 1; 8029 do_debug_abbrevs = 1; 8030 do_debug_lines = FLAG_DEBUG_LINES_RAW; 8031 do_debug_pubnames = 1; 8032 do_debug_pubtypes = 1; 8033 do_debug_aranges = 1; 8034 do_debug_ranges = 1; 8035 do_debug_frames = 1; 8036 do_debug_macinfo = 1; 8037 do_debug_str = 1; 8038 do_debug_loc = 1; 8039 do_gdb_index = 1; 8040 do_trace_info = 1; 8041 do_trace_abbrevs = 1; 8042 do_trace_aranges = 1; 8043 do_debug_addr = 1; 8044 do_debug_cu_index = 1; 8045 } 8046 8047 struct dwarf_section_display debug_displays[] = 8048 { 8049 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8050 display_debug_abbrev, &do_debug_abbrevs, FALSE }, 8051 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8052 display_debug_aranges, &do_debug_aranges, TRUE }, 8053 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8054 display_debug_frames, &do_debug_frames, TRUE }, 8055 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL }, 8056 display_debug_info, &do_debug_info, TRUE }, 8057 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8058 display_debug_lines, &do_debug_lines, TRUE }, 8059 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8060 display_debug_pubnames, &do_debug_pubnames, FALSE }, 8061 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8062 display_debug_gnu_pubnames, &do_debug_pubnames, FALSE }, 8063 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8064 display_debug_frames, &do_debug_frames, TRUE }, 8065 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8066 display_debug_macinfo, &do_debug_macinfo, FALSE }, 8067 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8068 display_debug_macro, &do_debug_macinfo, TRUE }, 8069 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8070 display_debug_str, &do_debug_str, FALSE }, 8071 { { ".debug_line_str", ".zdebug_line_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8072 display_debug_str, &do_debug_str, FALSE }, 8073 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8074 display_debug_loc, &do_debug_loc, TRUE }, 8075 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8076 display_debug_pubnames, &do_debug_pubtypes, FALSE }, 8077 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8078 display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE }, 8079 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8080 display_debug_ranges, &do_debug_ranges, TRUE }, 8081 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8082 display_debug_not_supported, NULL, FALSE }, 8083 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8084 display_debug_not_supported, NULL, FALSE }, 8085 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL }, 8086 display_debug_types, &do_debug_info, TRUE }, 8087 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8088 display_debug_not_supported, NULL, FALSE }, 8089 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8090 display_gdb_index, &do_gdb_index, FALSE }, 8091 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL, 0, NULL }, 8092 display_trace_info, &do_trace_info, TRUE }, 8093 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8094 display_debug_abbrev, &do_trace_abbrevs, FALSE }, 8095 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8096 display_debug_aranges, &do_trace_aranges, FALSE }, 8097 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL }, 8098 display_debug_info, &do_debug_info, TRUE }, 8099 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8100 display_debug_abbrev, &do_debug_abbrevs, FALSE }, 8101 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL }, 8102 display_debug_types, &do_debug_info, TRUE }, 8103 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8104 display_debug_lines, &do_debug_lines, TRUE }, 8105 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8106 display_debug_loc, &do_debug_loc, TRUE }, 8107 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8108 display_debug_macro, &do_debug_macinfo, TRUE }, 8109 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8110 display_debug_macinfo, &do_debug_macinfo, FALSE }, 8111 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8112 display_debug_str, &do_debug_str, TRUE }, 8113 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8114 display_debug_str_offsets, NULL, FALSE }, 8115 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8116 display_debug_str_offsets, NULL, FALSE }, 8117 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8118 display_debug_addr, &do_debug_addr, TRUE }, 8119 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8120 display_cu_index, &do_debug_cu_index, FALSE }, 8121 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL }, 8122 display_cu_index, &do_debug_cu_index, FALSE }, 8123 }; 8124