1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2024 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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.
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.
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
22 #include "libiberty.h"
27 #include "elf/common.h"
30 #include "gdb/gdb-index.h"
31 #include "filenames.h"
32 #include "safe-ctype.h"
35 #ifdef HAVE_LIBDEBUGINFOD
36 #include <elfutils/debuginfod.h>
44 #ifndef ENABLE_CHECKING
45 #define ENABLE_CHECKING 0
50 #define MAX(a, b) ((a) > (b) ? (a) : (b))
51 #define MIN(a, b) ((a) < (b) ? (a) : (b))
53 static const char *regname (unsigned int regno
, int row
);
54 static const char *regname_internal_by_table_only (unsigned int regno
);
56 static int have_frame_base
;
57 static int frame_base_level
= -1; /* To support nested DW_TAG_subprogram's. */
58 static int need_base_address
;
60 static unsigned int num_debug_info_entries
= 0;
61 static unsigned int alloc_num_debug_info_entries
= 0;
62 static debug_info
*debug_information
= NULL
;
63 /* Special value for num_debug_info_entries to indicate
64 that the .debug_info section could not be loaded/parsed. */
65 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
67 /* A .debug_info section can contain multiple links to separate
68 DWO object files. We use these structures to record these links. */
76 typedef struct dwo_info
81 struct dwo_info
* next
;
84 static dwo_info
*first_dwo_info
= NULL
;
85 static bool need_dwo_info
;
87 separate_info
* first_separate_info
= NULL
;
89 unsigned int eh_addr_size
;
94 int do_debug_pubnames
;
95 int do_debug_pubtypes
;
99 int do_debug_frames_interp
;
100 int do_debug_macinfo
;
102 int do_debug_str_offsets
;
106 int do_trace_abbrevs
;
107 int do_trace_aranges
;
109 int do_debug_cu_index
;
112 int do_follow_links
= DEFAULT_FOR_FOLLOW_LINKS
;
113 #ifdef HAVE_LIBDEBUGINFOD
114 int use_debuginfod
= 1;
118 int dwarf_cutoff_level
= -1;
119 unsigned long dwarf_start_die
;
123 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
124 sections. For version 1 package files, each set is stored in SHNDX_POOL
125 as a zero-terminated list of section indexes comprising one set of debug
126 sections from a .dwo file. */
128 static unsigned int *shndx_pool
= NULL
;
129 static unsigned int shndx_pool_size
= 0;
130 static unsigned int shndx_pool_used
= 0;
132 /* For version 2 package files, each set contains an array of section offsets
133 and an array of section sizes, giving the offset and size of the
134 contribution from a CU or TU within one of the debug sections.
135 When displaying debug info from a package file, we need to use these
136 tables to locate the corresponding contributions to each section. */
141 uint64_t section_offsets
[DW_SECT_MAX
];
142 size_t section_sizes
[DW_SECT_MAX
];
145 static int cu_count
= 0;
146 static int tu_count
= 0;
147 static struct cu_tu_set
*cu_sets
= NULL
;
148 static struct cu_tu_set
*tu_sets
= NULL
;
150 static bool load_cu_tu_indexes (void *);
152 /* An array that indicates for a given level of CU nesting whether
153 the latest DW_AT_type seen for that level was a signed type or
155 #define MAX_CU_NESTING (1 << 8)
156 static bool level_type_signed
[MAX_CU_NESTING
];
158 /* Values for do_debug_lines. */
159 #define FLAG_DEBUG_LINES_RAW 1
160 #define FLAG_DEBUG_LINES_DECODED 2
163 size_of_encoded_value (int encoding
)
165 switch (encoding
& 0x7)
168 case 0: return eh_addr_size
;
176 get_encoded_value (unsigned char **pdata
,
178 struct dwarf_section
*section
,
181 unsigned char * data
= * pdata
;
182 unsigned int size
= size_of_encoded_value (encoding
);
185 if (data
>= end
|| size
> (size_t) (end
- data
))
187 warn (_("Encoded value extends past end of section\n"));
192 /* PR 17512: file: 002-829853-0.004. */
195 warn (_("Encoded size of %d is too large to read\n"), size
);
200 /* PR 17512: file: 1085-5603-0.004. */
203 warn (_("Encoded size of 0 is too small to read\n"));
208 if (encoding
& DW_EH_PE_signed
)
209 val
= byte_get_signed (data
, size
);
211 val
= byte_get (data
, size
);
213 if ((encoding
& 0x70) == DW_EH_PE_pcrel
)
214 val
+= section
->address
+ (data
- section
->start
);
216 * pdata
= data
+ size
;
220 /* Print a uint64_t value (typically an address, offset or length) in
221 hexadecimal format, followed by a space. The precision displayed is
222 determined by the NUM_BYTES parameter. */
225 print_hex (uint64_t value
, unsigned num_bytes
)
230 printf ("%0*" PRIx64
" ", num_bytes
* 2,
231 value
& ~(~(uint64_t) 0 << num_bytes
* 4 << num_bytes
* 4));
234 /* Like print_hex, but no trailing space. */
237 print_hex_ns (uint64_t value
, unsigned num_bytes
)
242 printf ("%0*" PRIx64
, num_bytes
* 2,
243 value
& ~(~(uint64_t) 0 << num_bytes
* 4 << num_bytes
* 4));
246 /* Print a view number in hexadecimal value, with the same width as
247 print_hex would have printed it. */
250 print_view (uint64_t value
, unsigned num_bytes
)
255 printf ("v%0*" PRIx64
" ", num_bytes
* 2 - 1,
256 value
& ~(~(uint64_t) 0 << num_bytes
* 4 << num_bytes
* 4));
260 null_name (const char *p
)
267 /* Read in a LEB128 encoded value starting at address DATA.
268 If SIGN is true, return a signed LEB128 value.
269 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
270 If STATUS_RETURN is not NULL, return with bit 0 (LSB) set if the
271 terminating byte was not found and with bit 1 set if the value
272 overflows a uint64_t.
273 No bytes will be read at address END or beyond. */
276 read_leb128 (unsigned char *data
,
277 const unsigned char *const end
,
279 unsigned int *length_return
,
283 unsigned int num_read
= 0;
284 unsigned int shift
= 0;
289 unsigned char byte
= *data
++;
290 unsigned char lost
, mask
;
294 if (shift
< CHAR_BIT
* sizeof (result
))
296 result
|= ((uint64_t) (byte
& 0x7f)) << shift
;
297 /* These bits overflowed. */
298 lost
= byte
^ (result
>> shift
);
299 /* And this is the mask of possible overflow bits. */
300 mask
= 0x7f ^ ((uint64_t) 0x7f << shift
>> shift
);
308 if ((lost
& mask
) != (sign
&& (int64_t) result
< 0 ? mask
: 0))
311 if ((byte
& 0x80) == 0)
314 if (sign
&& shift
< CHAR_BIT
* sizeof (result
) && (byte
& 0x40))
315 result
|= -((uint64_t) 1 << shift
);
320 if (length_return
!= NULL
)
321 *length_return
= num_read
;
322 if (status_return
!= NULL
)
323 *status_return
= status
;
328 /* Read AMOUNT bytes from PTR and store them in VAL.
329 Checks to make sure that the read will not reach or pass END.
330 FUNC chooses whether the value read is unsigned or signed, and may
331 be either byte_get or byte_get_signed. If INC is true, PTR is
332 incremented after reading the value.
333 This macro cannot protect against PTR values derived from user input.
334 The C standard sections 6.5.6 and 6.5.8 say attempts to do so using
335 pointers is undefined behaviour. */
336 #define SAFE_BYTE_GET_INTERNAL(VAL, PTR, AMOUNT, END, FUNC, INC) \
339 size_t amount = (AMOUNT); \
340 if (sizeof (VAL) < amount) \
342 error (ngettext ("internal error: attempt to read %d byte " \
343 "of data in to %d sized variable", \
344 "internal error: attempt to read %d bytes " \
345 "of data in to %d sized variable", \
347 (int) amount, (int) sizeof (VAL)); \
348 amount = sizeof (VAL); \
350 if (ENABLE_CHECKING) \
351 assert ((PTR) <= (END)); \
352 size_t avail = (END) - (PTR); \
355 if (amount > avail) \
360 (VAL) = (FUNC) ((PTR), amount); \
366 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
367 SAFE_BYTE_GET_INTERNAL (VAL, PTR, AMOUNT, END, byte_get, false)
369 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
370 SAFE_BYTE_GET_INTERNAL (VAL, PTR, AMOUNT, END, byte_get, true)
372 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
373 SAFE_BYTE_GET_INTERNAL (VAL, PTR, AMOUNT, END, byte_get_signed, false)
375 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
376 SAFE_BYTE_GET_INTERNAL (VAL, PTR, AMOUNT, END, byte_get_signed, true)
378 typedef struct State_Machine_Registers
387 unsigned char op_index
;
388 unsigned char end_sequence
;
389 /* This variable hold the number of the last entry seen
390 in the File Table. */
391 unsigned int last_file_entry
;
394 static SMR state_machine_regs
;
397 reset_state_machine (int is_stmt
)
399 state_machine_regs
.address
= 0;
400 state_machine_regs
.view
= 0;
401 state_machine_regs
.op_index
= 0;
402 state_machine_regs
.file
= 1;
403 state_machine_regs
.line
= 1;
404 state_machine_regs
.column
= 0;
405 state_machine_regs
.is_stmt
= is_stmt
;
406 state_machine_regs
.basic_block
= 0;
407 state_machine_regs
.end_sequence
= 0;
408 state_machine_regs
.last_file_entry
= 0;
411 /* Handled an extend line op.
412 Returns the number of bytes read. */
415 process_extended_line_op (unsigned char * data
,
419 unsigned char op_code
;
420 size_t len
, header_len
;
422 unsigned char *orig_data
= data
;
425 READ_ULEB (len
, data
, end
);
426 header_len
= data
- orig_data
;
428 if (len
== 0 || data
>= end
|| len
> (size_t) (end
- data
))
430 warn (_("Badly formed extended line op encountered!\n"));
436 printf (_(" Extended opcode %d: "), op_code
);
440 case DW_LNE_end_sequence
:
441 printf (_("End of Sequence\n\n"));
442 reset_state_machine (is_stmt
);
445 case DW_LNE_set_address
:
446 /* PR 17512: file: 002-100480-0.004. */
449 warn (_("Length (%zu) of DW_LNE_set_address op is too long\n"),
454 SAFE_BYTE_GET (adr
, data
, len
- 1, end
);
455 printf (_("set Address to %#" PRIx64
"\n"), adr
);
456 state_machine_regs
.address
= adr
;
457 state_machine_regs
.view
= 0;
458 state_machine_regs
.op_index
= 0;
461 case DW_LNE_define_file
:
462 printf (_("define new File Table entry\n"));
463 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
464 printf (" %d\t", ++state_machine_regs
.last_file_entry
);
470 l
= strnlen ((char *) data
, end
- data
);
474 READ_ULEB (val
, data
, end
);
475 printf ("%" PRIu64
"\t", val
);
476 READ_ULEB (val
, data
, end
);
477 printf ("%" PRIu64
"\t", val
);
478 READ_ULEB (val
, data
, end
);
479 printf ("%" PRIu64
"\t", val
);
480 printf ("%.*s\n\n", (int) l
, name
);
483 if (((size_t) (data
- orig_data
) != len
+ header_len
) || data
>= end
)
484 warn (_("DW_LNE_define_file: Bad opcode length\n"));
487 case DW_LNE_set_discriminator
:
488 READ_ULEB (val
, data
, end
);
489 printf (_("set Discriminator to %" PRIu64
"\n"), val
);
493 case DW_LNE_HP_negate_is_UV_update
:
494 printf ("DW_LNE_HP_negate_is_UV_update\n");
496 case DW_LNE_HP_push_context
:
497 printf ("DW_LNE_HP_push_context\n");
499 case DW_LNE_HP_pop_context
:
500 printf ("DW_LNE_HP_pop_context\n");
502 case DW_LNE_HP_set_file_line_column
:
503 printf ("DW_LNE_HP_set_file_line_column\n");
505 case DW_LNE_HP_set_routine_name
:
506 printf ("DW_LNE_HP_set_routine_name\n");
508 case DW_LNE_HP_set_sequence
:
509 printf ("DW_LNE_HP_set_sequence\n");
511 case DW_LNE_HP_negate_post_semantics
:
512 printf ("DW_LNE_HP_negate_post_semantics\n");
514 case DW_LNE_HP_negate_function_exit
:
515 printf ("DW_LNE_HP_negate_function_exit\n");
517 case DW_LNE_HP_negate_front_end_logical
:
518 printf ("DW_LNE_HP_negate_front_end_logical\n");
520 case DW_LNE_HP_define_proc
:
521 printf ("DW_LNE_HP_define_proc\n");
523 case DW_LNE_HP_source_file_correlation
:
525 unsigned char *edata
= data
+ len
- 1;
527 printf ("DW_LNE_HP_source_file_correlation\n");
533 READ_ULEB (opc
, data
, edata
);
537 case DW_LNE_HP_SFC_formfeed
:
538 printf (" DW_LNE_HP_SFC_formfeed\n");
540 case DW_LNE_HP_SFC_set_listing_line
:
541 READ_ULEB (val
, data
, edata
);
542 printf (" DW_LNE_HP_SFC_set_listing_line (%" PRIu64
")\n",
545 case DW_LNE_HP_SFC_associate
:
546 printf (" DW_LNE_HP_SFC_associate ");
547 READ_ULEB (val
, data
, edata
);
548 printf ("(%" PRIu64
, val
);
549 READ_ULEB (val
, data
, edata
);
550 printf (",%" PRIu64
, val
);
551 READ_ULEB (val
, data
, edata
);
552 printf (",%" PRIu64
")\n", val
);
555 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc
);
565 unsigned int rlen
= len
- 1;
567 if (op_code
>= DW_LNE_lo_user
568 /* The test against DW_LNW_hi_user is redundant due to
569 the limited range of the unsigned char data type used
571 /*&& op_code <= DW_LNE_hi_user*/)
572 printf (_("user defined: "));
574 printf (_("UNKNOWN: "));
575 printf (_("length %d ["), rlen
);
577 printf (" %02x", *data
++);
583 return len
+ header_len
;
586 static const unsigned char *
587 fetch_indirect_string (uint64_t offset
)
589 struct dwarf_section
*section
= &debug_displays
[str
].section
;
590 const unsigned char * ret
;
592 if (section
->start
== NULL
)
593 return (const unsigned char *) _("<no .debug_str section>");
595 if (offset
>= section
->size
)
597 warn (_("DW_FORM_strp offset too big: %#" PRIx64
"\n"), offset
);
598 return (const unsigned char *) _("<offset is too big>");
601 ret
= section
->start
+ offset
;
602 /* Unfortunately we cannot rely upon the .debug_str section ending with a
603 NUL byte. Since our caller is expecting to receive a well formed C
604 string we test for the lack of a terminating byte here. */
605 if (strnlen ((const char *) ret
, section
->size
- offset
)
606 == section
->size
- offset
)
607 ret
= (const unsigned char *)
608 _("<no NUL byte at end of .debug_str section>");
613 static const unsigned char *
614 fetch_indirect_line_string (uint64_t offset
)
616 struct dwarf_section
*section
= &debug_displays
[line_str
].section
;
617 const unsigned char * ret
;
619 if (section
->start
== NULL
)
620 return (const unsigned char *) _("<no .debug_line_str section>");
622 if (offset
>= section
->size
)
624 warn (_("DW_FORM_line_strp offset too big: %#" PRIx64
"\n"), offset
);
625 return (const unsigned char *) _("<offset is too big>");
628 ret
= section
->start
+ offset
;
629 /* Unfortunately we cannot rely upon the .debug_line_str section ending
630 with a NUL byte. Since our caller is expecting to receive a well formed
631 C string we test for the lack of a terminating byte here. */
632 if (strnlen ((const char *) ret
, section
->size
- offset
)
633 == section
->size
- offset
)
634 ret
= (const unsigned char *)
635 _("<no NUL byte at end of .debug_line_str section>");
641 fetch_indexed_string (uint64_t idx
,
642 struct cu_tu_set
*this_set
,
643 uint64_t offset_size
,
645 uint64_t str_offsets_base
)
647 enum dwarf_section_display_enum str_sec_idx
= dwo
? str_dwo
: str
;
648 enum dwarf_section_display_enum idx_sec_idx
= dwo
? str_index_dwo
: str_index
;
649 struct dwarf_section
*index_section
= &debug_displays
[idx_sec_idx
].section
;
650 struct dwarf_section
*str_section
= &debug_displays
[str_sec_idx
].section
;
651 uint64_t index_offset
;
655 if (index_section
->start
== NULL
)
656 return (dwo
? _("<no .debug_str_offsets.dwo section>")
657 : _("<no .debug_str_offsets section>"));
659 if (str_section
->start
== NULL
)
660 return (dwo
? _("<no .debug_str.dwo section>")
661 : _("<no .debug_str section>"));
663 if (_mul_overflow (idx
, offset_size
, &index_offset
)
665 && ((index_offset
+= this_set
->section_offsets
[DW_SECT_STR_OFFSETS
])
666 < this_set
->section_offsets
[DW_SECT_STR_OFFSETS
]))
667 || (index_offset
+= str_offsets_base
) < str_offsets_base
668 || index_offset
+ offset_size
< offset_size
669 || index_offset
+ offset_size
> index_section
->size
)
671 warn (_("string index of %" PRIu64
" converts to an offset of %#" PRIx64
672 " which is too big for section %s"),
673 idx
, index_offset
, str_section
->name
);
675 return _("<string index too big>");
678 str_offset
= byte_get (index_section
->start
+ index_offset
, offset_size
);
680 str_offset
-= str_section
->address
;
681 if (str_offset
>= str_section
->size
)
683 warn (_("indirect offset too big: %#" PRIx64
"\n"), str_offset
);
684 return _("<indirect index offset is too big>");
687 ret
= (const char *) str_section
->start
+ str_offset
;
689 /* Unfortunately we cannot rely upon str_section ending with a NUL byte.
690 Since our caller is expecting to receive a well formed C string we test
691 for the lack of a terminating byte here. */
692 if (strnlen (ret
, str_section
->size
- str_offset
)
693 == str_section
->size
- str_offset
)
694 return _("<no NUL byte at end of section>");
700 fetch_indexed_addr (uint64_t offset
, uint32_t num_bytes
)
702 struct dwarf_section
*section
= &debug_displays
[debug_addr
].section
;
704 if (section
->start
== NULL
)
706 warn (_("Cannot fetch indexed address: the .debug_addr section is missing\n"));
710 if (offset
+ num_bytes
> section
->size
)
712 warn (_("Offset into section %s too big: %#" PRIx64
"\n"),
713 section
->name
, offset
);
717 return byte_get (section
->start
+ offset
, num_bytes
);
720 /* This is for resolving DW_FORM_rnglistx and DW_FORM_loclistx.
722 The memory layout is: base_address (taken from the CU's top DIE) points at a table of offsets,
723 relative to the section start.
724 The table of offsets contains the offsets of objects of interest relative to the table of offsets.
725 IDX is the index of the desired object in said table of offsets.
727 This returns the offset of the desired object relative to the section start or -1 upon failure. */
730 fetch_indexed_offset (uint64_t idx
,
731 enum dwarf_section_display_enum sec_enum
,
732 uint64_t base_address
,
733 uint64_t offset_size
)
735 uint64_t offset_of_offset
= base_address
+ idx
* offset_size
;
736 struct dwarf_section
*section
= &debug_displays
[sec_enum
].section
;
738 if (section
->start
== NULL
)
740 warn (_("Unable to locate %s section\n"), section
->uncompressed_name
);
744 if (section
->size
< 4)
746 warn (_("Section %s is too small to contain an value indexed from another section!\n"),
751 if (offset_of_offset
+ offset_size
>= section
->size
)
753 warn (_("Offset of %#" PRIx64
" is too big for section %s\n"),
754 offset_of_offset
, section
->name
);
758 return base_address
+ byte_get (section
->start
+ offset_of_offset
, offset_size
);
761 /* FIXME: There are better and more efficient ways to handle
762 these structures. For now though, I just want something that
763 is simple to implement. */
764 /* Records a single attribute in an abbrev. */
765 typedef struct abbrev_attr
767 unsigned long attribute
;
769 int64_t implicit_const
;
770 struct abbrev_attr
*next
;
774 /* Records a single abbrev. */
775 typedef struct abbrev_entry
777 unsigned long number
;
780 struct abbrev_attr
* first_attr
;
781 struct abbrev_attr
* last_attr
;
782 struct abbrev_entry
* next
;
786 /* Records a set of abbreviations. */
787 typedef struct abbrev_list
789 abbrev_entry
* first_abbrev
;
790 abbrev_entry
* last_abbrev
;
792 struct abbrev_list
* next
;
793 unsigned char * start_of_next_abbrevs
;
797 /* Records all the abbrevs found so far. */
798 static struct abbrev_list
* abbrev_lists
= NULL
;
800 typedef struct abbrev_map
807 /* Maps between CU offsets and abbrev sets. */
808 static abbrev_map
* cu_abbrev_map
= NULL
;
809 static unsigned long num_abbrev_map_entries
= 0;
810 static unsigned long next_free_abbrev_map_entry
= 0;
812 #define INITIAL_NUM_ABBREV_MAP_ENTRIES 8
813 #define ABBREV_MAP_ENTRIES_INCREMENT 8
816 record_abbrev_list_for_cu (uint64_t start
, uint64_t end
,
817 abbrev_list
*list
, abbrev_list
*free_list
)
819 if (free_list
!= NULL
)
821 list
->next
= abbrev_lists
;
825 if (cu_abbrev_map
== NULL
)
827 num_abbrev_map_entries
= INITIAL_NUM_ABBREV_MAP_ENTRIES
;
828 cu_abbrev_map
= xmalloc (num_abbrev_map_entries
* sizeof (* cu_abbrev_map
));
830 else if (next_free_abbrev_map_entry
== num_abbrev_map_entries
)
832 num_abbrev_map_entries
+= ABBREV_MAP_ENTRIES_INCREMENT
;
833 cu_abbrev_map
= xrealloc (cu_abbrev_map
, num_abbrev_map_entries
* sizeof (* cu_abbrev_map
));
836 cu_abbrev_map
[next_free_abbrev_map_entry
].start
= start
;
837 cu_abbrev_map
[next_free_abbrev_map_entry
].end
= end
;
838 cu_abbrev_map
[next_free_abbrev_map_entry
].list
= list
;
839 next_free_abbrev_map_entry
++;
843 free_abbrev_list (abbrev_list
*list
)
845 abbrev_entry
*abbrv
= list
->first_abbrev
;
849 abbrev_attr
*attr
= abbrv
->first_attr
;
853 abbrev_attr
*next_attr
= attr
->next
;
858 abbrev_entry
*next_abbrev
= abbrv
->next
;
863 abbrev_list
*next
= list
->next
;
869 free_all_abbrevs (void)
872 abbrev_lists
= free_abbrev_list (abbrev_lists
);
874 free (cu_abbrev_map
);
875 cu_abbrev_map
= NULL
;
876 next_free_abbrev_map_entry
= 0;
880 find_abbrev_list_by_raw_abbrev (unsigned char *raw
)
884 for (list
= abbrev_lists
; list
!= NULL
; list
= list
->next
)
885 if (list
->raw
== raw
)
891 /* Find the abbreviation map for the CU that includes OFFSET.
892 OFFSET is an absolute offset from the start of the .debug_info section. */
893 /* FIXME: This function is going to slow down readelf & objdump.
894 Not caching abbrevs is likely the answer. */
897 find_abbrev_map_by_offset (uint64_t offset
)
901 for (i
= 0; i
< next_free_abbrev_map_entry
; i
++)
902 if (cu_abbrev_map
[i
].start
<= offset
903 && cu_abbrev_map
[i
].end
> offset
)
904 return cu_abbrev_map
+ i
;
910 add_abbrev (unsigned long number
,
915 abbrev_entry
* entry
;
917 entry
= (abbrev_entry
*) xmalloc (sizeof (*entry
));
919 entry
->number
= number
;
921 entry
->children
= children
;
922 entry
->first_attr
= NULL
;
923 entry
->last_attr
= NULL
;
926 assert (list
!= NULL
);
928 if (list
->first_abbrev
== NULL
)
929 list
->first_abbrev
= entry
;
931 list
->last_abbrev
->next
= entry
;
933 list
->last_abbrev
= entry
;
937 add_abbrev_attr (unsigned long attribute
,
939 int64_t implicit_const
,
944 attr
= (abbrev_attr
*) xmalloc (sizeof (*attr
));
946 attr
->attribute
= attribute
;
948 attr
->implicit_const
= implicit_const
;
951 assert (list
!= NULL
&& list
->last_abbrev
!= NULL
);
953 if (list
->last_abbrev
->first_attr
== NULL
)
954 list
->last_abbrev
->first_attr
= attr
;
956 list
->last_abbrev
->last_attr
->next
= attr
;
958 list
->last_abbrev
->last_attr
= attr
;
961 /* Return processed (partial) contents of a .debug_abbrev section.
962 Returns NULL on errors. */
965 process_abbrev_set (struct dwarf_section
*section
,
966 unsigned char *start
,
969 abbrev_list
*list
= xmalloc (sizeof (*list
));
970 list
->first_abbrev
= NULL
;
971 list
->last_abbrev
= NULL
;
979 unsigned long attribute
;
982 READ_ULEB (entry
, start
, end
);
984 /* A single zero is supposed to end the set according
985 to the standard. If there's more, then signal that to
987 if (start
== end
|| entry
== 0)
989 list
->start_of_next_abbrevs
= start
!= end
? start
: NULL
;
993 READ_ULEB (tag
, start
, end
);
995 return free_abbrev_list (list
);
999 add_abbrev (entry
, tag
, children
, list
);
1004 /* Initialize it due to a false compiler warning. */
1005 int64_t implicit_const
= -1;
1007 READ_ULEB (attribute
, start
, end
);
1011 READ_ULEB (form
, start
, end
);
1015 if (form
== DW_FORM_implicit_const
)
1017 READ_SLEB (implicit_const
, start
, end
);
1022 add_abbrev_attr (attribute
, form
, implicit_const
, list
);
1024 while (attribute
!= 0);
1027 /* Report the missing single zero which ends the section. */
1028 error (_("%s section not zero terminated\n"), section
->name
);
1030 return free_abbrev_list (list
);
1033 /* Return a sequence of abbrevs in SECTION starting at ABBREV_BASE
1034 plus ABBREV_OFFSET and finishing at ABBREV_BASE + ABBREV_SIZE.
1035 If FREE_LIST is non-NULL search the already decoded abbrevs on
1036 abbrev_lists first and if found set *FREE_LIST to NULL. If
1037 searching doesn't find a matching abbrev, set *FREE_LIST to the
1038 newly allocated list. If FREE_LIST is NULL, no search is done and
1039 the returned abbrev_list is always newly allocated. */
1041 static abbrev_list
*
1042 find_and_process_abbrev_set (struct dwarf_section
*section
,
1043 uint64_t abbrev_base
,
1044 uint64_t abbrev_size
,
1045 uint64_t abbrev_offset
,
1046 abbrev_list
**free_list
)
1051 if (abbrev_base
>= section
->size
1052 || abbrev_size
> section
->size
- abbrev_base
)
1054 /* PR 17531: file:4bcd9ce9. */
1055 warn (_("Debug info is corrupted, abbrev size (%#" PRIx64
")"
1056 " is larger than abbrev section size (%#" PRIx64
")\n"),
1057 abbrev_base
+ abbrev_size
, section
->size
);
1060 if (abbrev_offset
>= abbrev_size
)
1062 warn (_("Debug info is corrupted, abbrev offset (%#" PRIx64
")"
1063 " is larger than abbrev section size (%#" PRIx64
")\n"),
1064 abbrev_offset
, abbrev_size
);
1068 unsigned char *start
= section
->start
+ abbrev_base
+ abbrev_offset
;
1069 unsigned char *end
= section
->start
+ abbrev_base
+ abbrev_size
;
1070 abbrev_list
*list
= NULL
;
1072 list
= find_abbrev_list_by_raw_abbrev (start
);
1075 list
= process_abbrev_set (section
, start
, end
);
1083 get_TAG_name (uint64_t tag
)
1085 const char *name
= NULL
;
1087 if ((unsigned int) tag
== tag
)
1088 name
= get_DW_TAG_name ((unsigned int) tag
);
1091 static char buffer
[100];
1093 if (tag
>= DW_TAG_lo_user
&& tag
<= DW_TAG_hi_user
)
1094 snprintf (buffer
, sizeof (buffer
),
1095 _("User TAG value: %#" PRIx64
), tag
);
1097 snprintf (buffer
, sizeof (buffer
),
1098 _("Unknown TAG value: %#" PRIx64
), tag
);
1106 get_FORM_name (unsigned long form
)
1108 const char *name
= NULL
;
1111 return "DW_FORM value: 0";
1113 if ((unsigned int) form
== form
)
1114 name
= get_DW_FORM_name ((unsigned int) form
);
1117 static char buffer
[100];
1119 snprintf (buffer
, sizeof (buffer
), _("Unknown FORM value: %lx"), form
);
1127 get_IDX_name (unsigned long idx
)
1129 const char *name
= NULL
;
1131 if ((unsigned int) idx
== idx
)
1132 name
= get_DW_IDX_name ((unsigned int) idx
);
1135 static char buffer
[100];
1137 snprintf (buffer
, sizeof (buffer
), _("Unknown IDX value: %lx"), idx
);
1144 static unsigned char *
1145 display_block (unsigned char *data
,
1147 const unsigned char * const end
, char delimiter
)
1151 printf (_("%c%" PRIu64
" byte block: "), delimiter
, length
);
1153 return (unsigned char *) end
;
1155 maxlen
= end
- data
;
1156 length
= length
> maxlen
? maxlen
: length
;
1159 printf ("%" PRIx64
" ", byte_get (data
++, 1));
1165 decode_location_expression (unsigned char * data
,
1166 unsigned int pointer_size
,
1167 unsigned int offset_size
,
1171 struct dwarf_section
* section
)
1176 unsigned char *end
= data
+ length
;
1177 int need_frame_base
= 0;
1186 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1187 printf ("DW_OP_addr: %" PRIx64
, uvalue
);
1190 printf ("DW_OP_deref");
1193 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1194 printf ("DW_OP_const1u: %" PRIu64
, uvalue
);
1197 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 1, end
);
1198 printf ("DW_OP_const1s: %" PRId64
, svalue
);
1201 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 2, end
);
1202 printf ("DW_OP_const2u: %" PRIu64
, uvalue
);
1205 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 2, end
);
1206 printf ("DW_OP_const2s: %" PRId64
, svalue
);
1209 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
1210 printf ("DW_OP_const4u: %" PRIu64
, uvalue
);
1213 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 4, end
);
1214 printf ("DW_OP_const4s: %" PRId64
, svalue
);
1217 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 8, end
);
1218 printf ("DW_OP_const8u: %" PRIu64
, uvalue
);
1221 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 8, end
);
1222 printf ("DW_OP_const8s: %" PRId64
, svalue
);
1225 READ_ULEB (uvalue
, data
, end
);
1226 printf ("DW_OP_constu: %" PRIu64
, uvalue
);
1229 READ_SLEB (svalue
, data
, end
);
1230 printf ("DW_OP_consts: %" PRId64
, svalue
);
1233 printf ("DW_OP_dup");
1236 printf ("DW_OP_drop");
1239 printf ("DW_OP_over");
1242 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1243 printf ("DW_OP_pick: %" PRIu64
, uvalue
);
1246 printf ("DW_OP_swap");
1249 printf ("DW_OP_rot");
1252 printf ("DW_OP_xderef");
1255 printf ("DW_OP_abs");
1258 printf ("DW_OP_and");
1261 printf ("DW_OP_div");
1264 printf ("DW_OP_minus");
1267 printf ("DW_OP_mod");
1270 printf ("DW_OP_mul");
1273 printf ("DW_OP_neg");
1276 printf ("DW_OP_not");
1279 printf ("DW_OP_or");
1282 printf ("DW_OP_plus");
1284 case DW_OP_plus_uconst
:
1285 READ_ULEB (uvalue
, data
, end
);
1286 printf ("DW_OP_plus_uconst: %" PRIu64
, uvalue
);
1289 printf ("DW_OP_shl");
1292 printf ("DW_OP_shr");
1295 printf ("DW_OP_shra");
1298 printf ("DW_OP_xor");
1301 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 2, end
);
1302 printf ("DW_OP_bra: %" PRId64
, svalue
);
1305 printf ("DW_OP_eq");
1308 printf ("DW_OP_ge");
1311 printf ("DW_OP_gt");
1314 printf ("DW_OP_le");
1317 printf ("DW_OP_lt");
1320 printf ("DW_OP_ne");
1323 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 2, end
);
1324 printf ("DW_OP_skip: %" PRId64
, svalue
);
1359 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
1394 printf ("DW_OP_reg%d (%s)", op
- DW_OP_reg0
,
1395 regname (op
- DW_OP_reg0
, 1));
1430 READ_SLEB (svalue
, data
, end
);
1431 printf ("DW_OP_breg%d (%s): %" PRId64
,
1432 op
- DW_OP_breg0
, regname (op
- DW_OP_breg0
, 1), svalue
);
1436 READ_ULEB (uvalue
, data
, end
);
1437 printf ("DW_OP_regx: %" PRIu64
" (%s)",
1438 uvalue
, regname (uvalue
, 1));
1441 need_frame_base
= 1;
1442 READ_SLEB (svalue
, data
, end
);
1443 printf ("DW_OP_fbreg: %" PRId64
, svalue
);
1446 READ_ULEB (uvalue
, data
, end
);
1447 READ_SLEB (svalue
, data
, end
);
1448 printf ("DW_OP_bregx: %" PRIu64
" (%s) %" PRId64
,
1449 uvalue
, regname (uvalue
, 1), svalue
);
1452 READ_ULEB (uvalue
, data
, end
);
1453 printf ("DW_OP_piece: %" PRIu64
, uvalue
);
1455 case DW_OP_deref_size
:
1456 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1457 printf ("DW_OP_deref_size: %" PRIu64
, uvalue
);
1459 case DW_OP_xderef_size
:
1460 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1461 printf ("DW_OP_xderef_size: %" PRIu64
, uvalue
);
1464 printf ("DW_OP_nop");
1467 /* DWARF 3 extensions. */
1468 case DW_OP_push_object_address
:
1469 printf ("DW_OP_push_object_address");
1472 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1473 this ought to be an 8-byte wide computation. */
1474 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 2, end
);
1475 printf ("DW_OP_call2: <%#" PRIx64
">", svalue
+ cu_offset
);
1478 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1479 this ought to be an 8-byte wide computation. */
1480 SAFE_SIGNED_BYTE_GET_AND_INC (svalue
, data
, 4, end
);
1481 printf ("DW_OP_call4: <%#" PRIx64
">", svalue
+ cu_offset
);
1483 case DW_OP_call_ref
:
1484 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1485 this ought to be an 8-byte wide computation. */
1486 if (dwarf_version
== -1)
1488 printf (_("(DW_OP_call_ref in frame info)"));
1489 /* No way to tell where the next op is, so just bail. */
1490 return need_frame_base
;
1492 if (dwarf_version
== 2)
1494 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1498 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
1500 printf ("DW_OP_call_ref: <%#" PRIx64
">", uvalue
);
1502 case DW_OP_form_tls_address
:
1503 printf ("DW_OP_form_tls_address");
1505 case DW_OP_call_frame_cfa
:
1506 printf ("DW_OP_call_frame_cfa");
1508 case DW_OP_bit_piece
:
1509 printf ("DW_OP_bit_piece: ");
1510 READ_ULEB (uvalue
, data
, end
);
1511 printf (_("size: %" PRIu64
" "), uvalue
);
1512 READ_ULEB (uvalue
, data
, end
);
1513 printf (_("offset: %" PRIu64
" "), uvalue
);
1516 /* DWARF 4 extensions. */
1517 case DW_OP_stack_value
:
1518 printf ("DW_OP_stack_value");
1521 case DW_OP_implicit_value
:
1522 printf ("DW_OP_implicit_value");
1523 READ_ULEB (uvalue
, data
, end
);
1524 data
= display_block (data
, uvalue
, end
, ' ');
1527 /* GNU extensions. */
1528 case DW_OP_GNU_push_tls_address
:
1529 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1531 case DW_OP_GNU_uninit
:
1532 printf ("DW_OP_GNU_uninit");
1533 /* FIXME: Is there data associated with this OP ? */
1535 case DW_OP_GNU_encoded_addr
:
1542 addr
= get_encoded_value (&data
, encoding
, section
, end
);
1544 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding
);
1545 print_hex_ns (addr
, pointer_size
);
1548 case DW_OP_implicit_pointer
:
1549 case DW_OP_GNU_implicit_pointer
:
1550 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1551 this ought to be an 8-byte wide computation. */
1552 if (dwarf_version
== -1)
1554 printf (_("(%s in frame info)"),
1555 (op
== DW_OP_implicit_pointer
1556 ? "DW_OP_implicit_pointer"
1557 : "DW_OP_GNU_implicit_pointer"));
1558 /* No way to tell where the next op is, so just bail. */
1559 return need_frame_base
;
1561 if (dwarf_version
== 2)
1563 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1567 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
1569 READ_SLEB (svalue
, data
, end
);
1570 printf ("%s: <%#" PRIx64
"> %" PRId64
,
1571 (op
== DW_OP_implicit_pointer
1572 ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"),
1575 case DW_OP_entry_value
:
1576 case DW_OP_GNU_entry_value
:
1577 READ_ULEB (uvalue
, data
, end
);
1578 /* PR 17531: file: 0cc9cd00. */
1579 if (uvalue
> (size_t) (end
- data
))
1580 uvalue
= end
- data
;
1581 printf ("%s: (", (op
== DW_OP_entry_value
? "DW_OP_entry_value"
1582 : "DW_OP_GNU_entry_value"));
1583 if (decode_location_expression (data
, pointer_size
, offset_size
,
1584 dwarf_version
, uvalue
,
1585 cu_offset
, section
))
1586 need_frame_base
= 1;
1590 case DW_OP_const_type
:
1591 case DW_OP_GNU_const_type
:
1592 READ_ULEB (uvalue
, data
, end
);
1593 printf ("%s: <%#" PRIx64
"> ",
1594 (op
== DW_OP_const_type
? "DW_OP_const_type"
1595 : "DW_OP_GNU_const_type"),
1596 cu_offset
+ uvalue
);
1597 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1598 data
= display_block (data
, uvalue
, end
, ' ');
1600 case DW_OP_regval_type
:
1601 case DW_OP_GNU_regval_type
:
1602 READ_ULEB (uvalue
, data
, end
);
1603 printf ("%s: %" PRIu64
" (%s)",
1604 (op
== DW_OP_regval_type
? "DW_OP_regval_type"
1605 : "DW_OP_GNU_regval_type"),
1606 uvalue
, regname (uvalue
, 1));
1607 READ_ULEB (uvalue
, data
, end
);
1608 printf (" <%#" PRIx64
">", cu_offset
+ uvalue
);
1610 case DW_OP_deref_type
:
1611 case DW_OP_GNU_deref_type
:
1612 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1613 printf ("%s: %" PRId64
,
1614 (op
== DW_OP_deref_type
? "DW_OP_deref_type"
1615 : "DW_OP_GNU_deref_type"),
1617 READ_ULEB (uvalue
, data
, end
);
1618 printf (" <%#" PRIx64
">", cu_offset
+ uvalue
);
1621 case DW_OP_GNU_convert
:
1622 READ_ULEB (uvalue
, data
, end
);
1623 printf ("%s <%#" PRIx64
">",
1624 (op
== DW_OP_convert
? "DW_OP_convert" : "DW_OP_GNU_convert"),
1625 uvalue
? cu_offset
+ uvalue
: uvalue
);
1627 case DW_OP_reinterpret
:
1628 case DW_OP_GNU_reinterpret
:
1629 READ_ULEB (uvalue
, data
, end
);
1630 printf ("%s <%#" PRIx64
">",
1631 (op
== DW_OP_reinterpret
? "DW_OP_reinterpret"
1632 : "DW_OP_GNU_reinterpret"),
1633 uvalue
? cu_offset
+ uvalue
: uvalue
);
1635 case DW_OP_GNU_parameter_ref
:
1636 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
1637 printf ("DW_OP_GNU_parameter_ref: <%#" PRIx64
">",
1638 cu_offset
+ uvalue
);
1641 READ_ULEB (uvalue
, data
, end
);
1642 printf ("DW_OP_addrx <%#" PRIx64
">", uvalue
);
1644 case DW_OP_GNU_addr_index
:
1645 READ_ULEB (uvalue
, data
, end
);
1646 printf ("DW_OP_GNU_addr_index <%#" PRIx64
">", uvalue
);
1648 case DW_OP_GNU_const_index
:
1649 READ_ULEB (uvalue
, data
, end
);
1650 printf ("DW_OP_GNU_const_index <%#" PRIx64
">", uvalue
);
1652 case DW_OP_GNU_variable_value
:
1653 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1654 this ought to be an 8-byte wide computation. */
1655 if (dwarf_version
== -1)
1657 printf (_("(DW_OP_GNU_variable_value in frame info)"));
1658 /* No way to tell where the next op is, so just bail. */
1659 return need_frame_base
;
1661 if (dwarf_version
== 2)
1663 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1667 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
1669 printf ("DW_OP_GNU_variable_value: <%#" PRIx64
">", uvalue
);
1672 /* HP extensions. */
1673 case DW_OP_HP_is_value
:
1674 printf ("DW_OP_HP_is_value");
1675 /* FIXME: Is there data associated with this OP ? */
1677 case DW_OP_HP_fltconst4
:
1678 printf ("DW_OP_HP_fltconst4");
1679 /* FIXME: Is there data associated with this OP ? */
1681 case DW_OP_HP_fltconst8
:
1682 printf ("DW_OP_HP_fltconst8");
1683 /* FIXME: Is there data associated with this OP ? */
1685 case DW_OP_HP_mod_range
:
1686 printf ("DW_OP_HP_mod_range");
1687 /* FIXME: Is there data associated with this OP ? */
1689 case DW_OP_HP_unmod_range
:
1690 printf ("DW_OP_HP_unmod_range");
1691 /* FIXME: Is there data associated with this OP ? */
1694 printf ("DW_OP_HP_tls");
1695 /* FIXME: Is there data associated with this OP ? */
1698 /* PGI (STMicroelectronics) extensions. */
1699 case DW_OP_PGI_omp_thread_num
:
1700 /* Pushes the thread number for the current thread as it would be
1701 returned by the standard OpenMP library function:
1702 omp_get_thread_num(). The "current thread" is the thread for
1703 which the expression is being evaluated. */
1704 printf ("DW_OP_PGI_omp_thread_num");
1708 if (op
>= DW_OP_lo_user
1709 && op
<= DW_OP_hi_user
)
1710 printf (_("(User defined location op %#x)"), op
);
1712 printf (_("(Unknown location op %#x)"), op
);
1713 /* No way to tell where the next op is, so just bail. */
1714 return need_frame_base
;
1717 /* Separate the ops. */
1722 return need_frame_base
;
1725 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1726 This is used for DWARF package files. */
1728 static struct cu_tu_set
*
1729 find_cu_tu_set_v2 (uint64_t cu_offset
, int do_types
)
1731 struct cu_tu_set
*p
;
1733 unsigned int dw_sect
;
1739 dw_sect
= DW_SECT_TYPES
;
1745 dw_sect
= DW_SECT_INFO
;
1749 if (p
->section_offsets
[dw_sect
] == cu_offset
)
1758 fetch_alt_indirect_string (uint64_t offset
)
1762 if (! do_follow_links
)
1765 if (first_separate_info
== NULL
)
1766 return _("<no links available>");
1768 for (i
= first_separate_info
; i
!= NULL
; i
= i
->next
)
1770 struct dwarf_section
* section
;
1773 if (! load_debug_section (separate_debug_str
, i
->handle
))
1776 section
= &debug_displays
[separate_debug_str
].section
;
1778 if (section
->start
== NULL
)
1781 if (offset
>= section
->size
)
1784 ret
= (const char *) (section
->start
+ offset
);
1785 /* Unfortunately we cannot rely upon the .debug_str section ending with a
1786 NUL byte. Since our caller is expecting to receive a well formed C
1787 string we test for the lack of a terminating byte here. */
1788 if (strnlen ((const char *) ret
, section
->size
- offset
)
1789 == section
->size
- offset
)
1790 return _("<no NUL byte at end of alt .debug_str section>");
1795 warn (_("DW_FORM_GNU_strp_alt offset (%#" PRIx64
")"
1796 " too big or no string sections available\n"), offset
);
1797 return _("<offset is too big>");
1801 get_AT_name (unsigned long attribute
)
1806 return "DW_AT value: 0";
1808 /* One value is shared by the MIPS and HP extensions: */
1809 if (attribute
== DW_AT_MIPS_fde
)
1810 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1812 name
= get_DW_AT_name (attribute
);
1816 static char buffer
[100];
1818 snprintf (buffer
, sizeof (buffer
), _("Unknown AT value: %lx"),
1827 add_dwo_info (const char * value
, uint64_t cu_offset
, dwo_type type
)
1829 dwo_info
* dwinfo
= xmalloc (sizeof * dwinfo
);
1831 dwinfo
->type
= type
;
1832 dwinfo
->value
= value
;
1833 dwinfo
->cu_offset
= cu_offset
;
1834 dwinfo
->next
= first_dwo_info
;
1835 first_dwo_info
= dwinfo
;
1839 add_dwo_name (const char * name
, uint64_t cu_offset
)
1841 add_dwo_info (name
, cu_offset
, DWO_NAME
);
1845 add_dwo_dir (const char * dir
, uint64_t cu_offset
)
1847 add_dwo_info (dir
, cu_offset
, DWO_DIR
);
1851 add_dwo_id (const char * id
, uint64_t cu_offset
)
1853 add_dwo_info (id
, cu_offset
, DWO_ID
);
1857 free_dwo_info (void)
1862 for (dwinfo
= first_dwo_info
; dwinfo
!= NULL
; dwinfo
= next
)
1864 next
= dwinfo
->next
;
1867 first_dwo_info
= NULL
;
1870 /* Ensure that START + UVALUE is less than END.
1871 Return an adjusted UVALUE if necessary to ensure this relationship. */
1873 static inline uint64_t
1874 check_uvalue (const unsigned char *start
,
1876 const unsigned char *end
)
1878 uint64_t max_uvalue
= end
- start
;
1880 /* See PR 17512: file: 008-103549-0.001:0.1.
1881 and PR 24829 for examples of where these tests are triggered. */
1882 if (uvalue
> max_uvalue
)
1884 warn (_("Corrupt attribute block length: %#" PRIx64
"\n"), uvalue
);
1885 uvalue
= max_uvalue
;
1891 static unsigned char *
1892 skip_attr_bytes (unsigned long form
,
1893 unsigned char *data
,
1895 uint64_t pointer_size
,
1896 uint64_t offset_size
,
1898 uint64_t *value_return
)
1901 uint64_t uvalue
= 0;
1908 case DW_FORM_ref_addr
:
1909 if (dwarf_version
== 2)
1910 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1911 else if (dwarf_version
> 2)
1912 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
1918 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
1922 case DW_FORM_line_strp
:
1923 case DW_FORM_sec_offset
:
1924 case DW_FORM_GNU_ref_alt
:
1925 case DW_FORM_GNU_strp_alt
:
1926 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
1929 case DW_FORM_flag_present
:
1937 case DW_FORM_addrx1
:
1938 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
1942 case DW_FORM_addrx3
:
1943 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 3, end
);
1949 case DW_FORM_addrx2
:
1950 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 2, end
);
1956 case DW_FORM_addrx4
:
1957 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
1961 READ_SLEB (svalue
, data
, end
);
1965 case DW_FORM_ref_udata
:
1967 case DW_FORM_GNU_str_index
:
1969 case DW_FORM_GNU_addr_index
:
1971 case DW_FORM_loclistx
:
1972 case DW_FORM_rnglistx
:
1973 READ_ULEB (uvalue
, data
, end
);
1977 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 8, end
);
1981 case DW_FORM_ref_sig8
:
1985 case DW_FORM_data16
:
1989 case DW_FORM_string
:
1990 inc
= strnlen ((char *) data
, end
- data
) + 1;
1994 case DW_FORM_exprloc
:
1995 READ_ULEB (uvalue
, data
, end
);
1999 case DW_FORM_block1
:
2000 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
2004 case DW_FORM_block2
:
2005 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 2, end
);
2009 case DW_FORM_block4
:
2010 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
2014 case DW_FORM_indirect
:
2015 READ_ULEB (form
, data
, end
);
2016 if (form
== DW_FORM_implicit_const
)
2017 SKIP_ULEB (data
, end
);
2018 return skip_attr_bytes (form
, data
, end
, pointer_size
, offset_size
,
2019 dwarf_version
, value_return
);
2025 * value_return
= uvalue
;
2026 if (inc
<= (size_t) (end
- data
))
2033 /* Given form FORM with value UVALUE, locate and return the abbreviation
2034 associated with it. */
2036 static abbrev_entry
*
2037 get_type_abbrev_from_form (unsigned long form
,
2038 unsigned long uvalue
,
2040 unsigned char *cu_end
,
2041 const struct dwarf_section
*section
,
2042 unsigned long *abbrev_num_return
,
2043 unsigned char **data_return
,
2044 abbrev_map
**map_return
)
2046 unsigned long abbrev_number
;
2048 abbrev_entry
* entry
;
2049 unsigned char * data
;
2051 if (abbrev_num_return
!= NULL
)
2052 * abbrev_num_return
= 0;
2053 if (data_return
!= NULL
)
2054 * data_return
= NULL
;
2058 case DW_FORM_GNU_ref_alt
:
2059 case DW_FORM_ref_sig8
:
2060 /* FIXME: We are unable to handle this form at the moment. */
2063 case DW_FORM_ref_addr
:
2064 if (uvalue
>= section
->size
)
2066 warn (_("Unable to resolve ref_addr form: uvalue %lx "
2067 "> section size %" PRIx64
" (%s)\n"),
2068 uvalue
, section
->size
, section
->name
);
2073 case DW_FORM_ref_sup4
:
2074 case DW_FORM_ref_sup8
:
2081 case DW_FORM_ref_udata
:
2082 if (uvalue
+ cu_offset
< uvalue
2083 || uvalue
+ cu_offset
> (size_t) (cu_end
- section
->start
))
2085 warn (_("Unable to resolve ref form: uvalue %lx + cu_offset %" PRIx64
2086 " > CU size %tx\n"),
2087 uvalue
, cu_offset
, cu_end
- section
->start
);
2090 uvalue
+= cu_offset
;
2093 /* FIXME: Are there other DW_FORMs that can be used by types ? */
2096 warn (_("Unexpected form %lx encountered whilst finding abbreviation for type\n"), form
);
2100 data
= (unsigned char *) section
->start
+ uvalue
;
2101 map
= find_abbrev_map_by_offset (uvalue
);
2105 warn (_("Unable to find abbreviations for CU offset %#lx\n"), uvalue
);
2108 if (map
->list
== NULL
)
2110 warn (_("Empty abbreviation list encountered for CU offset %lx\n"), uvalue
);
2114 if (map_return
!= NULL
)
2116 if (form
== DW_FORM_ref_addr
)
2122 READ_ULEB (abbrev_number
, data
, section
->start
+ section
->size
);
2124 for (entry
= map
->list
->first_abbrev
; entry
!= NULL
; entry
= entry
->next
)
2125 if (entry
->number
== abbrev_number
)
2128 if (abbrev_num_return
!= NULL
)
2129 * abbrev_num_return
= abbrev_number
;
2131 if (data_return
!= NULL
)
2132 * data_return
= data
;
2135 warn (_("Unable to find entry for abbreviation %lu\n"), abbrev_number
);
2140 /* Return IS_SIGNED set to TRUE if the type using abbreviation ENTRY
2141 can be determined to be a signed type. The data for ENTRY can be
2142 found starting at DATA. */
2145 get_type_signedness (abbrev_entry
*entry
,
2146 const struct dwarf_section
*section
,
2147 unsigned char *data
,
2150 uint64_t pointer_size
,
2151 uint64_t offset_size
,
2154 unsigned int nesting
)
2158 * is_signed
= false;
2160 #define MAX_NESTING 20
2161 if (nesting
> MAX_NESTING
)
2163 /* FIXME: Warn - or is this expected ?
2164 NB/ We need to avoid infinite recursion. */
2168 for (attr
= entry
->first_attr
;
2169 attr
!= NULL
&& attr
->attribute
;
2172 unsigned char * orig_data
= data
;
2173 uint64_t uvalue
= 0;
2175 data
= skip_attr_bytes (attr
->form
, data
, end
, pointer_size
,
2176 offset_size
, dwarf_version
, & uvalue
);
2180 switch (attr
->attribute
)
2182 case DW_AT_linkage_name
:
2186 if (attr
->form
== DW_FORM_strp
)
2187 printf (", %s", fetch_indirect_string (uvalue
));
2188 else if (attr
->form
== DW_FORM_string
)
2189 printf (", %.*s", (int) (end
- orig_data
), orig_data
);
2196 abbrev_entry
*type_abbrev
;
2197 unsigned char *type_data
;
2200 type_abbrev
= get_type_abbrev_from_form (attr
->form
,
2205 NULL
/* abbrev num return */,
2208 if (type_abbrev
== NULL
)
2211 get_type_signedness (type_abbrev
, section
, type_data
,
2212 map
? section
->start
+ map
->end
: end
,
2213 map
? map
->start
: cu_offset
,
2214 pointer_size
, offset_size
, dwarf_version
,
2215 is_signed
, nesting
+ 1);
2219 case DW_AT_encoding
:
2220 /* Determine signness. */
2223 case DW_ATE_address
:
2224 /* FIXME - some architectures have signed addresses. */
2225 case DW_ATE_boolean
:
2226 case DW_ATE_unsigned
:
2227 case DW_ATE_unsigned_char
:
2228 case DW_ATE_unsigned_fixed
:
2229 * is_signed
= false;
2233 case DW_ATE_complex_float
:
2236 case DW_ATE_signed_char
:
2237 case DW_ATE_imaginary_float
:
2238 case DW_ATE_decimal_float
:
2239 case DW_ATE_signed_fixed
:
2249 read_and_print_leb128 (unsigned char *data
,
2250 unsigned int *bytes_read
,
2251 unsigned const char *end
,
2255 uint64_t val
= read_leb128 (data
, end
, is_signed
, bytes_read
, &status
);
2257 report_leb_status (status
);
2259 printf ("%" PRId64
, val
);
2261 printf ("%" PRIu64
, val
);
2265 display_discr_list (unsigned long form
,
2267 unsigned char *data
,
2270 unsigned char *end
= data
;
2274 printf ("[default]");
2281 case DW_FORM_block1
:
2282 case DW_FORM_block2
:
2283 case DW_FORM_block4
:
2284 /* Move data pointer back to the start of the byte array. */
2288 printf ("<corrupt>\n");
2289 warn (_("corrupt discr_list - not using a block form\n"));
2295 printf ("<corrupt>\n");
2296 warn (_("corrupt discr_list - block not long enough\n"));
2300 bool is_signed
= (level
> 0 && level
<= MAX_CU_NESTING
2301 ? level_type_signed
[level
- 1] : false);
2306 unsigned char discriminant
;
2307 unsigned int bytes_read
;
2309 SAFE_BYTE_GET_AND_INC (discriminant
, data
, 1, end
);
2311 switch (discriminant
)
2315 read_and_print_leb128 (data
, & bytes_read
, end
, is_signed
);
2321 read_and_print_leb128 (data
, & bytes_read
, end
, is_signed
);
2325 read_and_print_leb128 (data
, & bytes_read
, end
, is_signed
);
2330 printf ("<corrupt>\n");
2331 warn (_("corrupt discr_list - unrecognized discriminant byte %#x\n"),
2341 printf (")(signed)");
2343 printf (")(unsigned)");
2347 display_lang (uint64_t uvalue
)
2351 /* Ordered by the numeric value of these constants. */
2352 case DW_LANG_C89
: printf ("ANSI C"); break;
2353 case DW_LANG_C
: printf ("non-ANSI C"); break;
2354 case DW_LANG_Ada83
: printf ("Ada"); break;
2355 case DW_LANG_C_plus_plus
: printf ("C++"); break;
2356 case DW_LANG_Cobol74
: printf ("Cobol 74"); break;
2357 case DW_LANG_Cobol85
: printf ("Cobol 85"); break;
2358 case DW_LANG_Fortran77
: printf ("FORTRAN 77"); break;
2359 case DW_LANG_Fortran90
: printf ("Fortran 90"); break;
2360 case DW_LANG_Pascal83
: printf ("ANSI Pascal"); break;
2361 case DW_LANG_Modula2
: printf ("Modula 2"); break;
2363 /* DWARF 2.1 values. */
2364 case DW_LANG_Java
: printf ("Java"); break;
2365 case DW_LANG_C99
: printf ("ANSI C99"); break;
2366 case DW_LANG_Ada95
: printf ("ADA 95"); break;
2367 case DW_LANG_Fortran95
: printf ("Fortran 95"); break;
2369 /* DWARF 3 values. */
2370 case DW_LANG_PLI
: printf ("PLI"); break;
2371 case DW_LANG_ObjC
: printf ("Objective C"); break;
2372 case DW_LANG_ObjC_plus_plus
: printf ("Objective C++"); break;
2373 case DW_LANG_UPC
: printf ("Unified Parallel C"); break;
2374 case DW_LANG_D
: printf ("D"); break;
2376 /* DWARF 4 values. */
2377 case DW_LANG_Python
: printf ("Python"); break;
2379 /* DWARF 5 values. */
2380 case DW_LANG_OpenCL
: printf ("OpenCL"); break;
2381 case DW_LANG_Go
: printf ("Go"); break;
2382 case DW_LANG_Modula3
: printf ("Modula 3"); break;
2383 case DW_LANG_Haskell
: printf ("Haskell"); break;
2384 case DW_LANG_C_plus_plus_03
: printf ("C++03"); break;
2385 case DW_LANG_C_plus_plus_11
: printf ("C++11"); break;
2386 case DW_LANG_OCaml
: printf ("OCaml"); break;
2387 case DW_LANG_Rust
: printf ("Rust"); break;
2388 case DW_LANG_C11
: printf ("C11"); break;
2389 case DW_LANG_Swift
: printf ("Swift"); break;
2390 case DW_LANG_Julia
: printf ("Julia"); break;
2391 case DW_LANG_Dylan
: printf ("Dylan"); break;
2392 case DW_LANG_C_plus_plus_14
: printf ("C++14"); break;
2393 case DW_LANG_Fortran03
: printf ("Fortran 03"); break;
2394 case DW_LANG_Fortran08
: printf ("Fortran 08"); break;
2395 case DW_LANG_RenderScript
: printf ("RenderScript"); break;
2397 /* MIPS extension. */
2398 case DW_LANG_Mips_Assembler
: printf ("MIPS assembler"); break;
2400 /* UPC extension. */
2401 case DW_LANG_Upc
: printf ("Unified Parallel C"); break;
2404 if (uvalue
>= DW_LANG_lo_user
&& uvalue
<= DW_LANG_hi_user
)
2405 printf (_("implementation defined: %#" PRIx64
""), uvalue
);
2407 printf (_("unknown: %#" PRIx64
""), uvalue
);
2412 static unsigned char *
2413 read_and_display_attr_value (unsigned long attribute
,
2415 int64_t implicit_const
,
2416 unsigned char *start
,
2417 unsigned char *data
,
2420 uint64_t pointer_size
,
2421 uint64_t offset_size
,
2423 debug_info
*debug_info_p
,
2425 struct dwarf_section
*section
,
2426 struct cu_tu_set
*this_set
,
2431 uint64_t uvalue
= 0;
2432 uint64_t uvalue_hi
= 0;
2433 unsigned char *block_start
= NULL
;
2434 unsigned char *orig_data
= data
;
2436 if (data
> end
|| (data
== end
&& form
!= DW_FORM_flag_present
))
2438 warn (_("Corrupt attribute\n"));
2442 if (do_wide
&& ! do_loc
)
2444 /* PR 26847: Display the name of the form. */
2445 const char * name
= get_FORM_name (form
);
2447 /* For convenience we skip the DW_FORM_ prefix to the name. */
2449 name
+= 8; /* strlen ("DW_FORM_") */
2450 printf ("%c(%s)", delimiter
, name
);
2455 case DW_FORM_ref_addr
:
2456 if (dwarf_version
== 2)
2457 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
2458 else if (dwarf_version
> 2)
2459 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
2461 error (_("Internal error: DW_FORM_ref_addr is not supported in DWARF version 1.\n"));
2465 SAFE_BYTE_GET_AND_INC (uvalue
, data
, pointer_size
, end
);
2468 case DW_FORM_strp_sup
:
2470 case DW_FORM_line_strp
:
2471 case DW_FORM_sec_offset
:
2472 case DW_FORM_GNU_ref_alt
:
2473 case DW_FORM_GNU_strp_alt
:
2474 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
2477 case DW_FORM_flag_present
:
2485 case DW_FORM_addrx1
:
2486 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
2492 case DW_FORM_addrx2
:
2493 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 2, end
);
2497 case DW_FORM_addrx3
:
2498 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 3, end
);
2501 case DW_FORM_ref_sup4
:
2505 case DW_FORM_addrx4
:
2506 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
2509 case DW_FORM_ref_sup8
:
2512 case DW_FORM_ref_sig8
:
2513 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 8, end
);
2516 case DW_FORM_data16
:
2517 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 8, end
);
2518 SAFE_BYTE_GET_AND_INC (uvalue_hi
, data
, 8, end
);
2519 if (byte_get
!= byte_get_little_endian
)
2521 uint64_t utmp
= uvalue
;
2528 READ_SLEB (svalue
, data
, end
);
2532 case DW_FORM_GNU_str_index
:
2534 case DW_FORM_ref_udata
:
2536 case DW_FORM_GNU_addr_index
:
2538 case DW_FORM_loclistx
:
2539 case DW_FORM_rnglistx
:
2540 READ_ULEB (uvalue
, data
, end
);
2543 case DW_FORM_indirect
:
2544 READ_ULEB (form
, data
, end
);
2546 printf ("%c%s", delimiter
, get_FORM_name (form
));
2547 if (form
== DW_FORM_implicit_const
)
2548 READ_SLEB (implicit_const
, data
, end
);
2549 return read_and_display_attr_value (attribute
, form
, implicit_const
,
2551 cu_offset
, pointer_size
,
2552 offset_size
, dwarf_version
,
2553 debug_info_p
, do_loc
,
2554 section
, this_set
, delimiter
, level
);
2556 case DW_FORM_implicit_const
:
2557 uvalue
= implicit_const
;
2566 case DW_FORM_ref_addr
:
2568 printf ("%c<%#" PRIx64
">", delimiter
, uvalue
);
2571 case DW_FORM_GNU_ref_alt
:
2575 /* We have already printed the form name. */
2576 printf ("%c<%#" PRIx64
">", delimiter
, uvalue
);
2578 printf ("%c<alt %#" PRIx64
">", delimiter
, uvalue
);
2580 /* FIXME: Follow the reference... */
2586 case DW_FORM_ref_sup4
:
2587 case DW_FORM_ref_udata
:
2589 printf ("%c<%#" PRIx64
">", delimiter
, uvalue
+ cu_offset
);
2594 case DW_FORM_sec_offset
:
2596 printf ("%c%#" PRIx64
, delimiter
, uvalue
);
2599 case DW_FORM_flag_present
:
2605 printf ("%c%" PRId64
, delimiter
, uvalue
);
2610 printf ("%c%" PRIu64
, delimiter
, uvalue
);
2613 case DW_FORM_implicit_const
:
2615 printf ("%c%" PRId64
, delimiter
, implicit_const
);
2618 case DW_FORM_ref_sup8
:
2623 uint64_t utmp
= uvalue
;
2624 if (form
== DW_FORM_ref8
)
2626 printf ("%c%#" PRIx64
, delimiter
, utmp
);
2630 case DW_FORM_data16
:
2634 printf (" %#" PRIx64
, uvalue
);
2636 printf (" %#" PRIx64
"%016" PRIx64
, uvalue_hi
, uvalue
);
2640 case DW_FORM_string
:
2642 printf ("%c%.*s", delimiter
, (int) (end
- data
), data
);
2643 data
+= strnlen ((char *) data
, end
- data
);
2649 case DW_FORM_exprloc
:
2650 READ_ULEB (uvalue
, data
, end
);
2653 if (block_start
>= end
)
2655 warn (_("Block ends prematurely\n"));
2660 uvalue
= check_uvalue (block_start
, uvalue
, end
);
2662 data
= block_start
+ uvalue
;
2667 SAFE_BYTE_GET (op
, block_start
, sizeof (op
), end
);
2668 if (op
!= DW_OP_addrx
)
2669 data
= display_block (block_start
, uvalue
, end
, delimiter
);
2673 case DW_FORM_block1
:
2674 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 1, end
);
2677 case DW_FORM_block2
:
2678 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 2, end
);
2681 case DW_FORM_block4
:
2682 SAFE_BYTE_GET_AND_INC (uvalue
, data
, 4, end
);
2689 /* We have already displayed the form name. */
2690 printf (_("%c(offset: %#" PRIx64
"): %s"),
2691 delimiter
, uvalue
, fetch_indirect_string (uvalue
));
2693 printf (_("%c(indirect string, offset: %#" PRIx64
"): %s"),
2694 delimiter
, uvalue
, fetch_indirect_string (uvalue
));
2698 case DW_FORM_line_strp
:
2702 /* We have already displayed the form name. */
2703 printf (_("%c(offset: %#" PRIx64
"): %s"),
2704 delimiter
, uvalue
, fetch_indirect_line_string (uvalue
));
2706 printf (_("%c(indirect line string, offset: %#" PRIx64
"): %s"),
2707 delimiter
, uvalue
, fetch_indirect_line_string (uvalue
));
2711 case DW_FORM_GNU_str_index
:
2719 const char *suffix
= section
? strrchr (section
->name
, '.') : NULL
;
2720 bool dwo
= suffix
&& strcmp (suffix
, ".dwo") == 0;
2723 strng
= fetch_indexed_string (uvalue
, this_set
, offset_size
, dwo
,
2724 debug_info_p
? debug_info_p
->str_offsets_base
: 0);
2726 /* We have already displayed the form name. */
2727 printf (_("%c(offset: %#" PRIx64
"): %s"),
2728 delimiter
, uvalue
, strng
);
2730 printf (_("%c(indexed string: %#" PRIx64
"): %s"),
2731 delimiter
, uvalue
, strng
);
2735 case DW_FORM_GNU_strp_alt
:
2739 /* We have already displayed the form name. */
2740 printf (_("%c(offset: %#" PRIx64
") %s"),
2741 delimiter
, uvalue
, fetch_alt_indirect_string (uvalue
));
2743 printf (_("%c(alt indirect string, offset: %#" PRIx64
") %s"),
2744 delimiter
, uvalue
, fetch_alt_indirect_string (uvalue
));
2748 case DW_FORM_indirect
:
2749 /* Handled above. */
2752 case DW_FORM_ref_sig8
:
2754 printf ("%c%s: %#" PRIx64
, delimiter
, do_wide
? "" : "signature",
2758 case DW_FORM_GNU_addr_index
:
2760 case DW_FORM_addrx1
:
2761 case DW_FORM_addrx2
:
2762 case DW_FORM_addrx3
:
2763 case DW_FORM_addrx4
:
2764 case DW_FORM_loclistx
:
2765 case DW_FORM_rnglistx
:
2769 const char *suffix
= strrchr (section
->name
, '.');
2770 bool dwo
= suffix
&& strcmp (suffix
, ".dwo") == 0;
2772 if (form
== DW_FORM_loclistx
)
2774 if (debug_info_p
== NULL
)
2778 idx
= fetch_indexed_offset (uvalue
, loclists_dwo
,
2779 debug_info_p
->loclists_base
,
2780 debug_info_p
->offset_size
);
2781 if (idx
!= (uint64_t) -1)
2782 idx
+= (offset_size
== 8) ? 20 : 12;
2784 else if (dwarf_version
> 4)
2786 idx
= fetch_indexed_offset (uvalue
, loclists
,
2787 debug_info_p
->loclists_base
,
2788 debug_info_p
->offset_size
);
2792 /* We want to compute:
2793 idx = fetch_indexed_value (uvalue, loclists,
2794 debug_info_p->loclists_base);
2795 idx += debug_info_p->loclists_base;
2796 Fortunately we already have that sum cached in the
2797 loc_offsets array. */
2798 if (uvalue
< debug_info_p
->num_loc_offsets
)
2799 idx
= debug_info_p
->loc_offsets
[uvalue
];
2802 warn (_("loc_offset %" PRIu64
" too big\n"), uvalue
);
2807 else if (form
== DW_FORM_rnglistx
)
2809 if (debug_info_p
== NULL
)
2812 idx
= fetch_indexed_offset (uvalue
,
2813 dwo
? rnglists_dwo
: rnglists
,
2814 debug_info_p
->rnglists_base
,
2815 debug_info_p
->offset_size
);
2819 if (debug_info_p
== NULL
)
2821 else if (debug_info_p
->addr_base
== DEBUG_INFO_UNAVAILABLE
)
2824 base
= debug_info_p
->addr_base
;
2826 base
+= uvalue
* pointer_size
;
2827 idx
= fetch_indexed_addr (base
, pointer_size
);
2830 /* We have already displayed the form name. */
2831 if (idx
!= (uint64_t) -1)
2832 printf (_("%c(index: %#" PRIx64
"): %#" PRIx64
),
2833 delimiter
, uvalue
, idx
);
2837 case DW_FORM_strp_sup
:
2839 printf ("%c<%#" PRIx64
">", delimiter
, uvalue
+ cu_offset
);
2843 warn (_("Unrecognized form: %#lx"), form
);
2844 /* What to do? Consume a byte maybe? */
2849 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
|| do_debug_info
)
2850 && num_debug_info_entries
== 0
2851 && debug_info_p
!= NULL
)
2855 case DW_AT_loclists_base
:
2856 if (debug_info_p
->loclists_base
)
2857 warn (_("CU @ %#" PRIx64
" has multiple loclists_base values "
2858 "(%#" PRIx64
" and %#" PRIx64
")"),
2859 debug_info_p
->cu_offset
,
2860 debug_info_p
->loclists_base
, uvalue
);
2864 warn (_("CU @ %#" PRIx64
" has has a negative loclists_base "
2865 "value of %#" PRIx64
" - treating as zero"),
2866 debug_info_p
->cu_offset
, svalue
);
2869 debug_info_p
->loclists_base
= uvalue
;
2872 case DW_AT_rnglists_base
:
2873 /* Assignment to debug_info_p->rnglists_base is now elsewhere. */
2876 case DW_AT_str_offsets_base
:
2877 if (debug_info_p
->str_offsets_base
)
2878 warn (_("CU @ %#" PRIx64
" has multiple str_offsets_base values "
2879 "%#" PRIx64
" and %#" PRIx64
")"),
2880 debug_info_p
->cu_offset
,
2881 debug_info_p
->str_offsets_base
, uvalue
);
2885 warn (_("CU @ %#" PRIx64
" has has a negative stroffsets_base "
2886 "value of %#" PRIx64
" - treating as zero"),
2887 debug_info_p
->cu_offset
, svalue
);
2890 debug_info_p
->str_offsets_base
= uvalue
;
2893 case DW_AT_frame_base
:
2894 /* This is crude; the have_frame_base is reset on the next
2895 subprogram, not at the end of the current topmost one. */
2896 have_frame_base
= 1;
2897 frame_base_level
= level
;
2899 case DW_AT_location
:
2900 case DW_AT_GNU_locviews
:
2901 case DW_AT_string_length
:
2902 case DW_AT_return_addr
:
2903 case DW_AT_data_member_location
:
2904 case DW_AT_vtable_elem_location
:
2906 case DW_AT_static_link
:
2907 case DW_AT_use_location
:
2908 case DW_AT_call_value
:
2909 case DW_AT_GNU_call_site_value
:
2910 case DW_AT_call_data_value
:
2911 case DW_AT_GNU_call_site_data_value
:
2912 case DW_AT_call_target
:
2913 case DW_AT_GNU_call_site_target
:
2914 case DW_AT_call_target_clobbered
:
2915 case DW_AT_GNU_call_site_target_clobbered
:
2916 if ((dwarf_version
< 4
2917 && (form
== DW_FORM_data4
|| form
== DW_FORM_data8
))
2918 || form
== DW_FORM_sec_offset
2919 || form
== DW_FORM_loclistx
)
2921 /* Process location list. */
2922 unsigned int lmax
= debug_info_p
->max_loc_offsets
;
2923 unsigned int num
= debug_info_p
->num_loc_offsets
;
2925 if (lmax
== 0 || num
>= lmax
)
2928 debug_info_p
->loc_offsets
= (uint64_t *)
2929 xcrealloc (debug_info_p
->loc_offsets
,
2930 lmax
, sizeof (*debug_info_p
->loc_offsets
));
2931 debug_info_p
->loc_views
= (uint64_t *)
2932 xcrealloc (debug_info_p
->loc_views
,
2933 lmax
, sizeof (*debug_info_p
->loc_views
));
2934 debug_info_p
->have_frame_base
= (int *)
2935 xcrealloc (debug_info_p
->have_frame_base
,
2936 lmax
, sizeof (*debug_info_p
->have_frame_base
));
2937 debug_info_p
->max_loc_offsets
= lmax
;
2939 if (form
== DW_FORM_loclistx
)
2940 uvalue
= fetch_indexed_offset (num
, loclists
,
2941 debug_info_p
->loclists_base
,
2942 debug_info_p
->offset_size
);
2943 else if (this_set
!= NULL
)
2944 uvalue
+= this_set
->section_offsets
[DW_SECT_LOC
];
2946 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
2947 if (attribute
!= DW_AT_GNU_locviews
)
2949 /* Corrupt DWARF info can produce more offsets than views.
2950 See PR 23062 for an example. */
2951 if (debug_info_p
->num_loc_offsets
2952 > debug_info_p
->num_loc_views
)
2953 warn (_("More location offset attributes than DW_AT_GNU_locview attributes\n"));
2956 debug_info_p
->loc_offsets
[num
] = uvalue
;
2957 debug_info_p
->num_loc_offsets
++;
2962 if (debug_info_p
->num_loc_views
> num
)
2964 warn (_("The number of views (%u) is greater than the number of locations (%u)\n"),
2965 debug_info_p
->num_loc_views
, num
);
2966 debug_info_p
->num_loc_views
= num
;
2969 num
= debug_info_p
->num_loc_views
;
2970 if (num
> debug_info_p
->num_loc_offsets
)
2971 warn (_("More DW_AT_GNU_locview attributes than location offset attributes\n"));
2974 debug_info_p
->loc_views
[num
] = uvalue
;
2975 debug_info_p
->num_loc_views
++;
2982 if (need_base_address
)
2984 if (form
== DW_FORM_addrx
)
2985 uvalue
= fetch_indexed_addr (debug_info_p
->addr_base
2986 + uvalue
* pointer_size
,
2989 debug_info_p
->base_address
= uvalue
;
2993 case DW_AT_GNU_addr_base
:
2994 case DW_AT_addr_base
:
2995 debug_info_p
->addr_base
= uvalue
;
2996 /* Retrieved elsewhere so that it is in
2997 place by the time we read low_pc. */
3000 case DW_AT_GNU_ranges_base
:
3001 debug_info_p
->ranges_base
= uvalue
;
3005 if ((dwarf_version
< 4
3006 && (form
== DW_FORM_data4
|| form
== DW_FORM_data8
))
3007 || form
== DW_FORM_sec_offset
3008 || form
== DW_FORM_rnglistx
)
3010 /* Process range list. */
3011 unsigned int lmax
= debug_info_p
->max_range_lists
;
3012 unsigned int num
= debug_info_p
->num_range_lists
;
3014 if (lmax
== 0 || num
>= lmax
)
3017 debug_info_p
->range_lists
= (uint64_t *)
3018 xcrealloc (debug_info_p
->range_lists
,
3019 lmax
, sizeof (*debug_info_p
->range_lists
));
3020 debug_info_p
->max_range_lists
= lmax
;
3023 if (form
== DW_FORM_rnglistx
)
3024 uvalue
= fetch_indexed_offset (uvalue
, rnglists
,
3025 debug_info_p
->rnglists_base
,
3026 debug_info_p
->offset_size
);
3028 debug_info_p
->range_lists
[num
] = uvalue
;
3029 debug_info_p
->num_range_lists
++;
3033 case DW_AT_GNU_dwo_name
:
3034 case DW_AT_dwo_name
:
3039 add_dwo_name ((const char *) fetch_indirect_string (uvalue
),
3042 case DW_FORM_GNU_strp_alt
:
3043 add_dwo_name ((const char *) fetch_alt_indirect_string (uvalue
), cu_offset
);
3045 case DW_FORM_GNU_str_index
:
3051 add_dwo_name (fetch_indexed_string (uvalue
, this_set
,
3053 debug_info_p
->str_offsets_base
),
3056 case DW_FORM_string
:
3057 add_dwo_name ((const char *) orig_data
, cu_offset
);
3060 warn (_("Unsupported form (%s) for attribute %s\n"),
3061 get_FORM_name (form
), get_AT_name (attribute
));
3066 case DW_AT_comp_dir
:
3067 /* FIXME: Also extract a build-id in a CU/TU. */
3072 add_dwo_dir ((const char *) fetch_indirect_string (uvalue
), cu_offset
);
3074 case DW_FORM_GNU_strp_alt
:
3075 add_dwo_dir (fetch_alt_indirect_string (uvalue
), cu_offset
);
3077 case DW_FORM_line_strp
:
3078 add_dwo_dir ((const char *) fetch_indirect_line_string (uvalue
), cu_offset
);
3080 case DW_FORM_GNU_str_index
:
3086 add_dwo_dir (fetch_indexed_string (uvalue
, this_set
, offset_size
, false,
3087 debug_info_p
->str_offsets_base
),
3090 case DW_FORM_string
:
3091 add_dwo_dir ((const char *) orig_data
, cu_offset
);
3094 warn (_("Unsupported form (%s) for attribute %s\n"),
3095 get_FORM_name (form
), get_AT_name (attribute
));
3100 case DW_AT_GNU_dwo_id
:
3105 /* FIXME: Record the length of the ID as well ? */
3106 add_dwo_id ((const char *) (data
- 8), cu_offset
);
3109 warn (_("Unsupported form (%s) for attribute %s\n"),
3110 get_FORM_name (form
), get_AT_name (attribute
));
3120 if (do_loc
|| attribute
== 0)
3123 /* For some attributes we can display further information. */
3127 if (level
>= 0 && level
< MAX_CU_NESTING
3128 && uvalue
< (size_t) (end
- start
))
3130 bool is_signed
= false;
3131 abbrev_entry
*type_abbrev
;
3132 unsigned char *type_data
;
3135 type_abbrev
= get_type_abbrev_from_form (form
, uvalue
,
3139 if (type_abbrev
!= NULL
)
3141 get_type_signedness (type_abbrev
, section
, type_data
,
3142 map
? section
->start
+ map
->end
: end
,
3143 map
? map
->start
: cu_offset
,
3144 pointer_size
, offset_size
, dwarf_version
,
3147 level_type_signed
[level
] = is_signed
;
3155 case DW_INL_not_inlined
:
3156 printf (_("(not inlined)"));
3158 case DW_INL_inlined
:
3159 printf (_("(inlined)"));
3161 case DW_INL_declared_not_inlined
:
3162 printf (_("(declared as inline but ignored)"));
3164 case DW_INL_declared_inlined
:
3165 printf (_("(declared as inline and inlined)"));
3168 printf (_(" (Unknown inline attribute value: %#" PRIx64
")"),
3174 case DW_AT_language
:
3176 display_lang (uvalue
);
3180 case DW_AT_encoding
:
3184 case DW_ATE_void
: printf ("(void)"); break;
3185 case DW_ATE_address
: printf ("(machine address)"); break;
3186 case DW_ATE_boolean
: printf ("(boolean)"); break;
3187 case DW_ATE_complex_float
: printf ("(complex float)"); break;
3188 case DW_ATE_float
: printf ("(float)"); break;
3189 case DW_ATE_signed
: printf ("(signed)"); break;
3190 case DW_ATE_signed_char
: printf ("(signed char)"); break;
3191 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
3192 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
3193 /* DWARF 2.1 values: */
3194 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
3195 case DW_ATE_decimal_float
: printf ("(decimal float)"); break;
3196 /* DWARF 3 values: */
3197 case DW_ATE_packed_decimal
: printf ("(packed_decimal)"); break;
3198 case DW_ATE_numeric_string
: printf ("(numeric_string)"); break;
3199 case DW_ATE_edited
: printf ("(edited)"); break;
3200 case DW_ATE_signed_fixed
: printf ("(signed_fixed)"); break;
3201 case DW_ATE_unsigned_fixed
: printf ("(unsigned_fixed)"); break;
3202 /* DWARF 4 values: */
3203 case DW_ATE_UTF
: printf ("(unicode string)"); break;
3204 /* DWARF 5 values: */
3205 case DW_ATE_UCS
: printf ("(UCS)"); break;
3206 case DW_ATE_ASCII
: printf ("(ASCII)"); break;
3208 /* HP extensions: */
3209 case DW_ATE_HP_float80
: printf ("(HP_float80)"); break;
3210 case DW_ATE_HP_complex_float80
: printf ("(HP_complex_float80)"); break;
3211 case DW_ATE_HP_float128
: printf ("(HP_float128)"); break;
3212 case DW_ATE_HP_complex_float128
:printf ("(HP_complex_float128)"); break;
3213 case DW_ATE_HP_floathpintel
: printf ("(HP_floathpintel)"); break;
3214 case DW_ATE_HP_imaginary_float80
: printf ("(HP_imaginary_float80)"); break;
3215 case DW_ATE_HP_imaginary_float128
: printf ("(HP_imaginary_float128)"); break;
3218 if (uvalue
>= DW_ATE_lo_user
3219 && uvalue
<= DW_ATE_hi_user
)
3220 printf (_("(user defined type)"));
3222 printf (_("(unknown type)"));
3227 case DW_AT_accessibility
:
3231 case DW_ACCESS_public
: printf ("(public)"); break;
3232 case DW_ACCESS_protected
: printf ("(protected)"); break;
3233 case DW_ACCESS_private
: printf ("(private)"); break;
3235 printf (_("(unknown accessibility)"));
3240 case DW_AT_visibility
:
3244 case DW_VIS_local
: printf ("(local)"); break;
3245 case DW_VIS_exported
: printf ("(exported)"); break;
3246 case DW_VIS_qualified
: printf ("(qualified)"); break;
3247 default: printf (_("(unknown visibility)")); break;
3251 case DW_AT_endianity
:
3255 case DW_END_default
: printf ("(default)"); break;
3256 case DW_END_big
: printf ("(big)"); break;
3257 case DW_END_little
: printf ("(little)"); break;
3259 if (uvalue
>= DW_END_lo_user
&& uvalue
<= DW_END_hi_user
)
3260 printf (_("(user specified)"));
3262 printf (_("(unknown endianity)"));
3267 case DW_AT_virtuality
:
3271 case DW_VIRTUALITY_none
: printf ("(none)"); break;
3272 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
3273 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
3274 default: printf (_("(unknown virtuality)")); break;
3278 case DW_AT_identifier_case
:
3282 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
3283 case DW_ID_up_case
: printf ("(up_case)"); break;
3284 case DW_ID_down_case
: printf ("(down_case)"); break;
3285 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
3286 default: printf (_("(unknown case)")); break;
3290 case DW_AT_calling_convention
:
3294 case DW_CC_normal
: printf ("(normal)"); break;
3295 case DW_CC_program
: printf ("(program)"); break;
3296 case DW_CC_nocall
: printf ("(nocall)"); break;
3297 case DW_CC_pass_by_reference
: printf ("(pass by ref)"); break;
3298 case DW_CC_pass_by_value
: printf ("(pass by value)"); break;
3299 case DW_CC_GNU_renesas_sh
: printf ("(Rensas SH)"); break;
3300 case DW_CC_GNU_borland_fastcall_i386
: printf ("(Borland fastcall i386)"); break;
3302 if (uvalue
>= DW_CC_lo_user
3303 && uvalue
<= DW_CC_hi_user
)
3304 printf (_("(user defined)"));
3306 printf (_("(unknown convention)"));
3310 case DW_AT_ordering
:
3315 case -1: printf (_("(undefined)")); break;
3316 case 0: printf ("(row major)"); break;
3317 case 1: printf ("(column major)"); break;
3321 case DW_AT_decimal_sign
:
3325 case DW_DS_unsigned
: printf (_("(unsigned)")); break;
3326 case DW_DS_leading_overpunch
: printf (_("(leading overpunch)")); break;
3327 case DW_DS_trailing_overpunch
: printf (_("(trailing overpunch)")); break;
3328 case DW_DS_leading_separate
: printf (_("(leading separate)")); break;
3329 case DW_DS_trailing_separate
: printf (_("(trailing separate)")); break;
3330 default: printf (_("(unrecognised)")); break;
3334 case DW_AT_defaulted
:
3338 case DW_DEFAULTED_no
: printf (_("(no)")); break;
3339 case DW_DEFAULTED_in_class
: printf (_("(in class)")); break;
3340 case DW_DEFAULTED_out_of_class
: printf (_("(out of class)")); break;
3341 default: printf (_("(unrecognised)")); break;
3345 case DW_AT_discr_list
:
3347 display_discr_list (form
, uvalue
, data
, level
);
3350 case DW_AT_frame_base
:
3351 have_frame_base
= 1;
3353 case DW_AT_location
:
3354 case DW_AT_loclists_base
:
3355 case DW_AT_rnglists_base
:
3356 case DW_AT_str_offsets_base
:
3357 case DW_AT_string_length
:
3358 case DW_AT_return_addr
:
3359 case DW_AT_data_member_location
:
3360 case DW_AT_vtable_elem_location
:
3362 case DW_AT_static_link
:
3363 case DW_AT_use_location
:
3364 case DW_AT_call_value
:
3365 case DW_AT_GNU_call_site_value
:
3366 case DW_AT_call_data_value
:
3367 case DW_AT_GNU_call_site_data_value
:
3368 case DW_AT_call_target
:
3369 case DW_AT_GNU_call_site_target
:
3370 case DW_AT_call_target_clobbered
:
3371 case DW_AT_GNU_call_site_target_clobbered
:
3372 if ((dwarf_version
< 4
3373 && (form
== DW_FORM_data4
|| form
== DW_FORM_data8
))
3374 || form
== DW_FORM_sec_offset
3375 || form
== DW_FORM_loclistx
)
3377 if (attribute
!= DW_AT_rnglists_base
3378 && attribute
!= DW_AT_str_offsets_base
)
3379 printf (_(" (location list)"));
3382 case DW_AT_allocated
:
3383 case DW_AT_associated
:
3384 case DW_AT_data_location
:
3386 case DW_AT_upper_bound
:
3387 case DW_AT_lower_bound
:
3391 int need_frame_base
;
3394 need_frame_base
= decode_location_expression (block_start
,
3399 cu_offset
, section
);
3401 if (need_frame_base
&& !have_frame_base
)
3402 printf (_(" [without DW_AT_frame_base]"));
3406 case DW_AT_data_bit_offset
:
3407 case DW_AT_byte_size
:
3408 case DW_AT_bit_size
:
3409 case DW_AT_string_length_byte_size
:
3410 case DW_AT_string_length_bit_size
:
3411 case DW_AT_bit_stride
:
3412 if (form
== DW_FORM_exprloc
)
3415 (void) decode_location_expression (block_start
, pointer_size
,
3416 offset_size
, dwarf_version
,
3417 uvalue
, cu_offset
, section
);
3424 unsigned long abbrev_number
;
3425 abbrev_entry
*entry
;
3427 entry
= get_type_abbrev_from_form (form
, uvalue
, cu_offset
, end
,
3428 section
, & abbrev_number
, NULL
, NULL
);
3431 if (form
!= DW_FORM_GNU_ref_alt
)
3432 warn (_("Offset %#" PRIx64
" used as value for DW_AT_import attribute of DIE at offset %#tx is too big.\n"),
3434 orig_data
- section
->start
);
3438 printf (_("\t[Abbrev Number: %ld"), abbrev_number
);
3439 printf (" (%s)", get_TAG_name (entry
->tag
));
3452 static unsigned char *
3453 read_and_display_attr (unsigned long attribute
,
3455 int64_t implicit_const
,
3456 unsigned char *start
,
3457 unsigned char *data
,
3460 uint64_t pointer_size
,
3461 uint64_t offset_size
,
3463 debug_info
*debug_info_p
,
3465 struct dwarf_section
*section
,
3466 struct cu_tu_set
*this_set
,
3470 printf (" %-18s:", get_AT_name (attribute
));
3471 data
= read_and_display_attr_value (attribute
, form
, implicit_const
,
3473 cu_offset
, pointer_size
, offset_size
,
3474 dwarf_version
, debug_info_p
,
3475 do_loc
, section
, this_set
, ' ', level
);
3481 /* Like load_debug_section, but if the ordinary call fails, and we are
3482 following debug links, then attempt to load the requested section
3483 from one of the separate debug info files. */
3486 load_debug_section_with_follow (enum dwarf_section_display_enum sec_enum
,
3489 if (load_debug_section (sec_enum
, handle
))
3491 if (debug_displays
[sec_enum
].section
.filename
== NULL
)
3493 /* See if we can associate a filename with this section. */
3496 for (i
= first_separate_info
; i
!= NULL
; i
= i
->next
)
3497 if (i
->handle
== handle
)
3499 debug_displays
[sec_enum
].section
.filename
= i
->filename
;
3507 if (do_follow_links
)
3511 for (i
= first_separate_info
; i
!= NULL
; i
= i
->next
)
3513 if (load_debug_section (sec_enum
, i
->handle
))
3515 debug_displays
[sec_enum
].section
.filename
= i
->filename
;
3517 /* FIXME: We should check to see if any of the remaining debug info
3518 files also contain this section, and, umm, do something about it. */
3528 introduce (struct dwarf_section
* section
, bool raw
)
3532 if (do_follow_links
&& section
->filename
)
3533 printf (_("Raw dump of debug contents of section %s (loaded from %s):\n\n"),
3534 section
->name
, section
->filename
);
3536 printf (_("Raw dump of debug contents of section %s:\n\n"), section
->name
);
3540 if (do_follow_links
&& section
->filename
)
3541 printf (_("Contents of the %s section (loaded from %s):\n\n"),
3542 section
->name
, section
->filename
);
3544 printf (_("Contents of the %s section:\n\n"), section
->name
);
3548 /* Free memory allocated for one unit in debug_information. */
3551 free_debug_information (debug_info
*ent
)
3553 if (ent
->max_loc_offsets
)
3555 free (ent
->loc_offsets
);
3556 free (ent
->loc_views
);
3557 free (ent
->have_frame_base
);
3559 if (ent
->max_range_lists
)
3561 free (ent
->range_lists
);
3565 /* For look-ahead in attributes. When you want to scan a DIE for one specific
3566 attribute and ignore the rest. */
3568 static unsigned char *
3569 skip_attribute (unsigned long form
,
3570 unsigned char * data
,
3571 unsigned char * end
,
3572 uint64_t pointer_size
,
3573 uint64_t offset_size
,
3581 case DW_FORM_ref_addr
:
3582 data
+= dwarf_version
== 2 ? pointer_size
: offset_size
;
3585 data
+= pointer_size
;
3587 case DW_FORM_strp_sup
:
3589 case DW_FORM_line_strp
:
3590 case DW_FORM_sec_offset
:
3591 case DW_FORM_GNU_ref_alt
:
3592 case DW_FORM_GNU_strp_alt
:
3593 data
+= offset_size
;
3599 case DW_FORM_addrx1
:
3605 case DW_FORM_addrx2
:
3609 case DW_FORM_addrx3
:
3612 case DW_FORM_ref_sup4
:
3616 case DW_FORM_addrx4
:
3619 case DW_FORM_ref_sup8
:
3622 case DW_FORM_ref_sig8
:
3625 case DW_FORM_data16
:
3629 READ_SLEB (stemp
, data
, end
);
3631 case DW_FORM_GNU_str_index
:
3633 case DW_FORM_ref_udata
:
3635 case DW_FORM_GNU_addr_index
:
3637 case DW_FORM_loclistx
:
3638 case DW_FORM_rnglistx
:
3639 READ_ULEB (temp
, data
, end
);
3642 case DW_FORM_indirect
:
3643 while (form
== DW_FORM_indirect
)
3644 READ_ULEB (form
, data
, end
);
3645 return skip_attribute (form
, data
, end
, pointer_size
, offset_size
, dwarf_version
);
3647 case DW_FORM_string
:
3648 data
+= strnlen ((char *) data
, end
- data
);
3651 case DW_FORM_exprloc
:
3652 READ_ULEB (temp
, data
, end
);
3655 case DW_FORM_block1
:
3656 SAFE_BYTE_GET_AND_INC (temp
, data
, 1, end
);
3659 case DW_FORM_block2
:
3660 SAFE_BYTE_GET_AND_INC (temp
, data
, 2, end
);
3663 case DW_FORM_block4
:
3664 SAFE_BYTE_GET_AND_INC (temp
, data
, 4, end
);
3667 case DW_FORM_implicit_const
:
3668 case DW_FORM_flag_present
:
3671 warn (_("Unexpected form in top DIE\n"));
3678 read_bases (abbrev_entry
* entry
,
3679 unsigned char * data
,
3680 unsigned char * end
,
3681 int64_t pointer_size
,
3682 uint64_t offset_size
,
3684 debug_info
* debug_info_p
)
3688 for (attr
= entry
->first_attr
;
3689 attr
&& attr
->attribute
;
3694 if (attr
->attribute
== DW_AT_rnglists_base
)
3696 if (attr
->form
== DW_FORM_sec_offset
)
3698 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
3699 debug_info_p
->rnglists_base
= uvalue
;
3702 warn (_("Unexpected form of DW_AT_rnglists_base in the top DIE\n"));
3704 else if (attr
->attribute
== DW_AT_addr_base
|| attr
->attribute
== DW_AT_GNU_addr_base
)
3706 if (attr
->form
== DW_FORM_sec_offset
)
3708 SAFE_BYTE_GET_AND_INC (uvalue
, data
, offset_size
, end
);
3709 debug_info_p
->addr_base
= uvalue
;
3712 warn (_("Unexpected form of DW_AT_addr_base in the top DIE\n"));
3715 data
= skip_attribute (attr
->form
, data
, end
, pointer_size
,
3716 offset_size
, dwarf_version
);
3720 /* Process the contents of a .debug_info section.
3721 If do_loc is TRUE then we are scanning for location lists and dwo tags
3722 and we do not want to display anything to the user.
3723 If do_types is TRUE, we are processing a .debug_types section instead of
3724 a .debug_info section.
3725 The information displayed is restricted by the values in DWARF_START_DIE
3726 and DWARF_CUTOFF_LEVEL.
3727 Returns TRUE upon success. Otherwise an error or warning message is
3728 printed and FALSE is returned. */
3731 process_debug_info (struct dwarf_section
* section
,
3733 enum dwarf_section_display_enum abbrev_sec
,
3737 unsigned char *start
= section
->start
;
3738 unsigned char *end
= start
+ section
->size
;
3739 unsigned char *section_begin
;
3741 unsigned int num_units
= 0;
3743 /* First scan the section to get the number of comp units.
3744 Length sanity checks are done here. */
3745 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
3750 /* Read the first 4 bytes. For a 32-bit DWARF section, this
3751 will be the length. For a 64-bit DWARF section, it'll be
3752 the escape code 0xffffffff followed by an 8 byte length. */
3753 SAFE_BYTE_GET_AND_INC (length
, section_begin
, 4, end
);
3755 if (length
== 0xffffffff)
3756 SAFE_BYTE_GET_AND_INC (length
, section_begin
, 8, end
);
3757 else if (length
>= 0xfffffff0 && length
< 0xffffffff)
3759 warn (_("Reserved length value (%#" PRIx64
") found in section %s\n"),
3760 length
, section
->name
);
3764 /* Negative values are illegal, they may even cause infinite
3765 looping. This can happen if we can't accurately apply
3766 relocations to an object file, or if the file is corrupt. */
3767 if (length
> (size_t) (end
- section_begin
))
3769 warn (_("Corrupt unit length (got %#" PRIx64
3770 " expected at most %#tx) in section %s\n"),
3771 length
, end
- section_begin
, section
->name
);
3774 section_begin
+= length
;
3779 error (_("No comp units in %s section ?\n"), section
->name
);
3783 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
|| do_debug_info
)
3784 && num_debug_info_entries
== 0
3788 /* Then allocate an array to hold the information. */
3789 debug_information
= (debug_info
*) cmalloc (num_units
,
3790 sizeof (* debug_information
));
3791 if (debug_information
== NULL
)
3793 error (_("Not enough memory for a debug info array of %u entries\n"),
3795 alloc_num_debug_info_entries
= num_debug_info_entries
= 0;
3799 /* PR 17531: file: 92ca3797.
3800 We cannot rely upon the debug_information array being initialised
3801 before it is used. A corrupt file could easily contain references
3802 to a unit for which information has not been made available. So
3803 we ensure that the array is zeroed here. */
3804 memset (debug_information
, 0, num_units
* sizeof (*debug_information
));
3806 alloc_num_debug_info_entries
= num_units
;
3811 load_debug_section_with_follow (str
, file
);
3812 load_debug_section_with_follow (line_str
, file
);
3813 load_debug_section_with_follow (str_dwo
, file
);
3814 load_debug_section_with_follow (str_index
, file
);
3815 load_debug_section_with_follow (str_index_dwo
, file
);
3816 load_debug_section_with_follow (debug_addr
, file
);
3819 load_debug_section_with_follow (abbrev_sec
, file
);
3820 load_debug_section_with_follow (loclists
, file
);
3821 load_debug_section_with_follow (rnglists
, file
);
3822 load_debug_section_with_follow (loclists_dwo
, file
);
3823 load_debug_section_with_follow (rnglists_dwo
, file
);
3825 if (debug_displays
[abbrev_sec
].section
.start
== NULL
)
3827 warn (_("Unable to locate %s section!\n"),
3828 debug_displays
[abbrev_sec
].section
.uncompressed_name
);
3832 if (!do_loc
&& dwarf_start_die
== 0)
3833 introduce (section
, false);
3835 free_all_abbrevs ();
3837 /* In order to be able to resolve DW_FORM_ref_addr forms we need
3838 to load *all* of the abbrevs for all CUs in this .debug_info
3839 section. This does effectively mean that we (partially) read
3840 every CU header twice. */
3841 for (section_begin
= start
; start
< end
;)
3843 DWARF2_Internal_CompUnit compunit
;
3844 unsigned char *hdrptr
;
3845 uint64_t abbrev_base
;
3848 unsigned int offset_size
;
3849 struct cu_tu_set
*this_set
;
3850 unsigned char *end_cu
;
3853 cu_offset
= start
- section_begin
;
3855 SAFE_BYTE_GET_AND_INC (compunit
.cu_length
, hdrptr
, 4, end
);
3857 if (compunit
.cu_length
== 0xffffffff)
3859 SAFE_BYTE_GET_AND_INC (compunit
.cu_length
, hdrptr
, 8, end
);
3864 end_cu
= hdrptr
+ compunit
.cu_length
;
3866 SAFE_BYTE_GET_AND_INC (compunit
.cu_version
, hdrptr
, 2, end_cu
);
3868 this_set
= find_cu_tu_set_v2 (cu_offset
, do_types
);
3870 if (compunit
.cu_version
< 5)
3872 compunit
.cu_unit_type
= DW_UT_compile
;
3873 /* Initialize it due to a false compiler warning. */
3874 compunit
.cu_pointer_size
= -1;
3878 SAFE_BYTE_GET_AND_INC (compunit
.cu_unit_type
, hdrptr
, 1, end_cu
);
3879 do_types
= (compunit
.cu_unit_type
== DW_UT_type
);
3881 SAFE_BYTE_GET_AND_INC (compunit
.cu_pointer_size
, hdrptr
, 1, end_cu
);
3884 SAFE_BYTE_GET_AND_INC (compunit
.cu_abbrev_offset
, hdrptr
, offset_size
,
3887 if (compunit
.cu_unit_type
== DW_UT_split_compile
3888 || compunit
.cu_unit_type
== DW_UT_skeleton
)
3891 SAFE_BYTE_GET_AND_INC (dwo_id
, hdrptr
, 8, end_cu
);
3894 if (this_set
== NULL
)
3897 abbrev_size
= debug_displays
[abbrev_sec
].section
.size
;
3901 abbrev_base
= this_set
->section_offsets
[DW_SECT_ABBREV
];
3902 abbrev_size
= this_set
->section_sizes
[DW_SECT_ABBREV
];
3906 abbrev_list
*free_list
;
3907 list
= find_and_process_abbrev_set (&debug_displays
[abbrev_sec
].section
,
3908 abbrev_base
, abbrev_size
,
3909 compunit
.cu_abbrev_offset
,
3912 if (list
!= NULL
&& list
->first_abbrev
!= NULL
)
3913 record_abbrev_list_for_cu (cu_offset
, start
- section_begin
,
3915 else if (free_list
!= NULL
)
3916 free_abbrev_list (free_list
);
3919 for (start
= section_begin
, unit
= 0; start
< end
; unit
++)
3921 DWARF2_Internal_CompUnit compunit
;
3922 unsigned char *hdrptr
;
3923 unsigned char *tags
;
3924 int level
, last_level
, saved_level
;
3926 unsigned int offset_size
;
3927 uint64_t signature
= 0;
3928 uint64_t type_offset
= 0;
3929 struct cu_tu_set
*this_set
;
3930 uint64_t abbrev_base
;
3932 unsigned char *end_cu
;
3935 cu_offset
= start
- section_begin
;
3937 SAFE_BYTE_GET_AND_INC (compunit
.cu_length
, hdrptr
, 4, end
);
3939 if (compunit
.cu_length
== 0xffffffff)
3941 SAFE_BYTE_GET_AND_INC (compunit
.cu_length
, hdrptr
, 8, end
);
3946 end_cu
= hdrptr
+ compunit
.cu_length
;
3948 SAFE_BYTE_GET_AND_INC (compunit
.cu_version
, hdrptr
, 2, end_cu
);
3950 this_set
= find_cu_tu_set_v2 (cu_offset
, do_types
);
3952 if (compunit
.cu_version
< 5)
3954 compunit
.cu_unit_type
= DW_UT_compile
;
3955 /* Initialize it due to a false compiler warning. */
3956 compunit
.cu_pointer_size
= -1;
3960 SAFE_BYTE_GET_AND_INC (compunit
.cu_unit_type
, hdrptr
, 1, end_cu
);
3961 do_types
= (compunit
.cu_unit_type
== DW_UT_type
);
3963 SAFE_BYTE_GET_AND_INC (compunit
.cu_pointer_size
, hdrptr
, 1, end_cu
);
3966 SAFE_BYTE_GET_AND_INC (compunit
.cu_abbrev_offset
, hdrptr
, offset_size
, end_cu
);
3968 if (this_set
== NULL
)
3971 abbrev_size
= debug_displays
[abbrev_sec
].section
.size
;
3975 abbrev_base
= this_set
->section_offsets
[DW_SECT_ABBREV
];
3976 abbrev_size
= this_set
->section_sizes
[DW_SECT_ABBREV
];
3979 if (compunit
.cu_version
< 5)
3980 SAFE_BYTE_GET_AND_INC (compunit
.cu_pointer_size
, hdrptr
, 1, end_cu
);
3982 bool do_dwo_id
= false;
3983 uint64_t dwo_id
= 0;
3984 if (compunit
.cu_unit_type
== DW_UT_split_compile
3985 || compunit
.cu_unit_type
== DW_UT_skeleton
)
3987 SAFE_BYTE_GET_AND_INC (dwo_id
, hdrptr
, 8, end_cu
);
3991 /* PR 17512: file: 001-108546-0.001:0.1. */
3992 if (compunit
.cu_pointer_size
< 2 || compunit
.cu_pointer_size
> 8)
3994 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
3995 compunit
.cu_pointer_size
, offset_size
);
3996 compunit
.cu_pointer_size
= offset_size
;
4001 SAFE_BYTE_GET_AND_INC (signature
, hdrptr
, 8, end_cu
);
4002 SAFE_BYTE_GET_AND_INC (type_offset
, hdrptr
, offset_size
, end_cu
);
4005 if (dwarf_start_die
>= (size_t) (end_cu
- section_begin
))
4011 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
|| do_debug_info
)
4012 && num_debug_info_entries
== 0
4013 && alloc_num_debug_info_entries
> unit
4016 free_debug_information (&debug_information
[unit
]);
4017 memset (&debug_information
[unit
], 0, sizeof (*debug_information
));
4018 debug_information
[unit
].pointer_size
= compunit
.cu_pointer_size
;
4019 debug_information
[unit
].offset_size
= offset_size
;
4020 debug_information
[unit
].dwarf_version
= compunit
.cu_version
;
4021 debug_information
[unit
].cu_offset
= cu_offset
;
4022 debug_information
[unit
].addr_base
= DEBUG_INFO_UNAVAILABLE
;
4023 debug_information
[unit
].ranges_base
= DEBUG_INFO_UNAVAILABLE
;
4026 if (!do_loc
&& dwarf_start_die
== 0)
4028 printf (_(" Compilation Unit @ offset %#" PRIx64
":\n"),
4030 printf (_(" Length: %#" PRIx64
" (%s)\n"),
4032 offset_size
== 8 ? "64-bit" : "32-bit");
4033 printf (_(" Version: %d\n"), compunit
.cu_version
);
4034 if (compunit
.cu_version
>= 5)
4036 const char *name
= get_DW_UT_name (compunit
.cu_unit_type
);
4038 printf (_(" Unit Type: %s (%x)\n"),
4040 compunit
.cu_unit_type
);
4042 printf (_(" Abbrev Offset: %#" PRIx64
"\n"),
4043 compunit
.cu_abbrev_offset
);
4044 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
4047 printf (_(" Signature: %#" PRIx64
"\n"), signature
);
4048 printf (_(" Type Offset: %#" PRIx64
"\n"), type_offset
);
4051 printf (_(" DWO ID: %#" PRIx64
"\n"), dwo_id
);
4052 if (this_set
!= NULL
)
4054 uint64_t *offsets
= this_set
->section_offsets
;
4055 size_t *sizes
= this_set
->section_sizes
;
4057 printf (_(" Section contributions:\n"));
4058 printf (_(" .debug_abbrev.dwo: %#" PRIx64
" %#zx\n"),
4059 offsets
[DW_SECT_ABBREV
], sizes
[DW_SECT_ABBREV
]);
4060 printf (_(" .debug_line.dwo: %#" PRIx64
" %#zx\n"),
4061 offsets
[DW_SECT_LINE
], sizes
[DW_SECT_LINE
]);
4062 printf (_(" .debug_loc.dwo: %#" PRIx64
" %#zx\n"),
4063 offsets
[DW_SECT_LOC
], sizes
[DW_SECT_LOC
]);
4064 printf (_(" .debug_str_offsets.dwo: %#" PRIx64
" %#zx\n"),
4065 offsets
[DW_SECT_STR_OFFSETS
], sizes
[DW_SECT_STR_OFFSETS
]);
4072 if (compunit
.cu_version
< 2 || compunit
.cu_version
> 5)
4074 warn (_("CU at offset %#" PRIx64
" contains corrupt or "
4075 "unsupported version number: %d.\n"),
4076 cu_offset
, compunit
.cu_version
);
4080 if (compunit
.cu_unit_type
!= DW_UT_compile
4081 && compunit
.cu_unit_type
!= DW_UT_partial
4082 && compunit
.cu_unit_type
!= DW_UT_type
4083 && compunit
.cu_unit_type
!= DW_UT_split_compile
4084 && compunit
.cu_unit_type
!= DW_UT_skeleton
)
4086 warn (_("CU at offset %#" PRIx64
" contains corrupt or "
4087 "unsupported unit type: %d.\n"),
4088 cu_offset
, compunit
.cu_unit_type
);
4092 /* Process the abbrevs used by this compilation unit. */
4094 list
= find_and_process_abbrev_set (&debug_displays
[abbrev_sec
].section
,
4095 abbrev_base
, abbrev_size
,
4096 compunit
.cu_abbrev_offset
, NULL
);
4100 while (tags
< start
)
4102 unsigned long abbrev_number
;
4103 unsigned long die_offset
;
4104 abbrev_entry
*entry
;
4106 int do_printing
= 1;
4108 die_offset
= tags
- section_begin
;
4110 READ_ULEB (abbrev_number
, tags
, start
);
4112 /* A null DIE marks the end of a list of siblings or it may also be
4113 a section padding. */
4114 if (abbrev_number
== 0)
4116 /* Check if it can be a section padding for the last CU. */
4117 if (level
== 0 && start
== end
)
4121 for (chk
= tags
; chk
< start
; chk
++)
4128 if (!do_loc
&& die_offset
>= dwarf_start_die
4129 && (dwarf_cutoff_level
== -1
4130 || level
< dwarf_cutoff_level
))
4131 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
4137 static unsigned num_bogus_warns
= 0;
4139 if (num_bogus_warns
< 3)
4141 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
4142 die_offset
, section
->name
);
4144 if (num_bogus_warns
== 3)
4145 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
4148 if (dwarf_start_die
!= 0 && level
< saved_level
)
4151 free_abbrev_list (list
);
4159 if (dwarf_start_die
!= 0 && die_offset
< dwarf_start_die
)
4163 if (dwarf_start_die
!= 0 && die_offset
== dwarf_start_die
)
4164 saved_level
= level
;
4165 do_printing
= (dwarf_cutoff_level
== -1
4166 || level
< dwarf_cutoff_level
);
4168 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
4169 level
, die_offset
, abbrev_number
);
4170 else if (dwarf_cutoff_level
== -1
4171 || last_level
< dwarf_cutoff_level
)
4172 printf (_(" <%d><%lx>: ...\n"), level
, die_offset
);
4177 /* Scan through the abbreviation list until we reach the
4181 for (entry
= list
->first_abbrev
; entry
!= NULL
; entry
= entry
->next
)
4182 if (entry
->number
== abbrev_number
)
4187 if (!do_loc
&& do_printing
)
4192 warn (_("DIE at offset %#lx refers to abbreviation number %lu which does not exist\n"),
4193 die_offset
, abbrev_number
);
4195 free_abbrev_list (list
);
4199 if (!do_loc
&& do_printing
)
4200 printf (" (%s)\n", get_TAG_name (entry
->tag
));
4205 need_base_address
= 0;
4207 case DW_TAG_compile_unit
:
4208 case DW_TAG_skeleton_unit
:
4209 need_base_address
= 1;
4210 need_dwo_info
= do_loc
;
4212 case DW_TAG_entry_point
:
4213 need_base_address
= 0;
4214 /* Assuming that there is no DW_AT_frame_base. */
4215 have_frame_base
= 0;
4217 case DW_TAG_subprogram
:
4218 need_base_address
= 0;
4219 if (level
<= frame_base_level
)
4220 /* Don't reset that for nested subprogram. */
4221 have_frame_base
= 0;
4225 debug_info
*debug_info_p
=
4226 (debug_information
&& unit
< alloc_num_debug_info_entries
)
4227 ? debug_information
+ unit
: NULL
;
4229 assert (!debug_info_p
4230 || (debug_info_p
->num_loc_offsets
4231 == debug_info_p
->num_loc_views
));
4233 /* Look ahead so that the values of DW_AT_rnglists_base,
4234 DW_AT_[GNU_]addr_base are available before attributes that
4235 reference them are parsed in the same DIE.
4236 Only needed for the top DIE on DWARFv5+.
4237 No simiar treatment for loclists_base because there should
4238 be no loclist attributes in top DIE. */
4239 if (compunit
.cu_version
>= 5 && level
== 0)
4246 compunit
.cu_pointer_size
,
4248 compunit
.cu_version
,
4251 /* This check was in place before, keep it. */
4252 stemp
= debug_info_p
->rnglists_base
;
4255 warn (_("CU @ %#" PRIx64
" has has a negative rnglists_base "
4256 "value of %#" PRIx64
" - treating as zero"),
4257 debug_info_p
->cu_offset
, stemp
);
4258 debug_info_p
->rnglists_base
= 0;
4262 for (attr
= entry
->first_attr
;
4263 attr
&& attr
->attribute
;
4266 if (! do_loc
&& do_printing
)
4267 /* Show the offset from where the tag was extracted. */
4268 printf (" <%tx>", tags
- section_begin
);
4269 tags
= read_and_display_attr (attr
->attribute
,
4271 attr
->implicit_const
,
4276 compunit
.cu_pointer_size
,
4278 compunit
.cu_version
,
4280 do_loc
|| ! do_printing
,
4286 /* If a locview attribute appears before a location one,
4287 make sure we don't associate it with an earlier
4290 switch (debug_info_p
->num_loc_offsets
- debug_info_p
->num_loc_views
)
4293 debug_info_p
->loc_views
[debug_info_p
->num_loc_views
] = -1;
4294 debug_info_p
->num_loc_views
++;
4295 assert (debug_info_p
->num_loc_views
4296 == debug_info_p
->num_loc_offsets
);
4303 warn (_("DIE has locviews without loclist\n"));
4304 debug_info_p
->num_loc_views
--;
4311 if (entry
->children
)
4315 free_abbrev_list (list
);
4318 /* Set num_debug_info_entries here so that it can be used to check if
4319 we need to process .debug_loc and .debug_ranges sections. */
4320 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
|| do_debug_info
)
4321 && num_debug_info_entries
== 0
4324 if (num_units
> alloc_num_debug_info_entries
)
4325 num_debug_info_entries
= alloc_num_debug_info_entries
;
4327 num_debug_info_entries
= num_units
;
4336 /* Locate and scan the .debug_info section in the file and record the pointer
4337 sizes and offsets for the compilation units in it. Usually an executable
4338 will have just one pointer size, but this is not guaranteed, and so we try
4339 not to make any assumptions. Returns zero upon failure, or the number of
4340 compilation units upon success. */
4343 load_debug_info (void * file
)
4345 /* If we have already tried and failed to load the .debug_info
4346 section then do not bother to repeat the task. */
4347 if (num_debug_info_entries
== DEBUG_INFO_UNAVAILABLE
)
4350 /* If we already have the information there is nothing else to do. */
4351 if (num_debug_info_entries
> 0)
4352 return num_debug_info_entries
;
4354 /* If this is a DWARF package file, load the CU and TU indexes. */
4355 (void) load_cu_tu_indexes (file
);
4357 if (load_debug_section_with_follow (info
, file
)
4358 && process_debug_info (&debug_displays
[info
].section
, file
, abbrev
, true, false))
4359 return num_debug_info_entries
;
4361 if (load_debug_section_with_follow (info_dwo
, file
)
4362 && process_debug_info (&debug_displays
[info_dwo
].section
, file
,
4363 abbrev_dwo
, true, false))
4364 return num_debug_info_entries
;
4366 num_debug_info_entries
= DEBUG_INFO_UNAVAILABLE
;
4370 /* Read a DWARF .debug_line section header starting at DATA.
4371 Upon success returns an updated DATA pointer and the LINFO
4372 structure and the END_OF_SEQUENCE pointer will be filled in.
4373 Otherwise returns NULL. */
4375 static unsigned char *
4376 read_debug_line_header (struct dwarf_section
* section
,
4377 unsigned char * data
,
4378 unsigned char * end
,
4379 DWARF2_Internal_LineInfo
* linfo
,
4380 unsigned char ** end_of_sequence
)
4382 unsigned char *hdrptr
;
4384 /* Extract information from the Line Number Program Header.
4385 (section 6.2.4 in the Dwarf3 doc). */
4388 /* Get and check the length of the block. */
4389 SAFE_BYTE_GET_AND_INC (linfo
->li_length
, hdrptr
, 4, end
);
4391 if (linfo
->li_length
== 0xffffffff)
4393 /* This section is 64-bit DWARF 3. */
4394 SAFE_BYTE_GET_AND_INC (linfo
->li_length
, hdrptr
, 8, end
);
4395 linfo
->li_offset_size
= 8;
4398 linfo
->li_offset_size
= 4;
4400 if (linfo
->li_length
> (size_t) (end
- hdrptr
))
4402 /* If the length field has a relocation against it, then we should
4403 not complain if it is inaccurate (and probably negative). This
4404 happens in object files when the .debug_line section is actually
4405 comprised of several different .debug_line.* sections, (some of
4406 which may be removed by linker garbage collection), and a relocation
4407 is used to compute the correct length once that is done. */
4408 if (reloc_at (section
, (hdrptr
- section
->start
) - linfo
->li_offset_size
))
4410 linfo
->li_length
= end
- hdrptr
;
4414 warn (_("The length field (%#" PRIx64
")"
4415 " in the debug_line header is wrong"
4416 " - the section is too small\n"),
4421 end
= hdrptr
+ linfo
->li_length
;
4423 /* Get and check the version number. */
4424 SAFE_BYTE_GET_AND_INC (linfo
->li_version
, hdrptr
, 2, end
);
4426 if (linfo
->li_version
!= 2
4427 && linfo
->li_version
!= 3
4428 && linfo
->li_version
!= 4
4429 && linfo
->li_version
!= 5)
4431 warn (_("Only DWARF version 2, 3, 4 and 5 line info "
4432 "is currently supported.\n"));
4436 if (linfo
->li_version
>= 5)
4438 SAFE_BYTE_GET_AND_INC (linfo
->li_address_size
, hdrptr
, 1, end
);
4440 SAFE_BYTE_GET_AND_INC (linfo
->li_segment_size
, hdrptr
, 1, end
);
4441 if (linfo
->li_segment_size
!= 0)
4443 warn (_("The %s section contains "
4444 "unsupported segment selector size: %d.\n"),
4445 section
->name
, linfo
->li_segment_size
);
4450 SAFE_BYTE_GET_AND_INC (linfo
->li_prologue_length
, hdrptr
,
4451 linfo
->li_offset_size
, end
);
4452 SAFE_BYTE_GET_AND_INC (linfo
->li_min_insn_length
, hdrptr
, 1, end
);
4454 if (linfo
->li_version
>= 4)
4456 SAFE_BYTE_GET_AND_INC (linfo
->li_max_ops_per_insn
, hdrptr
, 1, end
);
4458 if (linfo
->li_max_ops_per_insn
== 0)
4460 warn (_("Invalid maximum operations per insn.\n"));
4465 linfo
->li_max_ops_per_insn
= 1;
4467 SAFE_BYTE_GET_AND_INC (linfo
->li_default_is_stmt
, hdrptr
, 1, end
);
4468 SAFE_SIGNED_BYTE_GET_AND_INC (linfo
->li_line_base
, hdrptr
, 1, end
);
4469 SAFE_BYTE_GET_AND_INC (linfo
->li_line_range
, hdrptr
, 1, end
);
4470 SAFE_BYTE_GET_AND_INC (linfo
->li_opcode_base
, hdrptr
, 1, end
);
4472 *end_of_sequence
= end
;
4476 static unsigned char *
4477 display_formatted_table (unsigned char *data
,
4478 unsigned char *start
,
4480 const DWARF2_Internal_LineInfo
*linfo
,
4481 struct dwarf_section
*section
,
4484 unsigned char *format_start
, format_count
, *format
, formati
;
4485 uint64_t data_count
, datai
;
4486 unsigned int namepass
, last_entry
= 0;
4487 const char * table_name
= is_dir
? N_("Directory Table") : N_("File Name Table");
4489 SAFE_BYTE_GET_AND_INC (format_count
, data
, 1, end
);
4490 if (do_checks
&& format_count
> 5)
4491 warn (_("Unexpectedly large number of columns in the %s (%u)\n"),
4492 table_name
, format_count
);
4494 format_start
= data
;
4495 for (formati
= 0; formati
< format_count
; formati
++)
4497 SKIP_ULEB (data
, end
);
4498 SKIP_ULEB (data
, end
);
4501 warn (_("%s: Corrupt format description entry\n"), table_name
);
4506 READ_ULEB (data_count
, data
, end
);
4507 if (data_count
== 0)
4509 printf (_("\n The %s is empty.\n"), table_name
);
4512 else if (data
>= end
4513 || data_count
> (size_t) (end
- data
))
4515 warn (_("%s: Corrupt entry count %#" PRIx64
"\n"), table_name
, data_count
);
4519 else if (format_count
== 0)
4521 warn (_("%s: format count is zero, but the table is not empty\n"),
4526 printf (_("\n The %s (offset %#tx, lines %" PRIu64
", columns %u):\n"),
4527 table_name
, data
- start
, data_count
, format_count
);
4529 printf (_(" Entry"));
4530 /* Delay displaying name as the last entry for better screen layout. */
4531 for (namepass
= 0; namepass
< 2; namepass
++)
4533 format
= format_start
;
4534 for (formati
= 0; formati
< format_count
; formati
++)
4536 uint64_t content_type
;
4538 READ_ULEB (content_type
, format
, end
);
4539 if ((content_type
== DW_LNCT_path
) == (namepass
== 1))
4540 switch (content_type
)
4543 printf (_("\tName"));
4545 case DW_LNCT_directory_index
:
4546 printf (_("\tDir"));
4548 case DW_LNCT_timestamp
:
4549 printf (_("\tTime"));
4552 printf (_("\tSize"));
4555 printf (_("\tMD5\t\t\t"));
4558 printf (_("\t(Unknown format content type %" PRIu64
")"),
4561 SKIP_ULEB (format
, end
);
4566 for (datai
= 0; datai
< data_count
; datai
++)
4568 unsigned char *datapass
= data
;
4570 printf (" %d", last_entry
++);
4571 /* Delay displaying name as the last entry for better screen layout. */
4572 for (namepass
= 0; namepass
< 2; namepass
++)
4574 format
= format_start
;
4576 for (formati
= 0; formati
< format_count
; formati
++)
4578 uint64_t content_type
, form
;
4580 READ_ULEB (content_type
, format
, end
);
4581 READ_ULEB (form
, format
, end
);
4582 data
= read_and_display_attr_value (0, form
, 0, start
, data
, end
,
4583 0, 0, linfo
->li_offset_size
,
4584 linfo
->li_version
, NULL
,
4585 ((content_type
== DW_LNCT_path
) != (namepass
== 1)),
4586 section
, NULL
, '\t', -1);
4590 if (data
>= end
&& (datai
< data_count
- 1))
4592 warn (_("\n%s: Corrupt entries list\n"), table_name
);
4601 display_debug_sup (struct dwarf_section
* section
,
4602 void * file ATTRIBUTE_UNUSED
)
4604 unsigned char * start
= section
->start
;
4605 unsigned char * end
= section
->start
+ section
->size
;
4606 unsigned int version
;
4607 char is_supplementary
;
4608 const unsigned char * sup_filename
;
4609 size_t sup_filename_len
;
4610 unsigned int num_read
;
4612 uint64_t checksum_len
;
4615 introduce (section
, true);
4616 if (section
->size
< 4)
4618 error (_("corrupt .debug_sup section: size is too small\n"));
4622 /* Read the data. */
4623 SAFE_BYTE_GET_AND_INC (version
, start
, 2, end
);
4625 warn (_("corrupt .debug_sup section: version < 5"));
4627 SAFE_BYTE_GET_AND_INC (is_supplementary
, start
, 1, end
);
4628 if (is_supplementary
!= 0 && is_supplementary
!= 1)
4629 warn (_("corrupt .debug_sup section: is_supplementary not 0 or 1\n"));
4631 sup_filename
= start
;
4632 if (is_supplementary
&& sup_filename
[0] != 0)
4633 warn (_("corrupt .debug_sup section: filename not empty in supplementary section\n"));
4635 sup_filename_len
= strnlen ((const char *) start
, end
- start
);
4636 if (sup_filename_len
== (size_t) (end
- start
))
4638 error (_("corrupt .debug_sup section: filename is not NUL terminated\n"));
4641 start
+= sup_filename_len
+ 1;
4643 checksum_len
= read_leb128 (start
, end
, false /* unsigned */, & num_read
, & status
);
4646 error (_("corrupt .debug_sup section: bad LEB128 field for checksum length\n"));
4650 if (checksum_len
> (size_t) (end
- start
))
4652 error (_("corrupt .debug_sup section: checksum length is longer than the remaining section length\n"));
4653 checksum_len
= end
- start
;
4655 else if (checksum_len
< (size_t) (end
- start
))
4657 warn (_("corrupt .debug_sup section: there are %#" PRIx64
4658 " extra, unused bytes at the end of the section\n"),
4659 (end
- start
) - checksum_len
);
4662 printf (_(" Version: %u\n"), version
);
4663 printf (_(" Is Supp: %u\n"), is_supplementary
);
4664 printf (_(" Filename: %s\n"), sup_filename
);
4665 printf (_(" Checksum Len: %" PRIu64
"\n"), checksum_len
);
4666 if (checksum_len
> 0)
4668 printf (_(" Checksum: "));
4669 while (checksum_len
--)
4670 printf ("0x%x ", * start
++ );
4677 display_debug_lines_raw (struct dwarf_section
* section
,
4678 unsigned char * data
,
4679 unsigned char * end
,
4682 unsigned char *start
= section
->start
;
4683 int verbose_view
= 0;
4685 introduce (section
, true);
4689 static DWARF2_Internal_LineInfo saved_linfo
;
4690 DWARF2_Internal_LineInfo linfo
;
4691 unsigned char *standard_opcodes
;
4692 unsigned char *end_of_sequence
;
4695 if (startswith (section
->name
, ".debug_line.")
4696 /* Note: the following does not apply to .debug_line.dwo sections.
4697 These are full debug_line sections. */
4698 && strcmp (section
->name
, ".debug_line.dwo") != 0)
4700 /* Sections named .debug_line.<foo> are fragments of a .debug_line
4701 section containing just the Line Number Statements. They are
4702 created by the assembler and intended to be used alongside gcc's
4703 -ffunction-sections command line option. When the linker's
4704 garbage collection decides to discard a .text.<foo> section it
4705 can then also discard the line number information in .debug_line.<foo>.
4707 Since the section is a fragment it does not have the details
4708 needed to fill out a LineInfo structure, so instead we use the
4709 details from the last full debug_line section that we processed. */
4710 end_of_sequence
= end
;
4711 standard_opcodes
= NULL
;
4712 linfo
= saved_linfo
;
4713 /* PR 17531: file: 0522b371. */
4714 if (linfo
.li_line_range
== 0)
4716 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
4719 reset_state_machine (linfo
.li_default_is_stmt
);
4723 unsigned char * hdrptr
;
4725 if ((hdrptr
= read_debug_line_header (section
, data
, end
, & linfo
,
4726 & end_of_sequence
)) == NULL
)
4729 printf (_(" Offset: %#tx\n"), data
- start
);
4730 printf (_(" Length: %" PRId64
"\n"), linfo
.li_length
);
4731 printf (_(" DWARF Version: %d\n"), linfo
.li_version
);
4732 if (linfo
.li_version
>= 5)
4734 printf (_(" Address size (bytes): %d\n"), linfo
.li_address_size
);
4735 printf (_(" Segment selector (bytes): %d\n"), linfo
.li_segment_size
);
4737 printf (_(" Prologue Length: %d\n"), (int) linfo
.li_prologue_length
);
4738 printf (_(" Minimum Instruction Length: %d\n"), linfo
.li_min_insn_length
);
4739 if (linfo
.li_version
>= 4)
4740 printf (_(" Maximum Ops per Instruction: %d\n"), linfo
.li_max_ops_per_insn
);
4741 printf (_(" Initial value of 'is_stmt': %d\n"), linfo
.li_default_is_stmt
);
4742 printf (_(" Line Base: %d\n"), linfo
.li_line_base
);
4743 printf (_(" Line Range: %d\n"), linfo
.li_line_range
);
4744 printf (_(" Opcode Base: %d\n"), linfo
.li_opcode_base
);
4746 /* PR 17512: file: 1665-6428-0.004. */
4747 if (linfo
.li_line_range
== 0)
4749 warn (_("Line range of 0 is invalid, using 1 instead\n"));
4750 linfo
.li_line_range
= 1;
4753 reset_state_machine (linfo
.li_default_is_stmt
);
4755 /* Display the contents of the Opcodes table. */
4756 standard_opcodes
= hdrptr
;
4758 /* PR 17512: file: 002-417945-0.004. */
4759 if (standard_opcodes
+ linfo
.li_opcode_base
>= end
)
4761 warn (_("Line Base extends beyond end of section\n"));
4765 printf (_("\n Opcodes:\n"));
4767 for (i
= 1; i
< linfo
.li_opcode_base
; i
++)
4768 printf (ngettext (" Opcode %d has %d arg\n",
4769 " Opcode %d has %d args\n",
4770 standard_opcodes
[i
- 1]),
4771 i
, standard_opcodes
[i
- 1]);
4773 /* Display the contents of the Directory table. */
4774 data
= standard_opcodes
+ linfo
.li_opcode_base
- 1;
4776 if (linfo
.li_version
>= 5)
4778 load_debug_section_with_follow (line_str
, file
);
4780 data
= display_formatted_table (data
, start
, end
, &linfo
, section
,
4782 data
= display_formatted_table (data
, start
, end
, &linfo
, section
,
4788 printf (_("\n The Directory Table is empty.\n"));
4791 unsigned int last_dir_entry
= 0;
4793 printf (_("\n The Directory Table (offset %#tx):\n"),
4796 while (data
< end
&& *data
!= 0)
4798 printf (" %d\t%.*s\n", ++last_dir_entry
, (int) (end
- data
), data
);
4800 data
+= strnlen ((char *) data
, end
- data
);
4805 /* PR 17512: file: 002-132094-0.004. */
4806 if (data
>= end
- 1)
4810 /* Skip the NUL at the end of the table. */
4814 /* Display the contents of the File Name table. */
4815 if (data
>= end
|| *data
== 0)
4816 printf (_("\n The File Name Table is empty.\n"));
4819 printf (_("\n The File Name Table (offset %#tx):\n"),
4821 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4823 while (data
< end
&& *data
!= 0)
4825 unsigned char *name
;
4828 printf (" %d\t", ++state_machine_regs
.last_file_entry
);
4830 data
+= strnlen ((char *) data
, end
- data
);
4834 READ_ULEB (val
, data
, end
);
4835 printf ("%" PRIu64
"\t", val
);
4836 READ_ULEB (val
, data
, end
);
4837 printf ("%" PRIu64
"\t", val
);
4838 READ_ULEB (val
, data
, end
);
4839 printf ("%" PRIu64
"\t", val
);
4840 printf ("%.*s\n", (int)(end
- name
), name
);
4844 warn (_("Corrupt file name table entry\n"));
4850 /* Skip the NUL at the end of the table. */
4856 saved_linfo
= linfo
;
4859 /* Now display the statements. */
4860 if (data
>= end_of_sequence
)
4861 printf (_(" No Line Number Statements.\n"));
4864 printf (_(" Line Number Statements:\n"));
4866 while (data
< end_of_sequence
)
4868 unsigned char op_code
;
4872 printf (" [0x%08tx]", data
- start
);
4876 if (op_code
>= linfo
.li_opcode_base
)
4878 op_code
-= linfo
.li_opcode_base
;
4879 uladv
= (op_code
/ linfo
.li_line_range
);
4880 if (linfo
.li_max_ops_per_insn
== 1)
4882 uladv
*= linfo
.li_min_insn_length
;
4883 state_machine_regs
.address
+= uladv
;
4885 state_machine_regs
.view
= 0;
4886 printf (_(" Special opcode %d: "
4887 "advance Address by %" PRIu64
4888 " to %#" PRIx64
"%s"),
4889 op_code
, uladv
, state_machine_regs
.address
,
4890 verbose_view
&& uladv
4891 ? _(" (reset view)") : "");
4896 = ((state_machine_regs
.op_index
+ uladv
)
4897 / linfo
.li_max_ops_per_insn
)
4898 * linfo
.li_min_insn_length
;
4900 state_machine_regs
.address
+= addrdelta
;
4901 state_machine_regs
.op_index
4902 = (state_machine_regs
.op_index
+ uladv
)
4903 % linfo
.li_max_ops_per_insn
;
4905 state_machine_regs
.view
= 0;
4906 printf (_(" Special opcode %d: "
4907 "advance Address by %" PRIu64
4908 " to %#" PRIx64
"[%d]%s"),
4909 op_code
, uladv
, state_machine_regs
.address
,
4910 state_machine_regs
.op_index
,
4911 verbose_view
&& addrdelta
4912 ? _(" (reset view)") : "");
4914 adv
= (op_code
% linfo
.li_line_range
) + linfo
.li_line_base
;
4915 state_machine_regs
.line
+= adv
;
4916 printf (_(" and Line by %d to %d"),
4917 adv
, state_machine_regs
.line
);
4918 if (verbose_view
|| state_machine_regs
.view
)
4919 printf (_(" (view %u)\n"), state_machine_regs
.view
);
4922 state_machine_regs
.view
++;
4927 case DW_LNS_extended_op
:
4928 data
+= process_extended_line_op (data
,
4929 linfo
.li_default_is_stmt
,
4934 printf (_(" Copy"));
4935 if (verbose_view
|| state_machine_regs
.view
)
4936 printf (_(" (view %u)\n"), state_machine_regs
.view
);
4939 state_machine_regs
.view
++;
4942 case DW_LNS_advance_pc
:
4943 READ_ULEB (uladv
, data
, end
);
4944 if (linfo
.li_max_ops_per_insn
== 1)
4946 uladv
*= linfo
.li_min_insn_length
;
4947 state_machine_regs
.address
+= uladv
;
4949 state_machine_regs
.view
= 0;
4950 printf (_(" Advance PC by %" PRIu64
4951 " to %#" PRIx64
"%s\n"),
4952 uladv
, state_machine_regs
.address
,
4953 verbose_view
&& uladv
4954 ? _(" (reset view)") : "");
4959 = ((state_machine_regs
.op_index
+ uladv
)
4960 / linfo
.li_max_ops_per_insn
)
4961 * linfo
.li_min_insn_length
;
4962 state_machine_regs
.address
4964 state_machine_regs
.op_index
4965 = (state_machine_regs
.op_index
+ uladv
)
4966 % linfo
.li_max_ops_per_insn
;
4968 state_machine_regs
.view
= 0;
4969 printf (_(" Advance PC by %" PRIu64
4970 " to %#" PRIx64
"[%d]%s\n"),
4971 uladv
, state_machine_regs
.address
,
4972 state_machine_regs
.op_index
,
4973 verbose_view
&& addrdelta
4974 ? _(" (reset view)") : "");
4978 case DW_LNS_advance_line
:
4979 READ_SLEB (adv
, data
, end
);
4980 state_machine_regs
.line
+= adv
;
4981 printf (_(" Advance Line by %d to %d\n"),
4982 adv
, state_machine_regs
.line
);
4985 case DW_LNS_set_file
:
4986 READ_ULEB (uladv
, data
, end
);
4987 printf (_(" Set File Name to entry %" PRIu64
4988 " in the File Name Table\n"), uladv
);
4989 state_machine_regs
.file
= uladv
;
4992 case DW_LNS_set_column
:
4993 READ_ULEB (uladv
, data
, end
);
4994 printf (_(" Set column to %" PRIu64
"\n"), uladv
);
4995 state_machine_regs
.column
= uladv
;
4998 case DW_LNS_negate_stmt
:
4999 adv
= state_machine_regs
.is_stmt
;
5001 printf (_(" Set is_stmt to %d\n"), adv
);
5002 state_machine_regs
.is_stmt
= adv
;
5005 case DW_LNS_set_basic_block
:
5006 printf (_(" Set basic block\n"));
5007 state_machine_regs
.basic_block
= 1;
5010 case DW_LNS_const_add_pc
:
5011 uladv
= ((255 - linfo
.li_opcode_base
) / linfo
.li_line_range
);
5012 if (linfo
.li_max_ops_per_insn
)
5014 uladv
*= linfo
.li_min_insn_length
;
5015 state_machine_regs
.address
+= uladv
;
5017 state_machine_regs
.view
= 0;
5018 printf (_(" Advance PC by constant %" PRIu64
5019 " to %#" PRIx64
"%s\n"),
5020 uladv
, state_machine_regs
.address
,
5021 verbose_view
&& uladv
5022 ? _(" (reset view)") : "");
5027 = ((state_machine_regs
.op_index
+ uladv
)
5028 / linfo
.li_max_ops_per_insn
)
5029 * linfo
.li_min_insn_length
;
5030 state_machine_regs
.address
5032 state_machine_regs
.op_index
5033 = (state_machine_regs
.op_index
+ uladv
)
5034 % linfo
.li_max_ops_per_insn
;
5036 state_machine_regs
.view
= 0;
5037 printf (_(" Advance PC by constant %" PRIu64
5038 " to %#" PRIx64
"[%d]%s\n"),
5039 uladv
, state_machine_regs
.address
,
5040 state_machine_regs
.op_index
,
5041 verbose_view
&& addrdelta
5042 ? _(" (reset view)") : "");
5046 case DW_LNS_fixed_advance_pc
:
5047 SAFE_BYTE_GET_AND_INC (uladv
, data
, 2, end
);
5048 state_machine_regs
.address
+= uladv
;
5049 state_machine_regs
.op_index
= 0;
5050 printf (_(" Advance PC by fixed size amount %" PRIu64
5051 " to %#" PRIx64
"\n"),
5052 uladv
, state_machine_regs
.address
);
5053 /* Do NOT reset view. */
5056 case DW_LNS_set_prologue_end
:
5057 printf (_(" Set prologue_end to true\n"));
5060 case DW_LNS_set_epilogue_begin
:
5061 printf (_(" Set epilogue_begin to true\n"));
5064 case DW_LNS_set_isa
:
5065 READ_ULEB (uladv
, data
, end
);
5066 printf (_(" Set ISA to %" PRIu64
"\n"), uladv
);
5070 printf (_(" Unknown opcode %d with operands: "), op_code
);
5072 if (standard_opcodes
!= NULL
)
5073 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
5075 READ_ULEB (uladv
, data
, end
);
5076 printf ("%#" PRIx64
"%s", uladv
, i
== 1 ? "" : ", ");
5092 unsigned int directory_index
;
5093 unsigned int modification_date
;
5094 unsigned int length
;
5097 /* Output a decoded representation of the .debug_line section. */
5100 display_debug_lines_decoded (struct dwarf_section
* section
,
5101 unsigned char * start
,
5102 unsigned char * data
,
5103 unsigned char * end
,
5106 static DWARF2_Internal_LineInfo saved_linfo
;
5108 introduce (section
, false);
5112 /* This loop amounts to one iteration per compilation unit. */
5113 DWARF2_Internal_LineInfo linfo
;
5114 unsigned char *standard_opcodes
;
5115 unsigned char *end_of_sequence
;
5117 File_Entry
*file_table
= NULL
;
5118 unsigned int n_files
= 0;
5119 char **directory_table
= NULL
;
5120 unsigned int n_directories
= 0;
5122 if (startswith (section
->name
, ".debug_line.")
5123 /* Note: the following does not apply to .debug_line.dwo sections.
5124 These are full debug_line sections. */
5125 && strcmp (section
->name
, ".debug_line.dwo") != 0)
5127 /* See comment in display_debug_lines_raw(). */
5128 end_of_sequence
= end
;
5129 standard_opcodes
= NULL
;
5130 linfo
= saved_linfo
;
5131 /* PR 17531: file: 0522b371. */
5132 if (linfo
.li_line_range
== 0)
5134 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
5137 reset_state_machine (linfo
.li_default_is_stmt
);
5141 unsigned char *hdrptr
;
5143 if ((hdrptr
= read_debug_line_header (section
, data
, end
, & linfo
,
5144 & end_of_sequence
)) == NULL
)
5147 /* PR 17531: file: 0522b371. */
5148 if (linfo
.li_line_range
== 0)
5150 warn (_("Line range of 0 is invalid, using 1 instead\n"));
5151 linfo
.li_line_range
= 1;
5153 reset_state_machine (linfo
.li_default_is_stmt
);
5155 /* Save a pointer to the contents of the Opcodes table. */
5156 standard_opcodes
= hdrptr
;
5158 /* Traverse the Directory table just to count entries. */
5159 data
= standard_opcodes
+ linfo
.li_opcode_base
- 1;
5163 warn (_("opcode base of %d extends beyond end of section\n"),
5164 linfo
.li_opcode_base
);
5168 if (linfo
.li_version
>= 5)
5170 unsigned char *format_start
, *format
;
5171 unsigned int format_count
, formati
, entryi
;
5173 load_debug_section_with_follow (line_str
, fileptr
);
5175 /* Skip directories format. */
5176 SAFE_BYTE_GET_AND_INC (format_count
, data
, 1, end
);
5177 if (do_checks
&& format_count
> 1)
5178 warn (_("Unexpectedly large number of columns in the directory name table (%u)\n"),
5180 format_start
= data
;
5181 for (formati
= 0; formati
< format_count
; formati
++)
5183 SKIP_ULEB (data
, end
);
5184 SKIP_ULEB (data
, end
);
5187 READ_ULEB (n_directories
, data
, end
);
5190 warn (_("Corrupt directories list\n"));
5194 if (n_directories
== 0)
5195 directory_table
= NULL
;
5196 else if (n_directories
> section
->size
)
5198 warn (_("number of directories (0x%x) exceeds size of section %s\n"),
5199 n_directories
, section
->name
);
5203 directory_table
= (char **)
5204 xcalloc (n_directories
, sizeof (unsigned char *));
5206 for (entryi
= 0; entryi
< n_directories
; entryi
++)
5208 char **pathp
= &directory_table
[entryi
];
5210 format
= format_start
;
5211 for (formati
= 0; formati
< format_count
; formati
++)
5213 uint64_t content_type
, form
;
5216 READ_ULEB (content_type
, format
, end
);
5217 READ_ULEB (form
, format
, end
);
5220 warn (_("Corrupt directories list\n"));
5223 switch (content_type
)
5228 case DW_FORM_string
:
5229 *pathp
= (char *) data
;
5231 case DW_FORM_line_strp
:
5232 SAFE_BYTE_GET (uvalue
, data
, linfo
.li_offset_size
,
5234 /* Remove const by the cast. */
5236 fetch_indirect_line_string (uvalue
);
5241 data
= read_and_display_attr_value (0, form
, 0, start
,
5243 linfo
.li_offset_size
,
5250 warn (_("Corrupt directories list\n"));
5255 /* Skip files format. */
5256 SAFE_BYTE_GET_AND_INC (format_count
, data
, 1, end
);
5257 if (do_checks
&& format_count
> 5)
5258 warn (_("Unexpectedly large number of columns in the file name table (%u)\n"),
5261 format_start
= data
;
5262 for (formati
= 0; formati
< format_count
; formati
++)
5264 SKIP_ULEB (data
, end
);
5265 SKIP_ULEB (data
, end
);
5268 READ_ULEB (n_files
, data
, end
);
5269 if (data
>= end
&& n_files
> 0)
5271 warn (_("Corrupt file name list\n"));
5277 else if (n_files
> section
->size
)
5279 warn (_("number of files (0x%x) exceeds size of section %s\n"),
5280 n_files
, section
->name
);
5284 file_table
= (File_Entry
*) xcalloc (n_files
,
5285 sizeof (File_Entry
));
5287 for (entryi
= 0; entryi
< n_files
; entryi
++)
5289 File_Entry
*file
= &file_table
[entryi
];
5291 format
= format_start
;
5292 for (formati
= 0; formati
< format_count
; formati
++)
5294 uint64_t content_type
, form
;
5298 READ_ULEB (content_type
, format
, end
);
5299 READ_ULEB (form
, format
, end
);
5302 warn (_("Corrupt file name list\n"));
5305 switch (content_type
)
5310 case DW_FORM_string
:
5311 file
->name
= (char *) data
;
5313 case DW_FORM_line_strp
:
5314 SAFE_BYTE_GET (uvalue
, data
, linfo
.li_offset_size
,
5316 /* Remove const by the cast. */
5317 file
->name
= (char *)
5318 fetch_indirect_line_string (uvalue
);
5322 case DW_LNCT_directory_index
:
5326 SAFE_BYTE_GET (file
->directory_index
, data
, 1,
5330 SAFE_BYTE_GET (file
->directory_index
, data
, 2,
5335 READ_ULEB (file
->directory_index
, tmp
, end
);
5340 data
= read_and_display_attr_value (0, form
, 0, start
,
5342 linfo
.li_offset_size
,
5349 warn (_("Corrupt file name list\n"));
5358 char *ptr_directory_table
= (char *) data
;
5360 while (data
< end
&& *data
!= 0)
5362 data
+= strnlen ((char *) data
, end
- data
);
5371 warn (_("directory table ends unexpectedly\n"));
5376 /* Go through the directory table again to save the directories. */
5377 directory_table
= (char **)
5378 xmalloc (n_directories
* sizeof (unsigned char *));
5381 while (*ptr_directory_table
!= 0)
5383 directory_table
[i
] = ptr_directory_table
;
5384 ptr_directory_table
+= strlen (ptr_directory_table
) + 1;
5388 /* Skip the NUL at the end of the table. */
5391 /* Traverse the File Name table just to count the entries. */
5392 if (data
< end
&& *data
!= 0)
5394 unsigned char *ptr_file_name_table
= data
;
5396 while (data
< end
&& *data
!= 0)
5398 /* Skip Name, directory index, last modification
5399 time and length of file. */
5400 data
+= strnlen ((char *) data
, end
- data
);
5403 SKIP_ULEB (data
, end
);
5404 SKIP_ULEB (data
, end
);
5405 SKIP_ULEB (data
, end
);
5411 warn (_("file table ends unexpectedly\n"));
5416 /* Go through the file table again to save the strings. */
5417 file_table
= (File_Entry
*) xmalloc (n_files
* sizeof (File_Entry
));
5420 while (*ptr_file_name_table
!= 0)
5422 file_table
[i
].name
= (char *) ptr_file_name_table
;
5424 += strlen ((char *) ptr_file_name_table
) + 1;
5426 /* We are not interested in directory, time or size. */
5427 READ_ULEB (file_table
[i
].directory_index
,
5428 ptr_file_name_table
, end
);
5429 READ_ULEB (file_table
[i
].modification_date
,
5430 ptr_file_name_table
, end
);
5431 READ_ULEB (file_table
[i
].length
,
5432 ptr_file_name_table
, end
);
5438 /* Skip the NUL at the end of the table. */
5442 /* Print the Compilation Unit's name and a header. */
5443 if (file_table
== NULL
)
5444 printf (_("CU: No directory table\n"));
5445 else if (directory_table
== NULL
)
5446 printf (_("CU: %s:\n"), null_name (file_table
[0].name
));
5449 unsigned int ix
= file_table
[0].directory_index
;
5450 const char *directory
;
5452 if (ix
== 0 && linfo
.li_version
< 5)
5455 else if (n_directories
== 0)
5456 directory
= _("<unknown>");
5459 if (linfo
.li_version
< 5)
5461 if (ix
>= n_directories
)
5463 warn (_("directory index %u "
5464 ">= number of directories %u\n"),
5466 directory
= _("<corrupt>");
5469 directory
= directory_table
[ix
];
5472 printf (_("CU: %s/%s:\n"),
5473 null_name (directory
),
5474 null_name (file_table
[0].name
));
5476 printf ("%s:\n", null_name (file_table
[0].name
));
5482 printf (_("File name Line number Starting address View Stmt\n"));
5484 printf (_("File name Line number Starting address View Stmt\n"));
5487 printf (_("CU: Empty file name table\n"));
5488 saved_linfo
= linfo
;
5491 /* This loop iterates through the Dwarf Line Number Program. */
5492 while (data
< end_of_sequence
)
5494 unsigned char op_code
;
5497 unsigned long int uladv
;
5498 int is_special_opcode
= 0;
5503 if (op_code
>= linfo
.li_opcode_base
)
5505 op_code
-= linfo
.li_opcode_base
;
5506 uladv
= (op_code
/ linfo
.li_line_range
);
5507 if (linfo
.li_max_ops_per_insn
== 1)
5509 uladv
*= linfo
.li_min_insn_length
;
5510 state_machine_regs
.address
+= uladv
;
5512 state_machine_regs
.view
= 0;
5517 = ((state_machine_regs
.op_index
+ uladv
)
5518 / linfo
.li_max_ops_per_insn
)
5519 * linfo
.li_min_insn_length
;
5520 state_machine_regs
.address
5522 state_machine_regs
.op_index
5523 = (state_machine_regs
.op_index
+ uladv
)
5524 % linfo
.li_max_ops_per_insn
;
5526 state_machine_regs
.view
= 0;
5529 adv
= (op_code
% linfo
.li_line_range
) + linfo
.li_line_base
;
5530 state_machine_regs
.line
+= adv
;
5531 is_special_opcode
= 1;
5532 /* Increment view after printing this row. */
5537 case DW_LNS_extended_op
:
5539 unsigned int ext_op_code_len
;
5540 unsigned char ext_op_code
;
5541 unsigned char *op_code_end
;
5542 unsigned char *op_code_data
= data
;
5544 READ_ULEB (ext_op_code_len
, op_code_data
, end_of_sequence
);
5545 op_code_end
= op_code_data
+ ext_op_code_len
;
5546 if (ext_op_code_len
== 0 || op_code_end
> end_of_sequence
)
5548 warn (_("Badly formed extended line op encountered!\n"));
5551 ext_op_code
= *op_code_data
++;
5555 switch (ext_op_code
)
5557 case DW_LNE_end_sequence
:
5558 /* Reset stuff after printing this row. */
5560 case DW_LNE_set_address
:
5561 SAFE_BYTE_GET_AND_INC (state_machine_regs
.address
,
5563 op_code_end
- op_code_data
,
5565 state_machine_regs
.op_index
= 0;
5566 state_machine_regs
.view
= 0;
5568 case DW_LNE_define_file
:
5569 file_table
= (File_Entry
*) xrealloc
5570 (file_table
, (n_files
+ 1) * sizeof (File_Entry
));
5572 ++state_machine_regs
.last_file_entry
;
5573 /* Source file name. */
5574 file_table
[n_files
].name
= (char *) op_code_data
;
5575 op_code_data
+= strlen ((char *) op_code_data
) + 1;
5576 /* Directory index. */
5577 READ_ULEB (file_table
[n_files
].directory_index
,
5578 op_code_data
, op_code_end
);
5579 /* Last modification time. */
5580 READ_ULEB (file_table
[n_files
].modification_date
,
5581 op_code_data
, op_code_end
);
5583 READ_ULEB (file_table
[n_files
].length
,
5584 op_code_data
, op_code_end
);
5588 case DW_LNE_set_discriminator
:
5589 case DW_LNE_HP_set_sequence
:
5590 /* Simply ignored. */
5594 printf (_("UNKNOWN (%u): length %ld\n"),
5595 ext_op_code
, (long int) (op_code_data
- data
));
5602 /* Increment view after printing this row. */
5605 case DW_LNS_advance_pc
:
5606 READ_ULEB (uladv
, data
, end
);
5607 if (linfo
.li_max_ops_per_insn
== 1)
5609 uladv
*= linfo
.li_min_insn_length
;
5610 state_machine_regs
.address
+= uladv
;
5612 state_machine_regs
.view
= 0;
5617 = ((state_machine_regs
.op_index
+ uladv
)
5618 / linfo
.li_max_ops_per_insn
)
5619 * linfo
.li_min_insn_length
;
5620 state_machine_regs
.address
5622 state_machine_regs
.op_index
5623 = (state_machine_regs
.op_index
+ uladv
)
5624 % linfo
.li_max_ops_per_insn
;
5626 state_machine_regs
.view
= 0;
5630 case DW_LNS_advance_line
:
5631 READ_SLEB (adv
, data
, end
);
5632 state_machine_regs
.line
+= adv
;
5635 case DW_LNS_set_file
:
5636 READ_ULEB (uladv
, data
, end
);
5637 state_machine_regs
.file
= uladv
;
5639 unsigned file
= state_machine_regs
.file
;
5640 if (linfo
.li_version
< 5)
5643 if (file_table
== NULL
|| n_files
== 0)
5644 printf (_("\n [Use file table entry %d]\n"), file
);
5646 else if (file
>= n_files
)
5648 warn (_("file index %u >= number of files %u\n"),
5650 printf (_("\n <over large file table index %u>"), file
);
5654 unsigned dir
= file_table
[file
].directory_index
;
5655 if (dir
== 0 && linfo
.li_version
< 5)
5656 /* If directory index is 0, that means compilation
5657 current directory. bfd/dwarf2.c shows
5658 DW_AT_comp_dir here but in keeping with the
5659 readelf practice of minimal interpretation of
5660 file data, we show "./". */
5661 printf ("\n./%s:[++]\n",
5662 null_name (file_table
[file
].name
));
5663 else if (directory_table
== NULL
|| n_directories
== 0)
5664 printf (_("\n [Use file %s "
5665 "in directory table entry %d]\n"),
5666 null_name (file_table
[file
].name
), dir
);
5669 if (linfo
.li_version
< 5)
5672 if (dir
>= n_directories
)
5674 warn (_("directory index %u "
5675 ">= number of directories %u\n"),
5676 dir
, n_directories
);
5677 printf (_("\n <over large directory table entry "
5681 printf ("\n%s/%s:\n",
5682 null_name (directory_table
[dir
]),
5683 null_name (file_table
[file
].name
));
5688 case DW_LNS_set_column
:
5689 READ_ULEB (uladv
, data
, end
);
5690 state_machine_regs
.column
= uladv
;
5693 case DW_LNS_negate_stmt
:
5694 adv
= state_machine_regs
.is_stmt
;
5696 state_machine_regs
.is_stmt
= adv
;
5699 case DW_LNS_set_basic_block
:
5700 state_machine_regs
.basic_block
= 1;
5703 case DW_LNS_const_add_pc
:
5704 uladv
= ((255 - linfo
.li_opcode_base
) / linfo
.li_line_range
);
5705 if (linfo
.li_max_ops_per_insn
== 1)
5707 uladv
*= linfo
.li_min_insn_length
;
5708 state_machine_regs
.address
+= uladv
;
5710 state_machine_regs
.view
= 0;
5715 = ((state_machine_regs
.op_index
+ uladv
)
5716 / linfo
.li_max_ops_per_insn
)
5717 * linfo
.li_min_insn_length
;
5718 state_machine_regs
.address
5720 state_machine_regs
.op_index
5721 = (state_machine_regs
.op_index
+ uladv
)
5722 % linfo
.li_max_ops_per_insn
;
5724 state_machine_regs
.view
= 0;
5728 case DW_LNS_fixed_advance_pc
:
5729 SAFE_BYTE_GET_AND_INC (uladv
, data
, 2, end
);
5730 state_machine_regs
.address
+= uladv
;
5731 state_machine_regs
.op_index
= 0;
5732 /* Do NOT reset view. */
5735 case DW_LNS_set_prologue_end
:
5738 case DW_LNS_set_epilogue_begin
:
5741 case DW_LNS_set_isa
:
5742 READ_ULEB (uladv
, data
, end
);
5743 printf (_(" Set ISA to %lu\n"), uladv
);
5747 printf (_(" Unknown opcode %d with operands: "), op_code
);
5749 if (standard_opcodes
!= NULL
)
5750 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
5754 READ_ULEB (val
, data
, end
);
5755 printf ("%#" PRIx64
"%s", val
, i
== 1 ? "" : ", ");
5761 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
5762 to the DWARF address/line matrix. */
5763 if ((is_special_opcode
) || (xop
== -DW_LNE_end_sequence
)
5764 || (xop
== DW_LNS_copy
))
5766 const unsigned int MAX_FILENAME_LENGTH
= 35;
5767 char *fileName
= NULL
;
5768 char *newFileName
= NULL
;
5769 size_t fileNameLength
;
5773 unsigned indx
= state_machine_regs
.file
;
5775 if (linfo
.li_version
< 5)
5778 if (indx
>= n_files
)
5780 warn (_("file index %u >= number of files %u\n"),
5782 fileName
= _("<corrupt>");
5785 fileName
= (char *) file_table
[indx
].name
;
5788 fileName
= _("<unknown>");
5790 fileNameLength
= strlen (fileName
);
5791 newFileName
= fileName
;
5792 if (fileNameLength
> MAX_FILENAME_LENGTH
&& !do_wide
)
5794 newFileName
= (char *) xmalloc (MAX_FILENAME_LENGTH
+ 1);
5795 /* Truncate file name */
5796 memcpy (newFileName
,
5797 fileName
+ fileNameLength
- MAX_FILENAME_LENGTH
,
5798 MAX_FILENAME_LENGTH
);
5799 newFileName
[MAX_FILENAME_LENGTH
] = 0;
5802 /* A row with end_seq set to true has a meaningful address, but
5803 the other information in the same row is not significant.
5804 In such a row, print line as "-", and don't print
5806 if (!do_wide
|| fileNameLength
<= MAX_FILENAME_LENGTH
)
5808 if (linfo
.li_max_ops_per_insn
== 1)
5810 if (xop
== -DW_LNE_end_sequence
)
5811 printf ("%-31s %11s %#18" PRIx64
,
5813 state_machine_regs
.address
);
5815 printf ("%-31s %11d %#18" PRIx64
,
5816 newFileName
, state_machine_regs
.line
,
5817 state_machine_regs
.address
);
5821 if (xop
== -DW_LNE_end_sequence
)
5822 printf ("%-31s %11s %#18" PRIx64
"[%d]",
5824 state_machine_regs
.address
,
5825 state_machine_regs
.op_index
);
5827 printf ("%-31s %11d %#18" PRIx64
"[%d]",
5828 newFileName
, state_machine_regs
.line
,
5829 state_machine_regs
.address
,
5830 state_machine_regs
.op_index
);
5835 if (linfo
.li_max_ops_per_insn
== 1)
5837 if (xop
== -DW_LNE_end_sequence
)
5838 printf ("%s %11s %#18" PRIx64
,
5840 state_machine_regs
.address
);
5842 printf ("%s %11d %#18" PRIx64
,
5843 newFileName
, state_machine_regs
.line
,
5844 state_machine_regs
.address
);
5848 if (xop
== -DW_LNE_end_sequence
)
5849 printf ("%s %11s %#18" PRIx64
"[%d]",
5851 state_machine_regs
.address
,
5852 state_machine_regs
.op_index
);
5854 printf ("%s %11d %#18" PRIx64
"[%d]",
5855 newFileName
, state_machine_regs
.line
,
5856 state_machine_regs
.address
,
5857 state_machine_regs
.op_index
);
5861 if (xop
!= -DW_LNE_end_sequence
)
5863 if (state_machine_regs
.view
)
5864 printf (" %6u", state_machine_regs
.view
);
5868 if (state_machine_regs
.is_stmt
)
5873 state_machine_regs
.view
++;
5875 if (xop
== -DW_LNE_end_sequence
)
5877 reset_state_machine (linfo
.li_default_is_stmt
);
5881 if (newFileName
!= fileName
)
5893 if (directory_table
)
5895 free (directory_table
);
5896 directory_table
= NULL
;
5907 display_debug_lines (struct dwarf_section
*section
, void *file
)
5909 unsigned char *data
= section
->start
;
5910 unsigned char *end
= data
+ section
->size
;
5912 int retValDecoded
= 1;
5914 if (do_debug_lines
== 0)
5915 do_debug_lines
|= FLAG_DEBUG_LINES_RAW
;
5917 if (do_debug_lines
& FLAG_DEBUG_LINES_RAW
)
5918 retValRaw
= display_debug_lines_raw (section
, data
, end
, file
);
5920 if (do_debug_lines
& FLAG_DEBUG_LINES_DECODED
)
5921 retValDecoded
= display_debug_lines_decoded (section
, data
, data
, end
, file
);
5923 if (!retValRaw
|| !retValDecoded
)
5930 find_debug_info_for_offset (uint64_t offset
)
5934 if (num_debug_info_entries
== DEBUG_INFO_UNAVAILABLE
)
5937 for (i
= 0; i
< num_debug_info_entries
; i
++)
5938 if (debug_information
[i
].cu_offset
== offset
)
5939 return debug_information
+ i
;
5945 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind
)
5947 /* See gdb/gdb-index.h. */
5948 static const char * const kinds
[] =
5960 return _ (kinds
[kind
]);
5964 display_debug_pubnames_worker (struct dwarf_section
*section
,
5965 void *file ATTRIBUTE_UNUSED
,
5968 DWARF2_Internal_PubNames names
;
5969 unsigned char *start
= section
->start
;
5970 unsigned char *end
= start
+ section
->size
;
5972 /* It does not matter if this load fails,
5973 we test for that later on. */
5974 load_debug_info (file
);
5976 introduce (section
, false);
5980 unsigned char *data
;
5981 unsigned long sec_off
= start
- section
->start
;
5982 unsigned int offset_size
;
5984 SAFE_BYTE_GET_AND_INC (names
.pn_length
, start
, 4, end
);
5985 if (names
.pn_length
== 0xffffffff)
5987 SAFE_BYTE_GET_AND_INC (names
.pn_length
, start
, 8, end
);
5993 if (names
.pn_length
> (size_t) (end
- start
))
5995 warn (_("Debug info is corrupted, "
5996 "%s header at %#lx has length %#" PRIx64
"\n"),
5997 section
->name
, sec_off
, names
.pn_length
);
6002 start
+= names
.pn_length
;
6004 SAFE_BYTE_GET_AND_INC (names
.pn_version
, data
, 2, start
);
6005 SAFE_BYTE_GET_AND_INC (names
.pn_offset
, data
, offset_size
, start
);
6007 if (num_debug_info_entries
!= DEBUG_INFO_UNAVAILABLE
6008 && num_debug_info_entries
> 0
6009 && find_debug_info_for_offset (names
.pn_offset
) == NULL
)
6010 warn (_(".debug_info offset of %#" PRIx64
6011 " in %s section does not point to a CU header.\n"),
6012 names
.pn_offset
, section
->name
);
6014 SAFE_BYTE_GET_AND_INC (names
.pn_size
, data
, offset_size
, start
);
6016 printf (_(" Length: %" PRId64
"\n"),
6018 printf (_(" Version: %d\n"),
6020 printf (_(" Offset into .debug_info section: %#" PRIx64
"\n"),
6022 printf (_(" Size of area in .debug_info section: %" PRId64
"\n"),
6025 if (names
.pn_version
!= 2 && names
.pn_version
!= 3)
6027 static int warned
= 0;
6031 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
6039 printf (_("\n Offset Kind Name\n"));
6041 printf (_("\n Offset\tName\n"));
6048 SAFE_BYTE_GET_AND_INC (offset
, data
, offset_size
, start
);
6055 maxprint
= (start
- data
) - 1;
6059 unsigned int kind_data
;
6060 gdb_index_symbol_kind kind
;
6061 const char *kind_name
;
6064 SAFE_BYTE_GET_AND_INC (kind_data
, data
, 1, start
);
6066 /* GCC computes the kind as the upper byte in the CU index
6067 word, and then right shifts it by the CU index size.
6068 Left shift KIND to where the gdb-index.h accessor macros
6070 kind_data
<<= GDB_INDEX_CU_BITSIZE
;
6071 kind
= GDB_INDEX_SYMBOL_KIND_VALUE (kind_data
);
6072 kind_name
= get_gdb_index_symbol_kind_name (kind
);
6073 is_static
= GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data
);
6074 printf (" %-6" PRIx64
" %s,%-10s %.*s\n",
6075 offset
, is_static
? _("s") : _("g"),
6076 kind_name
, (int) maxprint
, data
);
6079 printf (" %-6" PRIx64
"\t%.*s\n",
6080 offset
, (int) maxprint
, data
);
6082 data
+= strnlen ((char *) data
, maxprint
);
6095 display_debug_pubnames (struct dwarf_section
*section
, void *file
)
6097 return display_debug_pubnames_worker (section
, file
, 0);
6101 display_debug_gnu_pubnames (struct dwarf_section
*section
, void *file
)
6103 return display_debug_pubnames_worker (section
, file
, 1);
6107 display_debug_macinfo (struct dwarf_section
*section
,
6108 void *file ATTRIBUTE_UNUSED
)
6110 unsigned char *start
= section
->start
;
6111 unsigned char *end
= start
+ section
->size
;
6112 unsigned char *curr
= start
;
6113 enum dwarf_macinfo_record_type op
;
6115 introduce (section
, false);
6119 unsigned int lineno
;
6120 const unsigned char *string
;
6122 op
= (enum dwarf_macinfo_record_type
) *curr
;
6127 case DW_MACINFO_start_file
:
6129 unsigned int filenum
;
6131 READ_ULEB (lineno
, curr
, end
);
6132 READ_ULEB (filenum
, curr
, end
);
6133 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
6138 case DW_MACINFO_end_file
:
6139 printf (_(" DW_MACINFO_end_file\n"));
6142 case DW_MACINFO_define
:
6143 READ_ULEB (lineno
, curr
, end
);
6145 curr
+= strnlen ((char *) string
, end
- string
);
6146 printf (_(" DW_MACINFO_define - lineno : %d macro : %*s\n"),
6147 lineno
, (int) (curr
- string
), string
);
6152 case DW_MACINFO_undef
:
6153 READ_ULEB (lineno
, curr
, end
);
6155 curr
+= strnlen ((char *) string
, end
- string
);
6156 printf (_(" DW_MACINFO_undef - lineno : %d macro : %*s\n"),
6157 lineno
, (int) (curr
- string
), string
);
6162 case DW_MACINFO_vendor_ext
:
6164 unsigned int constant
;
6166 READ_ULEB (constant
, curr
, end
);
6168 curr
+= strnlen ((char *) string
, end
- string
);
6169 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %*s\n"),
6170 constant
, (int) (curr
- string
), string
);
6181 /* Given LINE_OFFSET into the .debug_line section, attempt to return
6182 filename and dirname corresponding to file name table entry with index
6183 FILEIDX. Return NULL on failure. */
6185 static unsigned char *
6186 get_line_filename_and_dirname (uint64_t line_offset
,
6188 unsigned char **dir_name
)
6190 struct dwarf_section
*section
= &debug_displays
[line
].section
;
6191 unsigned char *hdrptr
, *dirtable
, *file_name
;
6192 unsigned int offset_size
;
6193 unsigned int version
, opcode_base
;
6194 uint64_t length
, diridx
;
6195 const unsigned char * end
;
6198 if (section
->start
== NULL
6199 || line_offset
>= section
->size
6203 hdrptr
= section
->start
+ line_offset
;
6204 end
= section
->start
+ section
->size
;
6206 SAFE_BYTE_GET_AND_INC (length
, hdrptr
, 4, end
);
6207 if (length
== 0xffffffff)
6209 /* This section is 64-bit DWARF 3. */
6210 SAFE_BYTE_GET_AND_INC (length
, hdrptr
, 8, end
);
6216 if (length
> (size_t) (end
- hdrptr
)
6217 || length
< 2 + offset_size
+ 1 + 3 + 1)
6219 end
= hdrptr
+ length
;
6221 SAFE_BYTE_GET_AND_INC (version
, hdrptr
, 2, end
);
6222 if (version
!= 2 && version
!= 3 && version
!= 4)
6224 hdrptr
+= offset_size
+ 1;/* Skip prologue_length and min_insn_length. */
6226 hdrptr
++; /* Skip max_ops_per_insn. */
6227 hdrptr
+= 3; /* Skip default_is_stmt, line_base, line_range. */
6229 SAFE_BYTE_GET_AND_INC (opcode_base
, hdrptr
, 1, end
);
6230 if (opcode_base
== 0
6231 || opcode_base
- 1 >= (size_t) (end
- hdrptr
))
6234 hdrptr
+= opcode_base
- 1;
6237 /* Skip over dirname table. */
6238 while (*hdrptr
!= '\0')
6240 hdrptr
+= strnlen ((char *) hdrptr
, end
- hdrptr
);
6246 hdrptr
++; /* Skip the NUL at the end of the table. */
6248 /* Now skip over preceding filename table entries. */
6249 for (; hdrptr
< end
&& *hdrptr
!= '\0' && fileidx
> 1; fileidx
--)
6251 hdrptr
+= strnlen ((char *) hdrptr
, end
- hdrptr
);
6254 SKIP_ULEB (hdrptr
, end
);
6255 SKIP_ULEB (hdrptr
, end
);
6256 SKIP_ULEB (hdrptr
, end
);
6258 if (hdrptr
>= end
|| *hdrptr
== '\0')
6262 hdrptr
+= strnlen ((char *) hdrptr
, end
- hdrptr
);
6267 READ_ULEB (diridx
, hdrptr
, end
);
6270 for (; dirtable
< end
&& *dirtable
!= '\0' && diridx
> 1; diridx
--)
6272 dirtable
+= strnlen ((char *) dirtable
, end
- dirtable
);
6276 if (dirtable
>= end
|| *dirtable
== '\0')
6278 *dir_name
= dirtable
;
6283 display_debug_macro (struct dwarf_section
*section
,
6286 unsigned char *start
= section
->start
;
6287 unsigned char *end
= start
+ section
->size
;
6288 unsigned char *curr
= start
;
6289 unsigned char *extended_op_buf
[256];
6290 bool is_dwo
= false;
6291 const char *suffix
= strrchr (section
->name
, '.');
6293 if (suffix
&& strcmp (suffix
, ".dwo") == 0)
6296 load_debug_section_with_follow (str
, file
);
6297 load_debug_section_with_follow (line
, file
);
6298 load_debug_section_with_follow (str_index
, file
);
6300 introduce (section
, false);
6304 unsigned int lineno
, version
, flags
;
6305 unsigned int offset_size
;
6306 const unsigned char *string
;
6307 uint64_t line_offset
= 0, sec_offset
= curr
- start
, offset
;
6308 unsigned char **extended_ops
= NULL
;
6310 SAFE_BYTE_GET_AND_INC (version
, curr
, 2, end
);
6311 if (version
!= 4 && version
!= 5)
6313 error (_("Expected to find a version number of 4 or 5 in section %s but found %d instead\n"),
6314 section
->name
, version
);
6318 SAFE_BYTE_GET_AND_INC (flags
, curr
, 1, end
);
6319 offset_size
= (flags
& 1) ? 8 : 4;
6320 printf (_(" Offset: %#" PRIx64
"\n"), sec_offset
);
6321 printf (_(" Version: %d\n"), version
);
6322 printf (_(" Offset size: %d\n"), offset_size
);
6325 SAFE_BYTE_GET_AND_INC (line_offset
, curr
, offset_size
, end
);
6326 printf (_(" Offset into .debug_line: %#" PRIx64
"\n"),
6331 unsigned int i
, count
, op
;
6334 SAFE_BYTE_GET_AND_INC (count
, curr
, 1, end
);
6336 memset (extended_op_buf
, 0, sizeof (extended_op_buf
));
6337 extended_ops
= extended_op_buf
;
6340 printf (_(" Extension opcode arguments:\n"));
6341 for (i
= 0; i
< count
; i
++)
6343 SAFE_BYTE_GET_AND_INC (op
, curr
, 1, end
);
6344 extended_ops
[op
] = curr
;
6345 READ_ULEB (nargs
, curr
, end
);
6347 printf (_(" DW_MACRO_%02x has no arguments\n"), op
);
6350 printf (_(" DW_MACRO_%02x arguments: "), op
);
6351 for (n
= 0; n
< nargs
; n
++)
6355 SAFE_BYTE_GET_AND_INC (form
, curr
, 1, end
);
6356 printf ("%s%s", get_FORM_name (form
),
6357 n
== nargs
- 1 ? "\n" : ", ");
6367 case DW_FORM_block1
:
6368 case DW_FORM_block2
:
6369 case DW_FORM_block4
:
6371 case DW_FORM_string
:
6373 case DW_FORM_sec_offset
:
6376 error (_("Invalid extension opcode form %s\n"),
6377 get_FORM_name (form
));
6393 error (_(".debug_macro section not zero terminated\n"));
6397 SAFE_BYTE_GET_AND_INC (op
, curr
, 1, end
);
6403 case DW_MACRO_define
:
6404 READ_ULEB (lineno
, curr
, end
);
6406 curr
+= strnlen ((char *) string
, end
- string
);
6407 printf (_(" DW_MACRO_define - lineno : %d macro : %*s\n"),
6408 lineno
, (int) (curr
- string
), string
);
6413 case DW_MACRO_undef
:
6414 READ_ULEB (lineno
, curr
, end
);
6416 curr
+= strnlen ((char *) string
, end
- string
);
6417 printf (_(" DW_MACRO_undef - lineno : %d macro : %*s\n"),
6418 lineno
, (int) (curr
- string
), string
);
6423 case DW_MACRO_start_file
:
6425 unsigned int filenum
;
6426 unsigned char *file_name
= NULL
, *dir_name
= NULL
;
6428 READ_ULEB (lineno
, curr
, end
);
6429 READ_ULEB (filenum
, curr
, end
);
6431 if ((flags
& 2) == 0)
6432 error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n"));
6435 = get_line_filename_and_dirname (line_offset
, filenum
,
6437 if (file_name
== NULL
)
6438 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d\n"),
6441 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
6443 dir_name
!= NULL
? (const char *) dir_name
: "",
6444 dir_name
!= NULL
? "/" : "", file_name
);
6448 case DW_MACRO_end_file
:
6449 printf (_(" DW_MACRO_end_file\n"));
6452 case DW_MACRO_define_strp
:
6453 READ_ULEB (lineno
, curr
, end
);
6454 if (version
== 4 && is_dwo
)
6455 READ_ULEB (offset
, curr
, end
);
6457 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6458 string
= fetch_indirect_string (offset
);
6459 printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
6463 case DW_MACRO_undef_strp
:
6464 READ_ULEB (lineno
, curr
, end
);
6465 if (version
== 4 && is_dwo
)
6466 READ_ULEB (offset
, curr
, end
);
6468 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6469 string
= fetch_indirect_string (offset
);
6470 printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
6474 case DW_MACRO_import
:
6475 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6476 printf (_(" DW_MACRO_import - offset : %#" PRIx64
"\n"),
6480 case DW_MACRO_define_sup
:
6481 READ_ULEB (lineno
, curr
, end
);
6482 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6483 printf (_(" DW_MACRO_define_sup - lineno : %d"
6484 " macro offset : %#" PRIx64
"\n"),
6488 case DW_MACRO_undef_sup
:
6489 READ_ULEB (lineno
, curr
, end
);
6490 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6491 printf (_(" DW_MACRO_undef_sup - lineno : %d"
6492 " macro offset : %#" PRIx64
"\n"),
6496 case DW_MACRO_import_sup
:
6497 SAFE_BYTE_GET_AND_INC (offset
, curr
, offset_size
, end
);
6498 printf (_(" DW_MACRO_import_sup - offset : %#" PRIx64
"\n"),
6502 case DW_MACRO_define_strx
:
6503 case DW_MACRO_undef_strx
:
6504 READ_ULEB (lineno
, curr
, end
);
6505 READ_ULEB (offset
, curr
, end
);
6506 string
= (const unsigned char *)
6507 fetch_indexed_string (offset
, NULL
, offset_size
, false, 0);
6508 if (op
== DW_MACRO_define_strx
)
6509 printf (" DW_MACRO_define_strx ");
6511 printf (" DW_MACRO_undef_strx ");
6513 printf (_("(with offset %#" PRIx64
") "), offset
);
6514 printf (_("lineno : %d macro : %s\n"),
6519 if (op
>= DW_MACRO_lo_user
&& op
<= DW_MACRO_hi_user
)
6521 printf (_(" <Target Specific macro op: %#x - UNHANDLED"), op
);
6525 if (extended_ops
== NULL
|| extended_ops
[op
] == NULL
)
6527 error (_(" Unknown macro opcode %02x seen\n"), op
);
6532 /* Skip over unhandled opcodes. */
6534 unsigned char *desc
= extended_ops
[op
];
6535 READ_ULEB (nargs
, desc
, end
);
6538 printf (_(" DW_MACRO_%02x\n"), op
);
6541 printf (_(" DW_MACRO_%02x -"), op
);
6542 for (n
= 0; n
< nargs
; n
++)
6546 /* DW_FORM_implicit_const is not expected here. */
6547 SAFE_BYTE_GET_AND_INC (val
, desc
, 1, end
);
6549 = read_and_display_attr_value (0, val
, 0,
6550 start
, curr
, end
, 0, 0,
6551 offset_size
, version
,
6570 display_debug_abbrev (struct dwarf_section
*section
,
6571 void *file ATTRIBUTE_UNUSED
)
6573 abbrev_entry
*entry
;
6574 unsigned char *start
= section
->start
;
6576 introduce (section
, false);
6580 uint64_t offset
= start
- section
->start
;
6581 abbrev_list
*list
= find_and_process_abbrev_set (section
, 0,
6582 section
->size
, offset
,
6587 if (list
->first_abbrev
)
6588 printf (_(" Number TAG (%#" PRIx64
")\n"), offset
);
6590 for (entry
= list
->first_abbrev
; entry
; entry
= entry
->next
)
6594 printf (" %ld %s [%s]\n",
6596 get_TAG_name (entry
->tag
),
6597 entry
->children
? _("has children") : _("no children"));
6599 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6601 printf (" %-18s %s",
6602 get_AT_name (attr
->attribute
),
6603 get_FORM_name (attr
->form
));
6604 if (attr
->form
== DW_FORM_implicit_const
)
6605 printf (": %" PRId64
, attr
->implicit_const
);
6609 start
= list
->start_of_next_abbrevs
;
6610 free_abbrev_list (list
);
6619 /* Return true when ADDR is the maximum address, when addresses are
6620 POINTER_SIZE bytes long. */
6623 is_max_address (uint64_t addr
, unsigned int pointer_size
)
6625 uint64_t mask
= ~(~(uint64_t) 0 << 1 << (pointer_size
* 8 - 1));
6626 return ((addr
& mask
) == mask
);
6629 /* Display a view pair list starting at *VSTART_PTR and ending at
6630 VLISTEND within SECTION. */
6633 display_view_pair_list (struct dwarf_section
*section
,
6634 unsigned char **vstart_ptr
,
6635 unsigned int debug_info_entry
,
6636 unsigned char *vlistend
)
6638 unsigned char *vstart
= *vstart_ptr
;
6639 unsigned char *section_end
= section
->start
+ section
->size
;
6640 unsigned int pointer_size
= debug_information
[debug_info_entry
].pointer_size
;
6642 if (vlistend
< section_end
)
6643 section_end
= vlistend
;
6647 while (vstart
< section_end
)
6649 uint64_t off
= vstart
- section
->start
;
6650 uint64_t vbegin
, vend
;
6652 READ_ULEB (vbegin
, vstart
, section_end
);
6653 if (vstart
== section_end
)
6656 READ_ULEB (vend
, vstart
, section_end
);
6657 printf (" %8.8" PRIx64
" ", off
);
6659 print_view (vbegin
, pointer_size
);
6660 print_view (vend
, pointer_size
);
6661 printf (_("location view pair\n"));
6665 *vstart_ptr
= vstart
;
6668 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
6671 display_loc_list (struct dwarf_section
*section
,
6672 unsigned char **start_ptr
,
6673 unsigned int debug_info_entry
,
6675 uint64_t base_address
,
6676 unsigned char **vstart_ptr
,
6679 unsigned char *start
= *start_ptr
, *vstart
= *vstart_ptr
;
6680 unsigned char *section_end
= section
->start
+ section
->size
;
6682 unsigned int pointer_size
;
6683 unsigned int offset_size
;
6687 unsigned short length
;
6688 int need_frame_base
;
6690 if (debug_info_entry
>= num_debug_info_entries
)
6692 warn (_("No debug information available for loc lists of entry: %u\n"),
6697 cu_offset
= debug_information
[debug_info_entry
].cu_offset
;
6698 pointer_size
= debug_information
[debug_info_entry
].pointer_size
;
6699 offset_size
= debug_information
[debug_info_entry
].offset_size
;
6700 dwarf_version
= debug_information
[debug_info_entry
].dwarf_version
;
6702 if (pointer_size
< 2 || pointer_size
> 8)
6704 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6705 pointer_size
, debug_info_entry
);
6711 uint64_t off
= offset
+ (start
- *start_ptr
);
6712 uint64_t vbegin
= -1, vend
= -1;
6714 if (2 * pointer_size
> (size_t) (section_end
- start
))
6716 warn (_("Location list starting at offset %#" PRIx64
6717 " is not terminated.\n"), offset
);
6724 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, section_end
);
6725 SAFE_BYTE_GET_AND_INC (end
, start
, pointer_size
, section_end
);
6727 if (begin
== 0 && end
== 0)
6729 /* PR 18374: In a object file we can have a location list that
6730 starts with a begin and end of 0 because there are relocations
6731 that need to be applied to the addresses. Actually applying
6732 the relocations now does not help as they will probably resolve
6733 to 0, since the object file has not been fully linked. Real
6734 end of list markers will not have any relocations against them. */
6735 if (! reloc_at (section
, off
)
6736 && ! reloc_at (section
, off
+ pointer_size
))
6738 printf (_("<End of list>\n"));
6743 /* Check base address specifiers. */
6744 if (is_max_address (begin
, pointer_size
)
6745 && !is_max_address (end
, pointer_size
))
6748 print_hex (begin
, pointer_size
);
6749 print_hex (end
, pointer_size
);
6750 printf (_("(base address)\n"));
6756 off
= offset
+ (vstart
- *start_ptr
);
6758 READ_ULEB (vbegin
, vstart
, section_end
);
6759 print_view (vbegin
, pointer_size
);
6761 READ_ULEB (vend
, vstart
, section_end
);
6762 print_view (vend
, pointer_size
);
6764 printf (_("views at %8.8" PRIx64
" for:\n %*s "), off
, 8, "");
6767 if (2 > (size_t) (section_end
- start
))
6769 warn (_("Location list starting at offset %#" PRIx64
6770 " is not terminated.\n"), offset
);
6774 SAFE_BYTE_GET_AND_INC (length
, start
, 2, section_end
);
6776 if (length
> (size_t) (section_end
- start
))
6778 warn (_("Location list starting at offset %#" PRIx64
6779 " is not terminated.\n"), offset
);
6783 print_hex (begin
+ base_address
, pointer_size
);
6784 print_hex (end
+ base_address
, pointer_size
);
6787 need_frame_base
= decode_location_expression (start
,
6792 cu_offset
, section
);
6795 if (need_frame_base
&& !has_frame_base
)
6796 printf (_(" [without DW_AT_frame_base]"));
6798 if (begin
== end
&& vbegin
== vend
)
6799 fputs (_(" (start == end)"), stdout
);
6800 else if (begin
> end
|| (begin
== end
&& vbegin
> vend
))
6801 fputs (_(" (start > end)"), stdout
);
6809 *vstart_ptr
= vstart
;
6812 /* Display a location list from a normal (ie, non-dwo) .debug_loclists section. */
6815 display_loclists_list (struct dwarf_section
* section
,
6816 unsigned char ** start_ptr
,
6817 debug_info
* debug_info_p
,
6819 uint64_t base_address
,
6820 unsigned char ** vstart_ptr
,
6823 unsigned char *start
= *start_ptr
;
6824 unsigned char *vstart
= *vstart_ptr
;
6825 unsigned char *section_end
= section
->start
+ section
->size
;
6827 unsigned int pointer_size
;
6828 unsigned int offset_size
;
6829 unsigned int dwarf_version
;
6832 /* Initialize it due to a false compiler warning. */
6833 uint64_t begin
= -1, vbegin
= -1;
6834 uint64_t end
= -1, vend
= -1;
6836 int need_frame_base
;
6838 cu_offset
= debug_info_p
->cu_offset
;
6839 pointer_size
= debug_info_p
->pointer_size
;
6840 offset_size
= debug_info_p
->offset_size
;
6841 dwarf_version
= debug_info_p
->dwarf_version
;
6843 if (pointer_size
< 2 || pointer_size
> 8)
6845 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6846 pointer_size
, (int)(debug_info_p
- debug_information
));
6852 uint64_t off
= offset
+ (start
- *start_ptr
);
6853 enum dwarf_location_list_entry_type llet
;
6855 if (start
+ 1 > section_end
)
6857 warn (_("Location list starting at offset %#" PRIx64
6858 " is not terminated.\n"), offset
);
6865 SAFE_BYTE_GET_AND_INC (llet
, start
, 1, section_end
);
6867 if (vstart
&& (llet
== DW_LLE_offset_pair
6868 || llet
== DW_LLE_start_end
6869 || llet
== DW_LLE_start_length
))
6871 off
= offset
+ (vstart
- *start_ptr
);
6873 READ_ULEB (vbegin
, vstart
, section_end
);
6874 print_view (vbegin
, pointer_size
);
6876 READ_ULEB (vend
, vstart
, section_end
);
6877 print_view (vend
, pointer_size
);
6879 printf (_("views at %8.8" PRIx64
" for:\n %*s "), off
, 8, "");
6884 case DW_LLE_end_of_list
:
6885 printf (_("<End of list>\n"));
6888 case DW_LLE_base_addressx
:
6889 READ_ULEB (idx
, start
, section_end
);
6890 print_hex (idx
, pointer_size
);
6891 printf (_("(index into .debug_addr) "));
6892 base_address
= fetch_indexed_addr
6893 (debug_info_p
->addr_base
+ idx
* pointer_size
, pointer_size
);
6894 print_hex (base_address
, pointer_size
);
6895 printf (_("(base address)\n"));
6898 case DW_LLE_startx_endx
:
6899 READ_ULEB (idx
, start
, section_end
);
6900 begin
= fetch_indexed_addr
6901 (debug_info_p
->addr_base
+ idx
* pointer_size
, pointer_size
);
6902 READ_ULEB (idx
, start
, section_end
);
6903 end
= fetch_indexed_addr
6904 (debug_info_p
->addr_base
+ idx
* pointer_size
, pointer_size
);
6907 case DW_LLE_startx_length
:
6908 READ_ULEB (idx
, start
, section_end
);
6909 begin
= fetch_indexed_addr
6910 (debug_info_p
->addr_base
+ idx
* pointer_size
, pointer_size
);
6911 READ_ULEB (end
, start
, section_end
);
6915 case DW_LLE_default_location
:
6919 case DW_LLE_offset_pair
:
6920 READ_ULEB (begin
, start
, section_end
);
6921 begin
+= base_address
;
6922 READ_ULEB (end
, start
, section_end
);
6923 end
+= base_address
;
6926 case DW_LLE_base_address
:
6927 SAFE_BYTE_GET_AND_INC (base_address
, start
, pointer_size
,
6929 print_hex (base_address
, pointer_size
);
6930 printf (_("(base address)\n"));
6933 case DW_LLE_start_end
:
6934 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, section_end
);
6935 SAFE_BYTE_GET_AND_INC (end
, start
, pointer_size
, section_end
);
6938 case DW_LLE_start_length
:
6939 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, section_end
);
6940 READ_ULEB (end
, start
, section_end
);
6944 #ifdef DW_LLE_view_pair
6945 case DW_LLE_view_pair
:
6947 printf (_("View pair entry in loclist with locviews attribute\n"));
6948 READ_ULEB (vbegin
, start
, section_end
);
6949 print_view (vbegin
, pointer_size
);
6951 READ_ULEB (vend
, start
, section_end
);
6952 print_view (vend
, pointer_size
);
6954 printf (_("views for:\n"));
6959 error (_("Invalid location list entry type %d\n"), llet
);
6963 if (llet
== DW_LLE_end_of_list
)
6966 if (llet
== DW_LLE_base_address
6967 || llet
== DW_LLE_base_addressx
)
6970 if (start
== section_end
)
6972 warn (_("Location list starting at offset %#" PRIx64
6973 " is not terminated.\n"), offset
);
6976 READ_ULEB (length
, start
, section_end
);
6978 if (length
> (size_t) (section_end
- start
))
6980 warn (_("Location list starting at offset %#" PRIx64
6981 " is not terminated.\n"), offset
);
6985 print_hex (begin
, pointer_size
);
6986 print_hex (end
, pointer_size
);
6989 need_frame_base
= decode_location_expression (start
,
6994 cu_offset
, section
);
6997 if (need_frame_base
&& !has_frame_base
)
6998 printf (_(" [without DW_AT_frame_base]"));
7000 if (begin
== end
&& vbegin
== vend
)
7001 fputs (_(" (start == end)"), stdout
);
7002 else if (begin
> end
|| (begin
== end
&& vbegin
> vend
))
7003 fputs (_(" (start > end)"), stdout
);
7011 if (vbegin
!= (uint64_t) -1 || vend
!= (uint64_t) -1)
7012 printf (_("Trailing view pair not used in a range"));
7015 *vstart_ptr
= vstart
;
7018 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
7019 right-adjusted in a field of length LEN, and followed by a space. */
7022 print_addr_index (unsigned int idx
, unsigned int len
)
7024 static char buf
[15];
7025 snprintf (buf
, sizeof (buf
), "[%d]", idx
);
7026 printf ("%*s ", len
, buf
);
7029 /* Display a location list from a .dwo section. It uses address indexes rather
7030 than embedded addresses. This code closely follows display_loc_list, but the
7031 two are sufficiently different that combining things is very ugly. */
7034 display_loc_list_dwo (struct dwarf_section
*section
,
7035 unsigned char **start_ptr
,
7036 unsigned int debug_info_entry
,
7038 unsigned char **vstart_ptr
,
7041 unsigned char *start
= *start_ptr
, *vstart
= *vstart_ptr
;
7042 unsigned char *section_end
= section
->start
+ section
->size
;
7044 unsigned int pointer_size
;
7045 unsigned int offset_size
;
7048 unsigned short length
;
7049 int need_frame_base
;
7052 if (debug_info_entry
>= num_debug_info_entries
)
7054 warn (_("No debug information for loc lists of entry: %u\n"),
7059 cu_offset
= debug_information
[debug_info_entry
].cu_offset
;
7060 pointer_size
= debug_information
[debug_info_entry
].pointer_size
;
7061 offset_size
= debug_information
[debug_info_entry
].offset_size
;
7062 dwarf_version
= debug_information
[debug_info_entry
].dwarf_version
;
7064 if (pointer_size
< 2 || pointer_size
> 8)
7066 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
7067 pointer_size
, debug_info_entry
);
7074 print_hex (offset
+ (start
- *start_ptr
), 4);
7076 if (start
>= section_end
)
7078 warn (_("Location list starting at offset %#" PRIx64
7079 " is not terminated.\n"), offset
);
7083 SAFE_BYTE_GET_AND_INC (entry_type
, start
, 1, section_end
);
7096 uint64_t off
= offset
+ (vstart
- *start_ptr
);
7098 READ_ULEB (view
, vstart
, section_end
);
7099 print_view (view
, 8);
7101 READ_ULEB (view
, vstart
, section_end
);
7102 print_view (view
, 8);
7104 printf (_("views at %8.8" PRIx64
" for:\n %*s "), off
, 8, "");
7112 case 0: /* A terminating entry. */
7114 *vstart_ptr
= vstart
;
7115 printf (_("<End of list>\n"));
7117 case 1: /* A base-address entry. */
7118 READ_ULEB (idx
, start
, section_end
);
7119 print_addr_index (idx
, 8);
7120 printf ("%*s", 9 + (vstart
? 2 * 6 : 0), "");
7121 printf (_("(base address selection entry)\n"));
7123 case 2: /* A start/end entry. */
7124 READ_ULEB (idx
, start
, section_end
);
7125 print_addr_index (idx
, 8);
7126 READ_ULEB (idx
, start
, section_end
);
7127 print_addr_index (idx
, 8);
7129 case 3: /* A start/length entry. */
7130 READ_ULEB (idx
, start
, section_end
);
7131 print_addr_index (idx
, 8);
7132 SAFE_BYTE_GET_AND_INC (idx
, start
, 4, section_end
);
7133 printf ("%08x ", idx
);
7135 case 4: /* An offset pair entry. */
7136 SAFE_BYTE_GET_AND_INC (idx
, start
, 4, section_end
);
7137 printf ("%08x ", idx
);
7138 SAFE_BYTE_GET_AND_INC (idx
, start
, 4, section_end
);
7139 printf ("%08x ", idx
);
7142 warn (_("Unknown location list entry type 0x%x.\n"), entry_type
);
7144 *vstart_ptr
= vstart
;
7148 if (2 > (size_t) (section_end
- start
))
7150 warn (_("Location list starting at offset %#" PRIx64
7151 " is not terminated.\n"), offset
);
7155 SAFE_BYTE_GET_AND_INC (length
, start
, 2, section_end
);
7156 if (length
> (size_t) (section_end
- start
))
7158 warn (_("Location list starting at offset %#" PRIx64
7159 " is not terminated.\n"), offset
);
7164 need_frame_base
= decode_location_expression (start
,
7169 cu_offset
, section
);
7172 if (need_frame_base
&& !has_frame_base
)
7173 printf (_(" [without DW_AT_frame_base]"));
7181 *vstart_ptr
= vstart
;
7184 /* Sort array of indexes in ascending order of loc_offsets[idx] and
7187 static uint64_t *loc_offsets
, *loc_views
;
7190 loc_offsets_compar (const void *ap
, const void *bp
)
7192 uint64_t a
= loc_offsets
[*(const unsigned int *) ap
];
7193 uint64_t b
= loc_offsets
[*(const unsigned int *) bp
];
7195 int ret
= (a
> b
) - (b
> a
);
7199 a
= loc_views
[*(const unsigned int *) ap
];
7200 b
= loc_views
[*(const unsigned int *) bp
];
7202 ret
= (a
> b
) - (b
> a
);
7207 /* Reads and dumps the DWARFv5 loclists compiler unit header,
7208 including the offset table.
7209 Returns the offset of the next compile unit header. */
7212 display_loclists_unit_header (struct dwarf_section
* section
,
7213 uint64_t header_offset
,
7214 uint32_t * offset_count
,
7215 unsigned char ** loclists_start
)
7218 unsigned char *start
= section
->start
+ header_offset
;
7219 unsigned char *end
= section
->start
+ section
->size
;
7220 unsigned short version
;
7221 unsigned char address_size
;
7222 unsigned char segment_selector_size
;
7226 printf (_("Table at Offset %#" PRIx64
"\n"), header_offset
);
7228 SAFE_BYTE_GET_AND_INC (length
, start
, 4, end
);
7229 if (length
== 0xffffffff)
7232 SAFE_BYTE_GET_AND_INC (length
, start
, 8, end
);
7237 SAFE_BYTE_GET_AND_INC (version
, start
, 2, end
);
7238 SAFE_BYTE_GET_AND_INC (address_size
, start
, 1, end
);
7239 SAFE_BYTE_GET_AND_INC (segment_selector_size
, start
, 1, end
);
7240 SAFE_BYTE_GET_AND_INC (*offset_count
, start
, 4, end
);
7242 printf (_(" Length: %#" PRIx64
"\n"), length
);
7243 printf (_(" DWARF version: %u\n"), version
);
7244 printf (_(" Address size: %u\n"), address_size
);
7245 printf (_(" Segment size: %u\n"), segment_selector_size
);
7246 printf (_(" Offset entries: %u\n"), *offset_count
);
7248 if (segment_selector_size
!= 0)
7250 warn (_("The %s section contains an "
7251 "unsupported segment selector size: %d.\n"),
7252 section
->name
, segment_selector_size
);
7253 return (uint64_t)-1;
7258 printf (_("\n Offset Entries starting at %#tx:\n"),
7259 start
- section
->start
);
7261 for (i
= 0; i
< *offset_count
; i
++)
7265 SAFE_BYTE_GET_AND_INC (entry
, start
, is_64bit
? 8 : 4, end
);
7266 printf (_(" [%6u] %#" PRIx64
"\n"), i
, entry
);
7271 *loclists_start
= start
;
7273 /* The length field doesn't include the length field itself. */
7274 return header_offset
+ length
+ (is_64bit
? 12 : 4);
7278 display_debug_loc (struct dwarf_section
*section
, void *file
)
7280 unsigned char *start
= section
->start
, *vstart
= NULL
;
7282 unsigned char *section_begin
= start
;
7283 unsigned int num_loc_list
= 0;
7284 uint64_t last_offset
= 0;
7285 uint64_t last_view
= 0;
7286 unsigned int first
= 0;
7289 int seen_first_offset
= 0;
7290 int locs_sorted
= 1;
7291 unsigned char *next
= start
, *vnext
= vstart
;
7292 unsigned int *array
= NULL
;
7293 const char *suffix
= strrchr (section
->name
, '.');
7294 bool is_dwo
= false;
7295 int is_loclists
= strstr (section
->name
, "debug_loclists") != NULL
;
7296 uint64_t next_header_offset
= 0;
7298 if (suffix
&& strcmp (suffix
, ".dwo") == 0)
7301 bytes
= section
->size
;
7305 printf (_("\nThe %s section is empty.\n"), section
->name
);
7311 unsigned char *hdrptr
= section_begin
;
7313 unsigned short ll_version
;
7314 unsigned char *end
= section_begin
+ section
->size
;
7315 unsigned char address_size
, segment_selector_size
;
7316 uint32_t offset_entry_count
;
7318 SAFE_BYTE_GET_AND_INC (ll_length
, hdrptr
, 4, end
);
7319 if (ll_length
== 0xffffffff)
7320 SAFE_BYTE_GET_AND_INC (ll_length
, hdrptr
, 8, end
);
7322 SAFE_BYTE_GET_AND_INC (ll_version
, hdrptr
, 2, end
);
7323 if (ll_version
!= 5)
7325 warn (_("The %s section contains corrupt or "
7326 "unsupported version number: %d.\n"),
7327 section
->name
, ll_version
);
7331 SAFE_BYTE_GET_AND_INC (address_size
, hdrptr
, 1, end
);
7333 SAFE_BYTE_GET_AND_INC (segment_selector_size
, hdrptr
, 1, end
);
7334 if (segment_selector_size
!= 0)
7336 warn (_("The %s section contains "
7337 "unsupported segment selector size: %d.\n"),
7338 section
->name
, segment_selector_size
);
7342 SAFE_BYTE_GET_AND_INC (offset_entry_count
, hdrptr
, 4, end
);
7344 /*if (offset_entry_count != 0)
7345 return display_offset_entry_loclists (section);*/
7347 //header_size = hdrptr - section_begin;
7350 if (load_debug_info (file
) == 0)
7352 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7357 /* Check the order of location list in .debug_info section. If
7358 offsets of location lists are in the ascending order, we can
7359 use `debug_information' directly. */
7360 for (i
= 0; i
< num_debug_info_entries
; i
++)
7364 num
= debug_information
[i
].num_loc_offsets
;
7365 if (num
> num_loc_list
)
7368 /* Check if we can use `debug_information' directly. */
7369 if (locs_sorted
&& num
!= 0)
7371 if (!seen_first_offset
)
7373 /* This is the first location list. */
7374 last_offset
= debug_information
[i
].loc_offsets
[0];
7375 last_view
= debug_information
[i
].loc_views
[0];
7377 seen_first_offset
= 1;
7383 for (; j
< num
; j
++)
7386 debug_information
[i
].loc_offsets
[j
]
7387 || (last_offset
== debug_information
[i
].loc_offsets
[j
]
7388 && last_view
> debug_information
[i
].loc_views
[j
]))
7393 last_offset
= debug_information
[i
].loc_offsets
[j
];
7394 last_view
= debug_information
[i
].loc_views
[j
];
7399 if (!seen_first_offset
)
7400 error (_("No location lists in .debug_info section!\n"));
7403 array
= (unsigned int *) xcmalloc (num_loc_list
, sizeof (unsigned int));
7405 introduce (section
, false);
7407 if (reloc_at (section
, 0))
7408 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
7411 printf (_(" Offset Begin End Expression\n"));
7413 for (i
= first
; i
< num_debug_info_entries
; i
++)
7415 uint64_t offset
= 0, voffset
= 0;
7416 uint64_t base_address
;
7419 debug_info
*debug_info_p
= debug_information
+ i
;
7420 uint32_t offset_count
;
7425 for (k
= 0; k
< debug_info_p
->num_loc_offsets
; k
++)
7427 loc_offsets
= debug_info_p
->loc_offsets
;
7428 loc_views
= debug_info_p
->loc_views
;
7429 qsort (array
, debug_info_p
->num_loc_offsets
,
7430 sizeof (*array
), loc_offsets_compar
);
7433 /* .debug_loclists has a per-unit header.
7434 Update start if we are detecting it. */
7435 if (debug_info_p
->dwarf_version
== 5)
7437 j
= locs_sorted
? 0 : array
[0];
7439 if (debug_info_p
->num_loc_offsets
)
7440 offset
= debug_info_p
->loc_offsets
[j
];
7442 if (debug_info_p
->num_loc_views
)
7443 voffset
= debug_info_p
->loc_views
[j
];
7445 /* Parse and dump unit headers in loclists.
7446 This will misbehave if the order of CUs in debug_info
7447 doesn't match the one in loclists. */
7448 if (next_header_offset
< offset
)
7450 while (next_header_offset
< offset
)
7452 next_header_offset
= display_loclists_unit_header
7453 (section
, next_header_offset
, &offset_count
, &start
);
7455 if (next_header_offset
== (uint64_t)-1)
7456 /* Header parsing error. */
7461 Offset Begin End Expression\n"));
7465 int adjacent_view_loclists
= 1;
7467 for (k
= 0; k
< debug_info_p
->num_loc_offsets
; k
++)
7469 j
= locs_sorted
? k
: array
[k
];
7471 && (debug_info_p
->loc_offsets
[locs_sorted
7472 ? k
- 1 : array
[k
- 1]]
7473 == debug_info_p
->loc_offsets
[j
])
7474 && (debug_info_p
->loc_views
[locs_sorted
7475 ? k
- 1 : array
[k
- 1]]
7476 == debug_info_p
->loc_views
[j
]))
7478 has_frame_base
= debug_info_p
->have_frame_base
[j
];
7479 offset
= debug_info_p
->loc_offsets
[j
];
7480 next
= section_begin
+ offset
;
7481 voffset
= debug_info_p
->loc_views
[j
];
7482 if (voffset
!= (uint64_t) -1)
7483 vnext
= section_begin
+ voffset
;
7486 base_address
= debug_info_p
->base_address
;
7488 if (vnext
&& vnext
< next
)
7491 display_view_pair_list (section
, &vstart
, i
, next
);
7498 if (vnext
&& vnext
< next
)
7499 warn (_("There is a hole [%#tx - %#" PRIx64
"]"
7500 " in %s section.\n"),
7501 start
- section_begin
, voffset
, section
->name
);
7503 warn (_("There is a hole [%#tx - %#" PRIx64
"]"
7504 " in %s section.\n"),
7505 start
- section_begin
, offset
, section
->name
);
7507 else if (start
> next
)
7508 warn (_("There is an overlap [%#tx - %#" PRIx64
"]"
7509 " in %s section.\n"),
7510 start
- section_begin
, offset
, section
->name
);
7514 if (offset
>= bytes
)
7516 warn (_("Offset %#" PRIx64
" is bigger than %s section size.\n"),
7517 offset
, section
->name
);
7521 if (vnext
&& voffset
>= bytes
)
7523 warn (_("View Offset %#" PRIx64
" is bigger than %s section size.\n"),
7524 voffset
, section
->name
);
7531 display_loc_list_dwo (section
, &start
, i
, offset
,
7532 &vstart
, has_frame_base
);
7534 display_loc_list (section
, &start
, i
, offset
, base_address
,
7535 &vstart
, has_frame_base
);
7540 warn (_("DWO is not yet supported.\n"));
7542 display_loclists_list (section
, &start
, debug_info_p
, offset
,
7543 base_address
, &vstart
, has_frame_base
);
7546 /* FIXME: this arrangement is quite simplistic. Nothing
7547 requires locview lists to be adjacent to corresponding
7548 loclists, and a single loclist could be augmented by
7549 different locview lists, and vice-versa, unlikely as it
7550 is that it would make sense to do so. Hopefully we'll
7551 have view pair support built into loclists before we ever
7552 need to address all these possibilities. */
7553 if (adjacent_view_loclists
&& vnext
7554 && vnext
!= start
&& vstart
!= next
)
7556 adjacent_view_loclists
= 0;
7557 warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
7560 if (vnext
&& vnext
== start
)
7561 display_view_pair_list (section
, &start
, i
, vstart
);
7565 if (start
< section
->start
+ section
->size
)
7566 warn (ngettext ("There is %ld unused byte at the end of section %s\n",
7567 "There are %ld unused bytes at the end of section %s\n",
7568 (long) (section
->start
+ section
->size
- start
)),
7569 (long) (section
->start
+ section
->size
- start
), section
->name
);
7576 display_debug_str (struct dwarf_section
*section
,
7577 void *file ATTRIBUTE_UNUSED
)
7579 unsigned char *start
= section
->start
;
7580 uint64_t bytes
= section
->size
;
7581 uint64_t addr
= section
->address
;
7585 printf (_("\nThe %s section is empty.\n"), section
->name
);
7589 introduce (section
, false);
7597 lbytes
= (bytes
> 16 ? 16 : bytes
);
7599 printf (" 0x%8.8" PRIx64
" ", addr
);
7601 for (j
= 0; j
< 16; j
++)
7604 printf ("%2.2x", start
[j
]);
7612 for (j
= 0; j
< lbytes
; j
++)
7615 if (k
>= ' ' && k
< 0x80)
7634 display_debug_info (struct dwarf_section
*section
, void *file
)
7636 return process_debug_info (section
, file
, section
->abbrev_sec
, false, false);
7640 display_debug_types (struct dwarf_section
*section
, void *file
)
7642 return process_debug_info (section
, file
, section
->abbrev_sec
, false, true);
7646 display_trace_info (struct dwarf_section
*section
, void *file
)
7648 return process_debug_info (section
, file
, section
->abbrev_sec
, false, true);
7652 display_debug_aranges (struct dwarf_section
*section
,
7653 void *file ATTRIBUTE_UNUSED
)
7655 unsigned char *start
= section
->start
;
7656 unsigned char *end
= start
+ section
->size
;
7658 introduce (section
, false);
7660 /* It does not matter if this load fails,
7661 we test for that later on. */
7662 load_debug_info (file
);
7666 unsigned char *hdrptr
;
7667 DWARF2_Internal_ARange arange
;
7668 unsigned char *addr_ranges
;
7672 unsigned char address_size
;
7673 unsigned int offset_size
;
7674 unsigned char *end_ranges
;
7677 sec_off
= hdrptr
- section
->start
;
7679 SAFE_BYTE_GET_AND_INC (arange
.ar_length
, hdrptr
, 4, end
);
7680 if (arange
.ar_length
== 0xffffffff)
7682 SAFE_BYTE_GET_AND_INC (arange
.ar_length
, hdrptr
, 8, end
);
7688 if (arange
.ar_length
> (size_t) (end
- hdrptr
))
7690 warn (_("Debug info is corrupted, %s header at %#" PRIx64
7691 " has length %#" PRIx64
"\n"),
7692 section
->name
, sec_off
, arange
.ar_length
);
7695 end_ranges
= hdrptr
+ arange
.ar_length
;
7697 SAFE_BYTE_GET_AND_INC (arange
.ar_version
, hdrptr
, 2, end_ranges
);
7698 SAFE_BYTE_GET_AND_INC (arange
.ar_info_offset
, hdrptr
, offset_size
,
7701 if (num_debug_info_entries
!= DEBUG_INFO_UNAVAILABLE
7702 && num_debug_info_entries
> 0
7703 && find_debug_info_for_offset (arange
.ar_info_offset
) == NULL
)
7704 warn (_(".debug_info offset of %#" PRIx64
7705 " in %s section does not point to a CU header.\n"),
7706 arange
.ar_info_offset
, section
->name
);
7708 SAFE_BYTE_GET_AND_INC (arange
.ar_pointer_size
, hdrptr
, 1, end_ranges
);
7709 SAFE_BYTE_GET_AND_INC (arange
.ar_segment_size
, hdrptr
, 1, end_ranges
);
7711 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
7713 /* PR 19872: A version number of 0 probably means that there is
7714 padding at the end of the .debug_aranges section. Gold puts
7715 it there when performing an incremental link, for example.
7716 So do not generate a warning in this case. */
7717 if (arange
.ar_version
)
7718 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
7722 printf (_(" Length: %" PRId64
"\n"), arange
.ar_length
);
7723 printf (_(" Version: %d\n"), arange
.ar_version
);
7724 printf (_(" Offset into .debug_info: %#" PRIx64
"\n"),
7725 arange
.ar_info_offset
);
7726 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7727 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7729 address_size
= arange
.ar_pointer_size
+ arange
.ar_segment_size
;
7731 /* PR 17512: file: 001-108546-0.001:0.1. */
7732 if (address_size
== 0 || address_size
> 8)
7734 error (_("Invalid address size in %s section!\n"),
7739 /* The DWARF spec does not require that the address size be a power
7740 of two, but we do. This will have to change if we ever encounter
7741 an uneven architecture. */
7742 if ((address_size
& (address_size
- 1)) != 0)
7744 warn (_("Pointer size + Segment size is not a power of two.\n"));
7748 if (address_size
> 4)
7749 printf (_("\n Address Length\n"));
7751 printf (_("\n Address Length\n"));
7753 addr_ranges
= hdrptr
;
7755 /* Must pad to an alignment boundary that is twice the address size. */
7756 addr_ranges
+= (2 * address_size
- 1
7757 - (hdrptr
- start
- 1) % (2 * address_size
));
7759 while (2 * address_size
<= end_ranges
- addr_ranges
)
7761 SAFE_BYTE_GET_AND_INC (address
, addr_ranges
, address_size
,
7763 SAFE_BYTE_GET_AND_INC (length
, addr_ranges
, address_size
,
7766 print_hex (address
, address_size
);
7767 print_hex_ns (length
, address_size
);
7779 /* Comparison function for qsort. */
7781 comp_addr_base (const void * v0
, const void * v1
)
7783 debug_info
*info0
= *(debug_info
**) v0
;
7784 debug_info
*info1
= *(debug_info
**) v1
;
7785 return info0
->addr_base
- info1
->addr_base
;
7788 /* Display the debug_addr section. */
7790 display_debug_addr (struct dwarf_section
*section
,
7793 debug_info
**debug_addr_info
;
7794 unsigned char *entry
;
7798 unsigned char * header
;
7800 if (section
->size
== 0)
7802 printf (_("\nThe %s section is empty.\n"), section
->name
);
7806 if (load_debug_info (file
) == 0)
7808 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7813 introduce (section
, false);
7815 /* PR 17531: file: cf38d01b.
7816 We use xcalloc because a corrupt file may not have initialised all of the
7817 fields in the debug_info structure, which means that the sort below might
7818 try to move uninitialised data. */
7819 debug_addr_info
= (debug_info
**) xcalloc ((num_debug_info_entries
+ 1),
7820 sizeof (debug_info
*));
7823 for (i
= 0; i
< num_debug_info_entries
; i
++)
7824 if (debug_information
[i
].addr_base
!= DEBUG_INFO_UNAVAILABLE
)
7826 /* PR 17531: file: cf38d01b. */
7827 if (debug_information
[i
].addr_base
>= section
->size
)
7828 warn (_("Corrupt address base (%#" PRIx64
")"
7829 " found in debug section %u\n"),
7830 debug_information
[i
].addr_base
, i
);
7832 debug_addr_info
[count
++] = debug_information
+ i
;
7835 /* Add a sentinel to make iteration convenient. */
7836 debug_addr_info
[count
] = (debug_info
*) xmalloc (sizeof (debug_info
));
7837 debug_addr_info
[count
]->addr_base
= section
->size
;
7838 qsort (debug_addr_info
, count
, sizeof (debug_info
*), comp_addr_base
);
7840 header
= section
->start
;
7841 for (i
= 0; i
< count
; i
++)
7844 unsigned int address_size
= debug_addr_info
[i
]->pointer_size
;
7846 printf (_(" For compilation unit at offset %#" PRIx64
":\n"),
7847 debug_addr_info
[i
]->cu_offset
);
7849 printf (_("\tIndex\tAddress\n"));
7850 entry
= section
->start
+ debug_addr_info
[i
]->addr_base
;
7851 if (debug_addr_info
[i
]->dwarf_version
>= 5)
7853 size_t header_size
= entry
- header
;
7854 unsigned char *curr_header
= header
;
7857 int segment_selector_size
;
7859 if (header_size
!= 8 && header_size
!= 16)
7861 warn (_("Corrupt %s section: expecting header size of 8 or 16, but found %zd instead"),
7862 section
->name
, header_size
);
7866 SAFE_BYTE_GET_AND_INC (length
, curr_header
, 4, entry
);
7867 if (length
== 0xffffffff)
7868 SAFE_BYTE_GET_AND_INC (length
, curr_header
, 8, entry
);
7869 if (length
> (size_t) (section
->start
+ section
->size
- curr_header
)
7870 || length
< (size_t) (entry
- curr_header
))
7872 warn (_("Corrupt %s section: unit_length field of %#" PRIx64
7873 " is invalid"), section
->name
, length
);
7876 end
= curr_header
+ length
;
7877 SAFE_BYTE_GET_AND_INC (version
, curr_header
, 2, entry
);
7879 warn (_("Corrupt %s section: expecting version number 5 in header but found %d instead\n"),
7880 section
->name
, version
);
7882 SAFE_BYTE_GET_AND_INC (address_size
, curr_header
, 1, entry
);
7883 SAFE_BYTE_GET_AND_INC (segment_selector_size
, curr_header
, 1, entry
);
7884 address_size
+= segment_selector_size
;
7887 end
= section
->start
+ debug_addr_info
[i
+ 1]->addr_base
;
7892 if (address_size
< 1 || address_size
> sizeof (uint64_t))
7894 warn (_("Corrupt %s section: address size (%x) is wrong"),
7895 section
->name
, address_size
);
7899 while ((size_t) (end
- entry
) >= address_size
)
7901 uint64_t base
= byte_get (entry
, address_size
);
7902 printf (_("\t%d:\t"), idx
);
7903 print_hex_ns (base
, address_size
);
7905 entry
+= address_size
;
7911 free (debug_addr_info
[count
]);
7912 free (debug_addr_info
);
7916 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
7919 display_debug_str_offsets (struct dwarf_section
*section
,
7920 void *file ATTRIBUTE_UNUSED
)
7924 if (section
->size
== 0)
7926 printf (_("\nThe %s section is empty.\n"), section
->name
);
7930 unsigned char *start
= section
->start
;
7931 unsigned char *end
= start
+ section
->size
;
7932 unsigned char *curr
= start
;
7933 uint64_t debug_str_offsets_hdr_len
;
7935 const char *suffix
= strrchr (section
->name
, '.');
7936 bool dwo
= suffix
&& strcmp (suffix
, ".dwo") == 0;
7939 load_debug_section_with_follow (str_dwo
, file
);
7941 load_debug_section_with_follow (str
, file
);
7943 introduce (section
, false);
7948 uint64_t entry_length
;
7950 SAFE_BYTE_GET_AND_INC (length
, curr
, 4, end
);
7951 /* FIXME: We assume that this means 64-bit DWARF is being used. */
7952 if (length
== 0xffffffff)
7954 SAFE_BYTE_GET_AND_INC (length
, curr
, 8, end
);
7956 debug_str_offsets_hdr_len
= 16;
7961 debug_str_offsets_hdr_len
= 8;
7964 unsigned char *entries_end
;
7967 /* This is probably an old style .debug_str_offset section which
7968 just contains offsets and no header (and the first offset is 0). */
7969 length
= section
->size
;
7970 curr
= section
->start
;
7973 printf (_(" Length: %#" PRIx64
"\n"), length
);
7974 printf (_(" Index Offset [String]\n"));
7978 if (length
<= (size_t) (end
- curr
))
7979 entries_end
= curr
+ length
;
7982 warn (_("Section %s is too small %#" PRIx64
"\n"),
7983 section
->name
, section
->size
);
7988 SAFE_BYTE_GET_AND_INC (version
, curr
, 2, entries_end
);
7990 warn (_("Unexpected version number in str_offset header: %#x\n"), version
);
7993 SAFE_BYTE_GET_AND_INC (padding
, curr
, 2, entries_end
);
7995 warn (_("Unexpected value in str_offset header's padding field: %#x\n"), padding
);
7997 printf (_(" Length: %#" PRIx64
"\n"), length
);
7998 printf (_(" Version: %#x\n"), version
);
7999 printf (_(" Index Offset [String]\n"));
8002 for (idx
= 0; curr
< entries_end
; idx
++)
8005 const unsigned char * string
;
8007 if ((size_t) (entries_end
- curr
) < entry_length
)
8008 /* Not enough space to read one entry_length, give up. */
8011 SAFE_BYTE_GET_AND_INC (offset
, curr
, entry_length
, entries_end
);
8013 string
= (const unsigned char *)
8014 fetch_indexed_string (idx
, NULL
, entry_length
, dwo
, debug_str_offsets_hdr_len
);
8016 string
= fetch_indirect_string (offset
);
8018 printf (" %8lu ", idx
);
8019 print_hex (offset
, entry_length
);
8020 printf (" %s\n", string
);
8027 /* Each debug_information[x].range_lists[y] gets this representation for
8028 sorting purposes. */
8032 /* The debug_information[x].range_lists[y] value. */
8033 uint64_t ranges_offset
;
8035 /* Original debug_information to find parameters of the data. */
8036 debug_info
*debug_info_p
;
8039 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
8042 range_entry_compar (const void *ap
, const void *bp
)
8044 const struct range_entry
*a_re
= (const struct range_entry
*) ap
;
8045 const struct range_entry
*b_re
= (const struct range_entry
*) bp
;
8046 const uint64_t a
= a_re
->ranges_offset
;
8047 const uint64_t b
= b_re
->ranges_offset
;
8049 return (a
> b
) - (b
> a
);
8053 display_debug_ranges_list (unsigned char * start
,
8054 unsigned char * finish
,
8055 unsigned int pointer_size
,
8057 uint64_t base_address
)
8059 while (start
< finish
)
8064 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, finish
);
8065 if (start
>= finish
)
8067 SAFE_SIGNED_BYTE_GET_AND_INC (end
, start
, pointer_size
, finish
);
8070 print_hex (offset
, 4);
8072 if (begin
== 0 && end
== 0)
8074 printf (_("<End of list>\n"));
8078 /* Check base address specifiers. */
8079 if (is_max_address (begin
, pointer_size
)
8080 && !is_max_address (end
, pointer_size
))
8083 print_hex (begin
, pointer_size
);
8084 print_hex (end
, pointer_size
);
8085 printf ("(base address)\n");
8089 print_hex (begin
+ base_address
, pointer_size
);
8090 print_hex_ns (end
+ base_address
, pointer_size
);
8093 fputs (_(" (start == end)"), stdout
);
8094 else if (begin
> end
)
8095 fputs (_(" (start > end)"), stdout
);
8101 static unsigned char *
8102 display_debug_rnglists_list (unsigned char * start
,
8103 unsigned char * finish
,
8104 unsigned int pointer_size
,
8106 uint64_t base_address
,
8109 unsigned char *next
= start
;
8113 uint64_t off
= offset
+ (start
- next
);
8114 enum dwarf_range_list_entry rlet
;
8115 /* Initialize it due to a false compiler warning. */
8116 uint64_t begin
= -1, length
, end
= -1;
8118 if (start
>= finish
)
8120 warn (_("Range list starting at offset %#" PRIx64
8121 " is not terminated.\n"), offset
);
8128 SAFE_BYTE_GET_AND_INC (rlet
, start
, 1, finish
);
8132 case DW_RLE_end_of_list
:
8133 printf (_("<End of list>\n"));
8135 case DW_RLE_base_addressx
:
8136 READ_ULEB (base_address
, start
, finish
);
8137 print_hex (base_address
, pointer_size
);
8138 printf (_("(base address index) "));
8139 base_address
= fetch_indexed_addr ((base_address
* pointer_size
) + addr_base
,
8141 print_hex (base_address
, pointer_size
);
8142 printf (_("(base address)\n"));
8144 case DW_RLE_startx_endx
:
8145 READ_ULEB (begin
, start
, finish
);
8146 READ_ULEB (end
, start
, finish
);
8147 begin
= fetch_indexed_addr ((begin
* pointer_size
) + addr_base
,
8149 end
= fetch_indexed_addr ((begin
* pointer_size
) + addr_base
,
8152 case DW_RLE_startx_length
:
8153 READ_ULEB (begin
, start
, finish
);
8154 READ_ULEB (length
, start
, finish
);
8155 begin
= fetch_indexed_addr ((begin
* pointer_size
) + addr_base
,
8157 end
= begin
+ length
;
8159 case DW_RLE_offset_pair
:
8160 READ_ULEB (begin
, start
, finish
);
8161 READ_ULEB (end
, start
, finish
);
8163 case DW_RLE_base_address
:
8164 SAFE_BYTE_GET_AND_INC (base_address
, start
, pointer_size
, finish
);
8165 print_hex (base_address
, pointer_size
);
8166 printf (_("(base address)\n"));
8168 case DW_RLE_start_end
:
8169 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, finish
);
8170 SAFE_BYTE_GET_AND_INC (end
, start
, pointer_size
, finish
);
8172 case DW_RLE_start_length
:
8173 SAFE_BYTE_GET_AND_INC (begin
, start
, pointer_size
, finish
);
8174 READ_ULEB (length
, start
, finish
);
8175 end
= begin
+ length
;
8178 error (_("Invalid range list entry type %d\n"), rlet
);
8179 rlet
= DW_RLE_end_of_list
;
8183 if (rlet
== DW_RLE_end_of_list
)
8185 if (rlet
== DW_RLE_base_address
|| rlet
== DW_RLE_base_addressx
)
8188 /* Only a DW_RLE_offset_pair needs the base address added. */
8189 if (rlet
== DW_RLE_offset_pair
)
8191 begin
+= base_address
;
8192 end
+= base_address
;
8195 print_hex (begin
, pointer_size
);
8196 print_hex (end
, pointer_size
);
8199 fputs (_(" (start == end)"), stdout
);
8200 else if (begin
> end
)
8201 fputs (_(" (start > end)"), stdout
);
8210 display_debug_rnglists_unit_header (struct dwarf_section
* section
,
8211 uint64_t * unit_offset
,
8212 unsigned char * poffset_size
)
8214 uint64_t start_offset
= *unit_offset
;
8215 unsigned char * p
= section
->start
+ start_offset
;
8216 unsigned char * finish
= section
->start
+ section
->size
;
8217 uint64_t initial_length
;
8218 unsigned char segment_selector_size
;
8219 unsigned int offset_entry_count
;
8221 unsigned short version
;
8222 unsigned char address_size
= 0;
8223 unsigned char offset_size
;
8225 /* Get and check the length of the block. */
8226 SAFE_BYTE_GET_AND_INC (initial_length
, p
, 4, finish
);
8228 if (initial_length
== 0xffffffff)
8230 /* This section is 64-bit DWARF 3. */
8231 SAFE_BYTE_GET_AND_INC (initial_length
, p
, 8, finish
);
8232 *poffset_size
= offset_size
= 8;
8235 *poffset_size
= offset_size
= 4;
8237 if (initial_length
> (size_t) (finish
- p
))
8239 /* If the length field has a relocation against it, then we should
8240 not complain if it is inaccurate (and probably negative).
8241 It is copied from .debug_line handling code. */
8242 if (reloc_at (section
, (p
- section
->start
) - offset_size
))
8243 initial_length
= finish
- p
;
8246 warn (_("The length field (%#" PRIx64
8247 ") in the debug_rnglists header is wrong"
8248 " - the section is too small\n"),
8254 /* Report the next unit offset to the caller. */
8255 *unit_offset
= (p
- section
->start
) + initial_length
;
8257 /* Get the other fields in the header. */
8258 SAFE_BYTE_GET_AND_INC (version
, p
, 2, finish
);
8259 SAFE_BYTE_GET_AND_INC (address_size
, p
, 1, finish
);
8260 SAFE_BYTE_GET_AND_INC (segment_selector_size
, p
, 1, finish
);
8261 SAFE_BYTE_GET_AND_INC (offset_entry_count
, p
, 4, finish
);
8263 printf (_(" Table at Offset: %#" PRIx64
":\n"), start_offset
);
8264 printf (_(" Length: %#" PRIx64
"\n"), initial_length
);
8265 printf (_(" DWARF version: %u\n"), version
);
8266 printf (_(" Address size: %u\n"), address_size
);
8267 printf (_(" Segment size: %u\n"), segment_selector_size
);
8268 printf (_(" Offset entries: %u\n"), offset_entry_count
);
8270 /* Check the fields. */
8271 if (segment_selector_size
!= 0)
8273 warn (_("The %s section contains "
8274 "unsupported segment selector size: %d.\n"),
8275 section
->name
, segment_selector_size
);
8281 warn (_("Only DWARF version 5+ debug_rnglists info "
8282 "is currently supported.\n"));
8286 if (offset_entry_count
!= 0)
8288 printf (_("\n Offsets starting at %#tx:\n"), p
- section
->start
);
8290 for (i
= 0; i
< offset_entry_count
; i
++)
8294 SAFE_BYTE_GET_AND_INC (entry
, p
, offset_size
, finish
);
8295 printf (_(" [%6u] %#" PRIx64
"\n"), i
, entry
);
8303 is_range_list_for_this_section (bool is_rnglists
, unsigned int version
)
8305 if (is_rnglists
&& version
> 4)
8308 if (! is_rnglists
&& version
< 5)
8315 display_debug_ranges (struct dwarf_section
*section
,
8316 void *file ATTRIBUTE_UNUSED
)
8318 unsigned char *start
= section
->start
;
8319 unsigned char *last_start
= start
;
8320 uint64_t bytes
= section
->size
;
8321 unsigned char *section_begin
= start
;
8322 unsigned char *finish
= start
+ bytes
;
8323 unsigned int num_range_list
, i
;
8324 struct range_entry
*range_entries
;
8325 struct range_entry
*range_entry_fill
;
8326 bool is_rnglists
= strstr (section
->name
, "debug_rnglists") != NULL
;
8327 uint64_t last_offset
= 0;
8328 uint64_t next_rnglists_cu_offset
= 0;
8329 unsigned char offset_size
;
8333 printf (_("\nThe %s section is empty.\n"), section
->name
);
8337 introduce (section
, false);
8339 if (load_debug_info (file
) == 0)
8341 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
8347 for (i
= 0; i
< num_debug_info_entries
; i
++)
8348 if (is_range_list_for_this_section (is_rnglists
, debug_information
[i
].dwarf_version
))
8349 num_range_list
+= debug_information
[i
].num_range_lists
;
8351 if (num_range_list
== 0)
8353 /* This can happen when the file was compiled with -gsplit-debug
8354 which removes references to range lists from the primary .o file. */
8355 printf (_("No range lists referenced by .debug_info section.\n"));
8359 range_entry_fill
= range_entries
= XNEWVEC (struct range_entry
, num_range_list
);
8361 for (i
= 0; i
< num_debug_info_entries
; i
++)
8363 debug_info
*debug_info_p
= &debug_information
[i
];
8366 for (j
= 0; j
< debug_info_p
->num_range_lists
; j
++)
8368 if (is_range_list_for_this_section (is_rnglists
, debug_info_p
->dwarf_version
))
8370 range_entry_fill
->ranges_offset
= debug_info_p
->range_lists
[j
];
8371 range_entry_fill
->debug_info_p
= debug_info_p
;
8377 assert (range_entry_fill
>= range_entries
);
8378 assert (num_range_list
>= (unsigned int)(range_entry_fill
- range_entries
));
8379 num_range_list
= range_entry_fill
- range_entries
;
8380 qsort (range_entries
, num_range_list
, sizeof (*range_entries
),
8381 range_entry_compar
);
8383 if (dwarf_check
!= 0 && range_entries
[0].ranges_offset
!= 0)
8384 warn (_("Range lists in %s section start at %#" PRIx64
"\n"),
8385 section
->name
, range_entries
[0].ranges_offset
);
8389 printf (_(" Offset Begin End\n"));
8391 for (i
= 0; i
< num_range_list
; i
++)
8393 struct range_entry
*range_entry
= &range_entries
[i
];
8394 debug_info
*debug_info_p
= range_entry
->debug_info_p
;
8395 unsigned int pointer_size
;
8397 unsigned char *next
;
8398 uint64_t base_address
;
8400 pointer_size
= debug_info_p
->pointer_size
;
8401 offset
= range_entry
->ranges_offset
;
8402 base_address
= debug_info_p
->base_address
;
8404 /* PR 17512: file: 001-101485-0.001:0.1. */
8405 if (pointer_size
< 2 || pointer_size
> 8)
8407 warn (_("Corrupt pointer size (%d) in debug entry at offset %#" PRIx64
"\n"),
8408 pointer_size
, offset
);
8412 if (offset
> (size_t) (finish
- section_begin
))
8414 warn (_("Corrupt offset (%#" PRIx64
") in range entry %u\n"),
8419 /* If we've moved on to the next compile unit in the rnglists section - dump the unit header(s). */
8420 if (is_rnglists
&& next_rnglists_cu_offset
< offset
)
8422 while (next_rnglists_cu_offset
< offset
)
8423 display_debug_rnglists_unit_header (section
, &next_rnglists_cu_offset
, &offset_size
);
8424 printf (_(" Offset Begin End\n"));
8427 next
= section_begin
+ offset
; /* Offset is from the section start, the base has already been added. */
8429 /* If multiple DWARF entities reference the same range then we will
8430 have multiple entries in the `range_entries' list for the same
8431 offset. Thanks to the sort above these will all be consecutive in
8432 the `range_entries' list, so we can easily ignore duplicates
8434 if (i
> 0 && last_offset
== offset
)
8436 last_offset
= offset
;
8438 if (dwarf_check
!= 0 && i
> 0)
8441 warn (_("There is a hole [%#tx - %#tx] in %s section.\n"),
8442 start
- section_begin
, next
- section_begin
, section
->name
);
8443 else if (start
> next
)
8445 if (next
== last_start
)
8447 warn (_("There is an overlap [%#tx - %#tx] in %s section.\n"),
8448 start
- section_begin
, next
- section_begin
, section
->name
);
8456 display_debug_rnglists_list
8457 (start
, finish
, pointer_size
, offset
, base_address
, debug_info_p
->addr_base
);
8459 display_debug_ranges_list
8460 (start
, finish
, pointer_size
, offset
, base_address
);
8463 /* Display trailing empty (or unreferenced) compile units, if any. */
8465 while (next_rnglists_cu_offset
< section
->size
)
8466 display_debug_rnglists_unit_header (section
, &next_rnglists_cu_offset
, &offset_size
);
8470 free (range_entries
);
8475 typedef struct Frame_Chunk
8477 struct Frame_Chunk
*next
;
8478 unsigned char *chunk_start
;
8480 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8481 short int *col_type
;
8482 int64_t *col_offset
;
8484 unsigned int code_factor
;
8488 unsigned int cfa_reg
;
8489 uint64_t cfa_offset
;
8491 unsigned char fde_encoding
;
8492 unsigned char cfa_exp
;
8493 unsigned char ptr_size
;
8494 unsigned char segment_size
;
8498 typedef const char *(*dwarf_regname_lookup_ftype
) (unsigned int);
8499 static dwarf_regname_lookup_ftype dwarf_regnames_lookup_func
;
8500 static const char *const *dwarf_regnames
;
8501 static unsigned int dwarf_regnames_count
;
8502 static bool is_aarch64
;
8504 /* A marker for a col_type that means this column was never referenced
8505 in the frame info. */
8506 #define DW_CFA_unreferenced (-1)
8508 /* Return 0 if no more space is needed, 1 if more space is needed,
8509 -1 for invalid reg. */
8512 frame_need_space (Frame_Chunk
*fc
, unsigned int reg
)
8514 unsigned int prev
= fc
->ncols
;
8516 if (reg
< (unsigned int) fc
->ncols
)
8519 if (dwarf_regnames_count
> 0
8520 && reg
> dwarf_regnames_count
)
8523 fc
->ncols
= reg
+ 1;
8524 /* PR 17512: file: 10450-2643-0.004.
8525 If reg == -1 then this can happen... */
8529 /* PR 17512: file: 2844a11d. */
8530 if (fc
->ncols
> 1024 && dwarf_regnames_count
== 0)
8532 error (_("Unfeasibly large register number: %u\n"), reg
);
8534 /* FIXME: 1024 is an arbitrary limit. Increase it if
8535 we ever encounter a valid binary that exceeds it. */
8539 fc
->col_type
= xcrealloc (fc
->col_type
, fc
->ncols
,
8540 sizeof (*fc
->col_type
));
8541 fc
->col_offset
= xcrealloc (fc
->col_offset
, fc
->ncols
,
8542 sizeof (*fc
->col_offset
));
8543 /* PR 17512: file:002-10025-0.005. */
8544 if (fc
->col_type
== NULL
|| fc
->col_offset
== NULL
)
8546 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
8552 while (prev
< fc
->ncols
)
8554 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8555 fc
->col_offset
[prev
] = 0;
8561 static const char *const dwarf_regnames_i386
[] =
8563 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
8564 "esp", "ebp", "esi", "edi", /* 4 - 7 */
8565 "eip", "eflags", NULL
, /* 8 - 10 */
8566 "st0", "st1", "st2", "st3", /* 11 - 14 */
8567 "st4", "st5", "st6", "st7", /* 15 - 18 */
8568 NULL
, NULL
, /* 19 - 20 */
8569 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
8570 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
8571 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
8572 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
8573 "fcw", "fsw", "mxcsr", /* 37 - 39 */
8574 "es", "cs", "ss", "ds", "fs", "gs", NULL
, NULL
, /* 40 - 47 */
8575 "tr", "ldtr", /* 48 - 49 */
8576 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 50 - 57 */
8577 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 58 - 65 */
8578 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 66 - 73 */
8579 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 74 - 81 */
8580 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 82 - 89 */
8581 NULL
, NULL
, NULL
, /* 90 - 92 */
8582 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
8585 static const char *const dwarf_regnames_iamcu
[] =
8587 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
8588 "esp", "ebp", "esi", "edi", /* 4 - 7 */
8589 "eip", "eflags", NULL
, /* 8 - 10 */
8590 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 11 - 18 */
8591 NULL
, NULL
, /* 19 - 20 */
8592 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 21 - 28 */
8593 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 29 - 36 */
8594 NULL
, NULL
, NULL
, /* 37 - 39 */
8595 "es", "cs", "ss", "ds", "fs", "gs", NULL
, NULL
, /* 40 - 47 */
8596 "tr", "ldtr", /* 48 - 49 */
8597 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 50 - 57 */
8598 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 58 - 65 */
8599 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 66 - 73 */
8600 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 74 - 81 */
8601 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 82 - 89 */
8602 NULL
, NULL
, NULL
, /* 90 - 92 */
8603 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
/* 93 - 100 */
8607 init_dwarf_regnames_i386 (void)
8609 dwarf_regnames
= dwarf_regnames_i386
;
8610 dwarf_regnames_count
= ARRAY_SIZE (dwarf_regnames_i386
);
8611 dwarf_regnames_lookup_func
= regname_internal_by_table_only
;
8615 init_dwarf_regnames_iamcu (void)
8617 dwarf_regnames
= dwarf_regnames_iamcu
;
8618 dwarf_regnames_count
= ARRAY_SIZE (dwarf_regnames_iamcu
);
8619 dwarf_regnames_lookup_func
= regname_internal_by_table_only
;
8622 static const char *const DW_CFA_GNU_window_save_name
[] =
8624 "DW_CFA_GNU_window_save",
8625 "DW_CFA_AARCH64_negate_ra_state"
8628 static const char *const dwarf_regnames_x86_64
[] =
8630 "rax", "rdx", "rcx", "rbx",
8631 "rsi", "rdi", "rbp", "rsp",
8632 "r8", "r9", "r10", "r11",
8633 "r12", "r13", "r14", "r15",
8635 "xmm0", "xmm1", "xmm2", "xmm3",
8636 "xmm4", "xmm5", "xmm6", "xmm7",
8637 "xmm8", "xmm9", "xmm10", "xmm11",
8638 "xmm12", "xmm13", "xmm14", "xmm15",
8639 "st0", "st1", "st2", "st3",
8640 "st4", "st5", "st6", "st7",
8641 "mm0", "mm1", "mm2", "mm3",
8642 "mm4", "mm5", "mm6", "mm7",
8644 "es", "cs", "ss", "ds", "fs", "gs", NULL
, NULL
,
8645 "fs.base", "gs.base", NULL
, NULL
,
8647 "mxcsr", "fcw", "fsw",
8648 "xmm16", "xmm17", "xmm18", "xmm19",
8649 "xmm20", "xmm21", "xmm22", "xmm23",
8650 "xmm24", "xmm25", "xmm26", "xmm27",
8651 "xmm28", "xmm29", "xmm30", "xmm31",
8652 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 83 - 90 */
8653 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 91 - 98 */
8654 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 99 - 106 */
8655 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 107 - 114 */
8656 NULL
, NULL
, NULL
, /* 115 - 117 */
8657 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
8658 "bnd0", "bnd1", "bnd2", "bnd3",
8662 init_dwarf_regnames_x86_64 (void)
8664 dwarf_regnames
= dwarf_regnames_x86_64
;
8665 dwarf_regnames_count
= ARRAY_SIZE (dwarf_regnames_x86_64
);
8666 dwarf_regnames_lookup_func
= regname_internal_by_table_only
;
8669 static const char *const dwarf_regnames_aarch64
[] =
8671 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
8672 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
8673 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
8674 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
8675 NULL
, "elr", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
8676 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, "vg", "ffr",
8677 "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7",
8678 "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",
8679 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
8680 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
8681 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
8682 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
8683 "z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7",
8684 "z8", "z9", "z10", "z11", "z12", "z13", "z14", "z15",
8685 "z16", "z17", "z18", "z19", "z20", "z21", "z22", "z23",
8686 "z24", "z25", "z26", "z27", "z28", "z29", "z30", "z31",
8690 init_dwarf_regnames_aarch64 (void)
8692 dwarf_regnames
= dwarf_regnames_aarch64
;
8693 dwarf_regnames_count
= ARRAY_SIZE (dwarf_regnames_aarch64
);
8694 dwarf_regnames_lookup_func
= regname_internal_by_table_only
;
8698 static const char *const dwarf_regnames_s390
[] =
8700 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */
8701 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
8702 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
8703 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
8704 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
8705 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
8706 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
8707 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
8708 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
8711 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
8712 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
8716 init_dwarf_regnames_s390 (void)
8718 dwarf_regnames
= dwarf_regnames_s390
;
8719 dwarf_regnames_count
= ARRAY_SIZE (dwarf_regnames_s390
);
8720 dwarf_regnames_lookup_func
= regname_internal_by_table_only
;
8723 static const char *const dwarf_regnames_riscv
[] =
8725 "zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", /* 0 - 7 */
8726 "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", /* 8 - 15 */
8727 "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", /* 16 - 23 */
8728 "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", /* 24 - 31 */
8729 "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", /* 32 - 39 */
8730 "fs0", "fs1", /* 40 - 41 */
8731 "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7", /* 42 - 49 */
8732 "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", /* 50 - 57 */
8733 "fs10", "fs11", /* 58 - 59 */
8734 "ft8", "ft9", "ft10", "ft11", /* 60 - 63 */
8735 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 64 - 71 */
8736 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 72 - 79 */
8737 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 80 - 87 */
8738 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 88 - 95 */
8739 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", /* 96 - 103 */
8740 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", /* 104 - 111 */
8741 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", /* 112 - 119 */
8742 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", /* 120 - 127 */
8745 /* A RISC-V replacement for REGNAME_INTERNAL_BY_TABLE_ONLY which handles
8746 the large number of CSRs. */
8749 regname_internal_riscv (unsigned int regno
)
8751 const char *name
= NULL
;
8753 /* Lookup in the table first, this covers GPR and FPR. */
8754 if (regno
< ARRAY_SIZE (dwarf_regnames_riscv
))
8755 name
= dwarf_regnames_riscv
[regno
];
8756 else if (regno
>= 4096 && regno
<= 8191)
8758 /* This might be a CSR, these live in a sparse number space from 4096
8759 to 8191 These numbers are defined in the RISC-V ELF ABI
8763 #define DECLARE_CSR(NAME,VALUE,CLASS,DEFINE_VER,ABORT_VER) \
8764 case VALUE + 4096: name = #NAME; break;
8765 #include "opcode/riscv-opc.h"
8770 static char csr_name
[10];
8771 snprintf (csr_name
, sizeof (csr_name
), "csr%d", (regno
- 4096));
8782 init_dwarf_regnames_riscv (void)
8784 dwarf_regnames
= NULL
;
8785 dwarf_regnames_count
= 8192;
8786 dwarf_regnames_lookup_func
= regname_internal_riscv
;
8790 init_dwarf_regnames_by_elf_machine_code (unsigned int e_machine
)
8792 dwarf_regnames_lookup_func
= NULL
;
8798 init_dwarf_regnames_i386 ();
8802 init_dwarf_regnames_iamcu ();
8808 init_dwarf_regnames_x86_64 ();
8812 init_dwarf_regnames_aarch64 ();
8816 init_dwarf_regnames_s390 ();
8820 init_dwarf_regnames_riscv ();
8828 /* Initialize the DWARF register name lookup state based on the
8829 architecture and specific machine type of a BFD. */
8832 init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch
,
8835 dwarf_regnames_lookup_func
= NULL
;
8843 case bfd_mach_x86_64
:
8844 case bfd_mach_x86_64_intel_syntax
:
8845 case bfd_mach_x64_32
:
8846 case bfd_mach_x64_32_intel_syntax
:
8847 init_dwarf_regnames_x86_64 ();
8851 init_dwarf_regnames_i386 ();
8856 case bfd_arch_iamcu
:
8857 init_dwarf_regnames_iamcu ();
8860 case bfd_arch_aarch64
:
8861 init_dwarf_regnames_aarch64();
8865 init_dwarf_regnames_s390 ();
8868 case bfd_arch_riscv
:
8869 init_dwarf_regnames_riscv ();
8878 regname_internal_by_table_only (unsigned int regno
)
8880 if (dwarf_regnames
!= NULL
8881 && regno
< dwarf_regnames_count
8882 && dwarf_regnames
[regno
] != NULL
)
8883 return dwarf_regnames
[regno
];
8889 regname (unsigned int regno
, int name_only_p
)
8891 static char reg
[64];
8893 const char *name
= NULL
;
8895 if (dwarf_regnames_lookup_func
!= NULL
)
8896 name
= dwarf_regnames_lookup_func (regno
);
8902 snprintf (reg
, sizeof (reg
), "r%d (%s)", regno
, name
);
8905 snprintf (reg
, sizeof (reg
), "r%d", regno
);
8910 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, unsigned int *max_regs
)
8915 if (*max_regs
!= fc
->ncols
)
8916 *max_regs
= fc
->ncols
;
8918 if (*need_col_headers
)
8920 *need_col_headers
= 0;
8922 printf ("%-*s CFA ", eh_addr_size
* 2, " LOC");
8924 for (r
= 0; r
< *max_regs
; r
++)
8925 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8930 printf ("%-5s ", regname (r
, 1));
8936 print_hex (fc
->pc_begin
, eh_addr_size
);
8938 strcpy (tmp
, "exp");
8940 sprintf (tmp
, "%s%+d", regname (fc
->cfa_reg
, 1), (int) fc
->cfa_offset
);
8941 printf ("%-8s ", tmp
);
8943 for (r
= 0; r
< fc
->ncols
; r
++)
8945 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8947 switch (fc
->col_type
[r
])
8949 case DW_CFA_undefined
:
8952 case DW_CFA_same_value
:
8956 sprintf (tmp
, "c%+" PRId64
, fc
->col_offset
[r
]);
8958 case DW_CFA_val_offset
:
8959 sprintf (tmp
, "v%+" PRId64
, fc
->col_offset
[r
]);
8961 case DW_CFA_register
:
8962 sprintf (tmp
, "%s", regname (fc
->col_offset
[r
], 0));
8964 case DW_CFA_expression
:
8965 strcpy (tmp
, "exp");
8967 case DW_CFA_val_expression
:
8968 strcpy (tmp
, "vexp");
8971 strcpy (tmp
, "n/a");
8974 printf ("%-5s ", tmp
);
8980 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
8982 static unsigned char *
8983 read_cie (unsigned char *start
, unsigned char *end
,
8984 Frame_Chunk
**p_cie
, int *p_version
,
8985 uint64_t *p_aug_len
, unsigned char **p_aug
)
8989 unsigned char *augmentation_data
= NULL
;
8990 uint64_t augmentation_data_len
= 0;
8993 /* PR 17512: file: 001-228113-0.004. */
8997 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8998 memset (fc
, 0, sizeof (Frame_Chunk
));
9000 fc
->col_type
= xmalloc (sizeof (*fc
->col_type
));
9001 fc
->col_offset
= xmalloc (sizeof (*fc
->col_offset
));
9005 fc
->augmentation
= (char *) start
;
9006 /* PR 17512: file: 001-228113-0.004.
9007 Skip past augmentation name, but avoid running off the end of the data. */
9009 if (* start
++ == '\0')
9013 warn (_("No terminator for augmentation name\n"));
9017 if (strcmp (fc
->augmentation
, "eh") == 0)
9019 if (eh_addr_size
> (size_t) (end
- start
))
9021 start
+= eh_addr_size
;
9026 if (2 > (size_t) (end
- start
))
9028 GET (fc
->ptr_size
, 1);
9029 if (fc
->ptr_size
< 1 || fc
->ptr_size
> 8)
9031 warn (_("Invalid pointer size (%d) in CIE data\n"), fc
->ptr_size
);
9035 GET (fc
->segment_size
, 1);
9036 /* PR 17512: file: e99d2804. */
9037 if (fc
->segment_size
> 8 || fc
->segment_size
+ fc
->ptr_size
> 8)
9039 warn (_("Invalid segment size (%d) in CIE data\n"), fc
->segment_size
);
9043 eh_addr_size
= fc
->ptr_size
;
9047 fc
->ptr_size
= eh_addr_size
;
9048 fc
->segment_size
= 0;
9051 READ_ULEB (fc
->code_factor
, start
, end
);
9052 READ_SLEB (fc
->data_factor
, start
, end
);
9063 READ_ULEB (fc
->ra
, start
, end
);
9066 if (fc
->augmentation
[0] == 'z')
9070 READ_ULEB (augmentation_data_len
, start
, end
);
9071 augmentation_data
= start
;
9072 /* PR 17512: file: 11042-2589-0.004. */
9073 if (augmentation_data_len
> (size_t) (end
- start
))
9075 warn (_("Augmentation data too long: %#" PRIx64
9076 ", expected at most %#tx\n"),
9077 augmentation_data_len
, end
- start
);
9080 start
+= augmentation_data_len
;
9083 if (augmentation_data_len
)
9087 unsigned char *qend
;
9089 p
= (unsigned char *) fc
->augmentation
+ 1;
9090 q
= augmentation_data
;
9091 qend
= q
+ augmentation_data_len
;
9093 while (p
< end
&& q
< qend
)
9098 q
+= 1 + size_of_encoded_value (*q
);
9100 fc
->fde_encoding
= *q
++;
9109 /* Note - it is OK if this loop terminates with q < qend.
9110 Padding may have been inserted to align the end of the CIE. */
9115 *p_version
= version
;
9118 *p_aug_len
= augmentation_data_len
;
9119 *p_aug
= augmentation_data
;
9124 free (fc
->col_offset
);
9125 free (fc
->col_type
);
9130 /* Prints out the contents on the DATA array formatted as unsigned bytes.
9131 If do_wide is not enabled, then formats the output to fit into 80 columns.
9132 PRINTED contains the number of characters already written to the current
9136 display_data (size_t printed
, const unsigned char *data
, size_t len
)
9138 if (do_wide
|| len
< ((80 - printed
) / 3))
9139 for (printed
= 0; printed
< len
; ++printed
)
9140 printf (" %02x", data
[printed
]);
9143 for (printed
= 0; printed
< len
; ++printed
)
9145 if (printed
% (80 / 3) == 0)
9147 printf (" %02x", data
[printed
]);
9152 /* Prints out the contents on the augmentation data array.
9153 If do_wide is not enabled, then formats the output to fit into 80 columns. */
9156 display_augmentation_data (const unsigned char * data
, uint64_t len
)
9160 i
= printf (_(" Augmentation data: "));
9161 display_data (i
, data
, len
);
9165 decode_eh_encoding (unsigned int value
)
9167 if (value
== DW_EH_PE_omit
)
9171 switch (value
& 0x0f)
9173 case DW_EH_PE_uleb128
: format
= "uleb128"; break;
9174 case DW_EH_PE_udata2
: format
= "udata2"; break;
9175 case DW_EH_PE_udata4
: format
= "udata4"; break;
9176 case DW_EH_PE_udata8
: format
= "udata8"; break;
9177 case DW_EH_PE_sleb128
: format
= "sleb128"; break;
9178 case DW_EH_PE_sdata2
: format
= "sdata2"; break;
9179 case DW_EH_PE_sdata4
: format
= "sdata4"; break;
9180 case DW_EH_PE_sdata8
: format
= "sdata8"; break;
9182 default: format
= "<unknown format>"; break; /* FIXME: Generate a warning ? */
9186 switch (value
& 0xf0)
9188 case DW_EH_PE_absptr
: application
= "absolute"; break;
9189 case DW_EH_PE_pcrel
: application
= "pcrel"; break;
9190 case DW_EH_PE_textrel
: application
= "textrel"; break; /* FIXME: Is this allowed ? */
9191 case DW_EH_PE_datarel
: application
= "datarel"; break;
9192 case DW_EH_PE_funcrel
: application
= "funcrel"; break; /* FIXME: Is this allowed ? */
9193 case DW_EH_PE_aligned
: application
= "aligned"; break; /* FIXME: Is this allowed ? */
9194 case DW_EH_PE_indirect
: application
= "indirect"; break; /* FIXME: Is this allowed ? */
9196 default: application
= "<unknown application method>"; break; /* FIXME: Generate a warning ? */
9199 static char buffer
[128];
9200 sprintf (buffer
, "%s, %s", format
, application
);
9204 /* Reads a value stored at START encoded according to ENCODING.
9205 Does not read from, or past, END.
9206 Upon success, returns the read value and sets * RETURN_LEN to
9207 the number of bytes read.
9208 Upon failure returns zero and sets * RETURN_LEN to 0.
9210 Note: does not perform any application transformations to the value. */
9213 get_encoded_eh_value (unsigned int encoding
,
9214 unsigned char * start
,
9215 unsigned char * end
,
9216 unsigned int * return_len
)
9221 unsigned char * old_start
;
9223 switch (encoding
& 0x0f)
9225 case DW_EH_PE_uleb128
:
9226 val
= read_leb128 (start
, end
, false, & len
, & status
);
9231 case DW_EH_PE_sleb128
:
9232 val
= read_leb128 (start
, end
, true, & len
, & status
);
9237 case DW_EH_PE_udata2
:
9239 SAFE_BYTE_GET_AND_INC (val
, start
, 2, end
);
9240 len
= start
- old_start
== 2 ? 2 : 0;
9243 case DW_EH_PE_udata4
:
9245 SAFE_BYTE_GET_AND_INC (val
, start
, 4, end
);
9246 len
= start
- old_start
== 4 ? 4 : 0;
9249 case DW_EH_PE_udata8
:
9251 SAFE_BYTE_GET_AND_INC (val
, start
, 8, end
);
9252 len
= start
- old_start
== 8 ? 8 : 0;
9255 case DW_EH_PE_sdata2
:
9257 SAFE_SIGNED_BYTE_GET_AND_INC (val
, start
, 2, end
);
9258 len
= start
- old_start
== 2 ? 2 : 0;
9261 case DW_EH_PE_sdata4
:
9263 SAFE_SIGNED_BYTE_GET_AND_INC (val
, start
, 4, end
);
9264 len
= start
- old_start
== 4 ? 4 : 0;
9267 case DW_EH_PE_sdata8
:
9269 SAFE_SIGNED_BYTE_GET_AND_INC (val
, start
, 8, end
);
9270 len
= start
- old_start
== 8 ? 8 : 0;
9287 encoded_eh_offset (unsigned int encoding
,
9288 struct dwarf_section
* section
,
9289 uint64_t section_offset
,
9292 switch (encoding
& 0xf0)
9295 /* This should not happen. FIXME: warn ? */
9296 case DW_EH_PE_absptr
:
9299 case DW_EH_PE_pcrel
:
9300 return value
+ (uint64_t)(section
->address
+ section_offset
);
9302 case DW_EH_PE_datarel
:
9303 return value
+ (uint64_t)section
->address
;
9308 display_eh_frame_hdr (struct dwarf_section
*section
,
9309 void *file ATTRIBUTE_UNUSED
)
9311 unsigned char *start
= section
->start
;
9312 unsigned char *end
= start
+ section
->size
;
9314 introduce (section
, false);
9316 if (section
->size
< 6)
9318 warn (_(".eh_frame_hdr section is too small\n"));
9322 unsigned int version
= start
[0];
9325 warn (_("Unsupported .eh_frame_hdr version %u\n"), version
);
9329 printf (_(" Version: %u\n"), version
);
9331 unsigned int ptr_enc
= start
[1];
9332 /* Strictly speaking this is the encoding format of the eh_frame_ptr field below. */
9333 printf (_(" Pointer Encoding Format: %#x (%s)\n"), ptr_enc
, decode_eh_encoding (ptr_enc
));
9335 unsigned int count_enc
= start
[2];
9336 printf (_(" Count Encoding Format: %#x (%s)\n"), count_enc
, decode_eh_encoding (count_enc
));
9338 unsigned int table_enc
= start
[3];
9339 printf (_(" Table Encoding Format: %#x (%s)\n"), table_enc
, decode_eh_encoding (table_enc
));
9345 uint64_t eh_frame_ptr
= get_encoded_eh_value (ptr_enc
, start
, end
, & len
);
9348 warn (_("unable to read eh_frame_ptr field in .eh_frame_hdr section\n"));
9351 printf (_(" Start of frame section: %#" PRIx64
), eh_frame_ptr
);
9353 uint64_t offset_eh_frame_ptr
= encoded_eh_offset (ptr_enc
, section
, 4, eh_frame_ptr
);
9354 if (offset_eh_frame_ptr
!= eh_frame_ptr
)
9355 printf (_(" (offset: %#" PRIx64
")"), offset_eh_frame_ptr
);
9360 if (count_enc
== DW_EH_PE_omit
)
9362 warn (_("It is suspicious to have a .eh_frame_hdr section with an empty search table\n"));
9366 if (count_enc
& 0xf0)
9368 warn (_("The count field format should be absolute, not relative to an address\n"));
9372 uint64_t fde_count
= get_encoded_eh_value (count_enc
, start
, end
, & len
);
9375 warn (_("unable to read fde_count field in .eh_frame_hdr section\n"));
9378 printf (_(" Entries in search table: %#" PRIx64
), fde_count
);
9382 if (fde_count
!= 0 && table_enc
== DW_EH_PE_omit
)
9384 warn (_("It is suspicious to have a .eh_frame_hdr section an empty table but a non empty count field\n"));
9389 /* Read and display the search table. */
9390 for (i
= 0; i
< fde_count
; i
++)
9392 uint64_t location
, address
;
9393 unsigned char * row_start
= start
;
9395 location
= get_encoded_eh_value (table_enc
, start
, end
, & len
);
9398 warn (_("Failed to read location field for entry %#" PRIx64
" in the .eh_frame_hdr's search table\n"), i
);
9403 address
= get_encoded_eh_value (table_enc
, start
, end
, & len
);
9406 warn (_("Failed to read address field for entry %#" PRIx64
" in the .eh_frame_hdr's search table\n"), i
);
9411 /* This format is intended to be compatible with the output of eu-readelf's -e option. */
9412 printf (" %#" PRIx64
" (offset: %#" PRIx64
") -> %#" PRIx64
" fde=[ %5" PRIx64
"]\n",
9414 encoded_eh_offset (table_enc
, section
, row_start
- section
->start
, location
),
9416 encoded_eh_offset (table_enc
, section
, row_start
- section
->start
, address
) - offset_eh_frame_ptr
);
9424 display_debug_frames (struct dwarf_section
*section
,
9425 void *file ATTRIBUTE_UNUSED
)
9427 unsigned char *start
= section
->start
;
9428 unsigned char *end
= start
+ section
->size
;
9429 unsigned char *section_start
= start
;
9430 Frame_Chunk
*chunks
= NULL
, *forward_refs
= NULL
;
9431 Frame_Chunk
*remembered_state
= NULL
;
9433 bool is_eh
= strcmp (section
->name
, ".eh_frame") == 0;
9434 unsigned int max_regs
= 0;
9435 const char *bad_reg
= _("bad register: ");
9436 unsigned int saved_eh_addr_size
= eh_addr_size
;
9438 introduce (section
, false);
9442 unsigned char *saved_start
;
9443 unsigned char *block_end
;
9448 int need_col_headers
= 1;
9449 unsigned char *augmentation_data
= NULL
;
9450 uint64_t augmentation_data_len
= 0;
9451 unsigned int encoded_ptr_size
= saved_eh_addr_size
;
9452 unsigned int offset_size
;
9454 static Frame_Chunk fde_fc
;
9456 saved_start
= start
;
9458 SAFE_BYTE_GET_AND_INC (length
, start
, 4, end
);
9462 printf ("\n%08tx ZERO terminator\n\n",
9463 saved_start
- section_start
);
9464 /* Skip any zero terminators that directly follow.
9465 A corrupt section size could have loaded a whole
9466 slew of zero filled memory bytes. eg
9467 PR 17512: file: 070-19381-0.004. */
9468 while (start
< end
&& * start
== 0)
9473 if (length
== 0xffffffff)
9475 SAFE_BYTE_GET_AND_INC (length
, start
, 8, end
);
9481 if (length
> (size_t) (end
- start
))
9483 warn ("Invalid length %#" PRIx64
" in FDE at %#tx\n",
9484 length
, saved_start
- section_start
);
9488 block_end
= start
+ length
;
9490 SAFE_BYTE_GET_AND_INC (cie_id
, start
, offset_size
, block_end
);
9492 if (is_eh
? (cie_id
== 0) : ((offset_size
== 4 && cie_id
== DW_CIE_ID
)
9493 || (offset_size
== 8 && cie_id
== DW64_CIE_ID
)))
9498 start
= read_cie (start
, block_end
, &cie
, &version
,
9499 &augmentation_data_len
, &augmentation_data
);
9500 /* PR 17512: file: 027-135133-0.005. */
9507 fc
->chunk_start
= saved_start
;
9508 mreg
= max_regs
> 0 ? max_regs
- 1 : 0;
9511 if (frame_need_space (fc
, mreg
) < 0)
9513 if (fc
->fde_encoding
)
9514 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9516 printf ("\n%08tx ", saved_start
- section_start
);
9517 print_hex (length
, fc
->ptr_size
);
9518 print_hex (cie_id
, offset_size
);
9520 if (do_debug_frames_interp
)
9522 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc
->augmentation
,
9523 fc
->code_factor
, fc
->data_factor
, fc
->ra
);
9528 printf (" Version: %d\n", version
);
9529 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9532 printf (" Pointer Size: %u\n", fc
->ptr_size
);
9533 printf (" Segment Size: %u\n", fc
->segment_size
);
9535 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9536 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9537 printf (" Return address column: %d\n", fc
->ra
);
9539 if (augmentation_data_len
)
9540 display_augmentation_data (augmentation_data
, augmentation_data_len
);
9547 unsigned char *look_for
;
9548 unsigned long segment_selector
;
9554 uint64_t sign
= (uint64_t) 1 << (offset_size
* 8 - 1);
9555 cie_off
= (cie_off
^ sign
) - sign
;
9556 cie_off
= start
- 4 - section_start
- cie_off
;
9559 look_for
= section_start
+ cie_off
;
9560 if (cie_off
<= (size_t) (saved_start
- section_start
))
9562 for (cie
= chunks
; cie
; cie
= cie
->next
)
9563 if (cie
->chunk_start
== look_for
)
9566 else if (cie_off
>= section
->size
)
9570 for (cie
= forward_refs
; cie
; cie
= cie
->next
)
9571 if (cie
->chunk_start
== look_for
)
9575 unsigned int off_size
;
9576 unsigned char *cie_scan
;
9578 cie_scan
= look_for
;
9580 SAFE_BYTE_GET_AND_INC (length
, cie_scan
, 4, end
);
9581 if (length
== 0xffffffff)
9583 SAFE_BYTE_GET_AND_INC (length
, cie_scan
, 8, end
);
9586 if (length
!= 0 && length
<= (size_t) (end
- cie_scan
))
9589 unsigned char *cie_end
= cie_scan
+ length
;
9591 SAFE_BYTE_GET_AND_INC (c_id
, cie_scan
, off_size
,
9595 : ((off_size
== 4 && c_id
== DW_CIE_ID
)
9596 || (off_size
== 8 && c_id
== DW64_CIE_ID
)))
9601 read_cie (cie_scan
, cie_end
, &cie
, &version
,
9602 &augmentation_data_len
, &augmentation_data
);
9603 /* PR 17512: file: 3450-2098-0.004. */
9606 warn (_("Failed to read CIE information\n"));
9609 cie
->next
= forward_refs
;
9611 cie
->chunk_start
= look_for
;
9612 mreg
= max_regs
> 0 ? max_regs
- 1 : 0;
9615 if (frame_need_space (cie
, mreg
) < 0)
9617 warn (_("Invalid max register\n"));
9620 if (cie
->fde_encoding
)
9622 = size_of_encoded_value (cie
->fde_encoding
);
9629 memset (fc
, 0, sizeof (Frame_Chunk
));
9634 fc
->col_type
= xmalloc (sizeof (*fc
->col_type
));
9635 fc
->col_offset
= xmalloc (sizeof (*fc
->col_offset
));
9636 if (frame_need_space (fc
, max_regs
> 0 ? max_regs
- 1 : 0) < 0)
9638 warn (_("Invalid max register\n"));
9642 fc
->augmentation
= "";
9643 fc
->fde_encoding
= 0;
9644 fc
->ptr_size
= eh_addr_size
;
9645 fc
->segment_size
= 0;
9649 fc
->ncols
= cie
->ncols
;
9650 fc
->col_type
= xcmalloc (fc
->ncols
, sizeof (*fc
->col_type
));
9651 fc
->col_offset
= xcmalloc (fc
->ncols
, sizeof (*fc
->col_offset
));
9652 memcpy (fc
->col_type
, cie
->col_type
,
9653 fc
->ncols
* sizeof (*fc
->col_type
));
9654 memcpy (fc
->col_offset
, cie
->col_offset
,
9655 fc
->ncols
* sizeof (*fc
->col_offset
));
9656 fc
->augmentation
= cie
->augmentation
;
9657 fc
->ptr_size
= cie
->ptr_size
;
9658 eh_addr_size
= cie
->ptr_size
;
9659 fc
->segment_size
= cie
->segment_size
;
9660 fc
->code_factor
= cie
->code_factor
;
9661 fc
->data_factor
= cie
->data_factor
;
9662 fc
->cfa_reg
= cie
->cfa_reg
;
9663 fc
->cfa_offset
= cie
->cfa_offset
;
9665 if (frame_need_space (fc
, max_regs
> 0 ? max_regs
- 1: 0) < 0)
9667 warn (_("Invalid max register\n"));
9670 fc
->fde_encoding
= cie
->fde_encoding
;
9673 if (fc
->fde_encoding
)
9674 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9676 segment_selector
= 0;
9677 if (fc
->segment_size
)
9679 if (fc
->segment_size
> sizeof (segment_selector
))
9681 /* PR 17512: file: 9e196b3e. */
9682 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc
->segment_size
);
9683 fc
->segment_size
= 4;
9685 SAFE_BYTE_GET_AND_INC (segment_selector
, start
,
9686 fc
->segment_size
, block_end
);
9689 fc
->pc_begin
= get_encoded_value (&start
, fc
->fde_encoding
, section
,
9692 /* FIXME: It appears that sometimes the final pc_range value is
9693 encoded in less than encoded_ptr_size bytes. See the x86_64
9694 run of the "objcopy on compressed debug sections" test for an
9696 SAFE_BYTE_GET_AND_INC (fc
->pc_range
, start
, encoded_ptr_size
,
9699 if (cie
->augmentation
[0] == 'z')
9701 READ_ULEB (augmentation_data_len
, start
, block_end
);
9702 augmentation_data
= start
;
9703 /* PR 17512 file: 722-8446-0.004 and PR 22386. */
9704 if (augmentation_data_len
> (size_t) (block_end
- start
))
9706 warn (_("Augmentation data too long: %#" PRIx64
", "
9707 "expected at most %#tx\n"),
9708 augmentation_data_len
, block_end
- start
);
9710 augmentation_data
= NULL
;
9711 augmentation_data_len
= 0;
9713 start
+= augmentation_data_len
;
9716 printf ("\n%08tx ", saved_start
- section_start
);
9717 print_hex (length
, fc
->ptr_size
);
9718 print_hex (cie_id
, offset_size
);
9721 if (cie
->chunk_start
)
9722 printf ("cie=%08tx", cie
->chunk_start
- section_start
);
9724 /* Ideally translate "invalid " to 8 chars, trailing space
9726 printf (_("cie=invalid "));
9729 if (fc
->segment_size
)
9730 printf ("%04lx:", segment_selector
);
9732 print_hex_ns (fc
->pc_begin
, fc
->ptr_size
);
9734 print_hex_ns (fc
->pc_begin
+ fc
->pc_range
, fc
->ptr_size
);
9737 if (! do_debug_frames_interp
&& augmentation_data_len
)
9739 display_augmentation_data (augmentation_data
, augmentation_data_len
);
9744 /* At this point, fc is the current chunk, cie (if any) is set, and
9745 we're about to interpret instructions for the chunk. */
9746 /* ??? At present we need to do this always, since this sizes the
9747 fc->col_type and fc->col_offset arrays, which we write into always.
9748 We should probably split the interpreted and non-interpreted bits
9749 into two different routines, since there's so much that doesn't
9750 really overlap between them. */
9751 if (1 || do_debug_frames_interp
)
9753 /* Start by making a pass over the chunk, allocating storage
9754 and taking note of what registers are used. */
9755 unsigned char *tmp
= start
;
9757 while (start
< block_end
)
9759 unsigned int reg
, op
, opa
;
9767 /* Warning: if you add any more cases to this switch, be
9768 sure to add them to the corresponding switch below. */
9772 case DW_CFA_advance_loc
:
9775 SKIP_ULEB (start
, block_end
);
9778 case DW_CFA_restore
:
9781 case DW_CFA_set_loc
:
9782 if ((size_t) (block_end
- start
) < encoded_ptr_size
)
9785 start
+= encoded_ptr_size
;
9787 case DW_CFA_advance_loc1
:
9788 if ((size_t) (block_end
- start
) < 1)
9793 case DW_CFA_advance_loc2
:
9794 if ((size_t) (block_end
- start
) < 2)
9799 case DW_CFA_advance_loc4
:
9800 if ((size_t) (block_end
- start
) < 4)
9805 case DW_CFA_offset_extended
:
9806 case DW_CFA_val_offset
:
9807 READ_ULEB (reg
, start
, block_end
);
9808 SKIP_ULEB (start
, block_end
);
9810 case DW_CFA_restore_extended
:
9811 READ_ULEB (reg
, start
, block_end
);
9813 case DW_CFA_undefined
:
9814 READ_ULEB (reg
, start
, block_end
);
9816 case DW_CFA_same_value
:
9817 READ_ULEB (reg
, start
, block_end
);
9819 case DW_CFA_register
:
9820 READ_ULEB (reg
, start
, block_end
);
9821 SKIP_ULEB (start
, block_end
);
9823 case DW_CFA_def_cfa
:
9824 SKIP_ULEB (start
, block_end
);
9825 SKIP_ULEB (start
, block_end
);
9827 case DW_CFA_def_cfa_register
:
9828 SKIP_ULEB (start
, block_end
);
9830 case DW_CFA_def_cfa_offset
:
9831 SKIP_ULEB (start
, block_end
);
9833 case DW_CFA_def_cfa_expression
:
9834 READ_ULEB (temp
, start
, block_end
);
9835 if ((size_t) (block_end
- start
) < temp
)
9840 case DW_CFA_expression
:
9841 case DW_CFA_val_expression
:
9842 READ_ULEB (reg
, start
, block_end
);
9843 READ_ULEB (temp
, start
, block_end
);
9844 if ((size_t) (block_end
- start
) < temp
)
9849 case DW_CFA_offset_extended_sf
:
9850 case DW_CFA_val_offset_sf
:
9851 READ_ULEB (reg
, start
, block_end
);
9852 SKIP_SLEB (start
, block_end
);
9854 case DW_CFA_def_cfa_sf
:
9855 SKIP_ULEB (start
, block_end
);
9856 SKIP_SLEB (start
, block_end
);
9858 case DW_CFA_def_cfa_offset_sf
:
9859 SKIP_SLEB (start
, block_end
);
9861 case DW_CFA_MIPS_advance_loc8
:
9862 if ((size_t) (block_end
- start
) < 8)
9867 case DW_CFA_GNU_args_size
:
9868 SKIP_ULEB (start
, block_end
);
9870 case DW_CFA_GNU_negative_offset_extended
:
9871 READ_ULEB (reg
, start
, block_end
);
9872 SKIP_ULEB (start
, block_end
);
9877 if (reg
!= -1u && frame_need_space (fc
, reg
) >= 0)
9879 /* Don't leave any reg as DW_CFA_unreferenced so
9880 that frame_display_row prints name of regs in
9881 header, and all referenced regs in each line. */
9882 if (reg
>= cie
->ncols
9883 || cie
->col_type
[reg
] == DW_CFA_unreferenced
)
9884 fc
->col_type
[reg
] = DW_CFA_undefined
;
9886 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9894 /* Now we know what registers are used, make a second pass over
9895 the chunk, this time actually printing out the info. */
9897 while (start
< block_end
)
9900 /* Note: It is tempting to use an unsigned long for 'reg' but there
9901 are various functions, notably frame_space_needed() that assume that
9902 reg is an unsigned int. */
9906 const char *reg_prefix
= "";
9913 /* Make a note if something other than DW_CFA_nop happens. */
9914 if (op
!= DW_CFA_nop
)
9917 /* Warning: if you add any more cases to this switch, be
9918 sure to add them to the corresponding switch above. */
9921 case DW_CFA_advance_loc
:
9922 opa
*= fc
->code_factor
;
9923 if (do_debug_frames_interp
)
9924 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9927 printf (" DW_CFA_advance_loc: %d to ", opa
);
9928 print_hex_ns (fc
->pc_begin
+ opa
, fc
->ptr_size
);
9931 fc
->pc_begin
+= opa
;
9935 READ_ULEB (ofs
, start
, block_end
);
9936 ofs
*= fc
->data_factor
;
9937 if (opa
>= fc
->ncols
)
9938 reg_prefix
= bad_reg
;
9939 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
9940 printf (" DW_CFA_offset: %s%s at cfa%+" PRId64
"\n",
9941 reg_prefix
, regname (opa
, 0), ofs
);
9942 if (*reg_prefix
== '\0')
9944 fc
->col_type
[opa
] = DW_CFA_offset
;
9945 fc
->col_offset
[opa
] = ofs
;
9949 case DW_CFA_restore
:
9950 if (opa
>= fc
->ncols
)
9951 reg_prefix
= bad_reg
;
9952 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
9953 printf (" DW_CFA_restore: %s%s\n",
9954 reg_prefix
, regname (opa
, 0));
9955 if (*reg_prefix
!= '\0')
9958 if (opa
>= cie
->ncols
9959 || cie
->col_type
[opa
] == DW_CFA_unreferenced
)
9961 fc
->col_type
[opa
] = DW_CFA_undefined
;
9962 fc
->col_offset
[opa
] = 0;
9966 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9967 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9971 case DW_CFA_set_loc
:
9972 ofs
= get_encoded_value (&start
, fc
->fde_encoding
, section
,
9974 if (do_debug_frames_interp
)
9975 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9978 printf (" DW_CFA_set_loc: ");
9979 print_hex_ns (ofs
, fc
->ptr_size
);
9985 case DW_CFA_advance_loc1
:
9986 SAFE_BYTE_GET_AND_INC (ofs
, start
, 1, block_end
);
9987 ofs
*= fc
->code_factor
;
9988 if (do_debug_frames_interp
)
9989 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9992 printf (" DW_CFA_advance_loc1: %" PRId64
" to ", ofs
);
9993 print_hex_ns (fc
->pc_begin
+ ofs
, fc
->ptr_size
);
9996 fc
->pc_begin
+= ofs
;
9999 case DW_CFA_advance_loc2
:
10000 SAFE_BYTE_GET_AND_INC (ofs
, start
, 2, block_end
);
10001 ofs
*= fc
->code_factor
;
10002 if (do_debug_frames_interp
)
10003 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10006 printf (" DW_CFA_advance_loc2: %" PRId64
" to ", ofs
);
10007 print_hex_ns (fc
->pc_begin
+ ofs
, fc
->ptr_size
);
10010 fc
->pc_begin
+= ofs
;
10013 case DW_CFA_advance_loc4
:
10014 SAFE_BYTE_GET_AND_INC (ofs
, start
, 4, block_end
);
10015 ofs
*= fc
->code_factor
;
10016 if (do_debug_frames_interp
)
10017 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10020 printf (" DW_CFA_advance_loc4: %" PRId64
" to ", ofs
);
10021 print_hex_ns (fc
->pc_begin
+ ofs
, fc
->ptr_size
);
10024 fc
->pc_begin
+= ofs
;
10027 case DW_CFA_offset_extended
:
10028 READ_ULEB (reg
, start
, block_end
);
10029 READ_ULEB (ofs
, start
, block_end
);
10030 ofs
*= fc
->data_factor
;
10031 if (reg
>= fc
->ncols
)
10032 reg_prefix
= bad_reg
;
10033 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10034 printf (" DW_CFA_offset_extended: %s%s at cfa%+" PRId64
"\n",
10035 reg_prefix
, regname (reg
, 0), ofs
);
10036 if (*reg_prefix
== '\0')
10038 fc
->col_type
[reg
] = DW_CFA_offset
;
10039 fc
->col_offset
[reg
] = ofs
;
10043 case DW_CFA_val_offset
:
10044 READ_ULEB (reg
, start
, block_end
);
10045 READ_ULEB (ofs
, start
, block_end
);
10046 ofs
*= fc
->data_factor
;
10047 if (reg
>= fc
->ncols
)
10048 reg_prefix
= bad_reg
;
10049 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10050 printf (" DW_CFA_val_offset: %s%s is cfa%+" PRId64
"\n",
10051 reg_prefix
, regname (reg
, 0), ofs
);
10052 if (*reg_prefix
== '\0')
10054 fc
->col_type
[reg
] = DW_CFA_val_offset
;
10055 fc
->col_offset
[reg
] = ofs
;
10059 case DW_CFA_restore_extended
:
10060 READ_ULEB (reg
, start
, block_end
);
10061 if (reg
>= fc
->ncols
)
10062 reg_prefix
= bad_reg
;
10063 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10064 printf (" DW_CFA_restore_extended: %s%s\n",
10065 reg_prefix
, regname (reg
, 0));
10066 if (*reg_prefix
!= '\0')
10069 if (reg
>= cie
->ncols
10070 || cie
->col_type
[reg
] == DW_CFA_unreferenced
)
10072 fc
->col_type
[reg
] = DW_CFA_undefined
;
10073 fc
->col_offset
[reg
] = 0;
10077 fc
->col_type
[reg
] = cie
->col_type
[reg
];
10078 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
10082 case DW_CFA_undefined
:
10083 READ_ULEB (reg
, start
, block_end
);
10084 if (reg
>= fc
->ncols
)
10085 reg_prefix
= bad_reg
;
10086 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10087 printf (" DW_CFA_undefined: %s%s\n",
10088 reg_prefix
, regname (reg
, 0));
10089 if (*reg_prefix
== '\0')
10091 fc
->col_type
[reg
] = DW_CFA_undefined
;
10092 fc
->col_offset
[reg
] = 0;
10096 case DW_CFA_same_value
:
10097 READ_ULEB (reg
, start
, block_end
);
10098 if (reg
>= fc
->ncols
)
10099 reg_prefix
= bad_reg
;
10100 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10101 printf (" DW_CFA_same_value: %s%s\n",
10102 reg_prefix
, regname (reg
, 0));
10103 if (*reg_prefix
== '\0')
10105 fc
->col_type
[reg
] = DW_CFA_same_value
;
10106 fc
->col_offset
[reg
] = 0;
10110 case DW_CFA_register
:
10111 READ_ULEB (reg
, start
, block_end
);
10112 READ_ULEB (ofs
, start
, block_end
);
10113 if (reg
>= fc
->ncols
)
10114 reg_prefix
= bad_reg
;
10115 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10117 printf (" DW_CFA_register: %s%s in ",
10118 reg_prefix
, regname (reg
, 0));
10119 puts (regname (ofs
, 0));
10121 if (*reg_prefix
== '\0')
10123 fc
->col_type
[reg
] = DW_CFA_register
;
10124 fc
->col_offset
[reg
] = ofs
;
10128 case DW_CFA_remember_state
:
10129 if (! do_debug_frames_interp
)
10130 printf (" DW_CFA_remember_state\n");
10131 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
10132 rs
->cfa_offset
= fc
->cfa_offset
;
10133 rs
->cfa_reg
= fc
->cfa_reg
;
10135 rs
->cfa_exp
= fc
->cfa_exp
;
10136 rs
->ncols
= fc
->ncols
;
10137 rs
->col_type
= xcmalloc (rs
->ncols
, sizeof (*rs
->col_type
));
10138 rs
->col_offset
= xcmalloc (rs
->ncols
, sizeof (*rs
->col_offset
));
10139 memcpy (rs
->col_type
, fc
->col_type
,
10140 rs
->ncols
* sizeof (*fc
->col_type
));
10141 memcpy (rs
->col_offset
, fc
->col_offset
,
10142 rs
->ncols
* sizeof (*fc
->col_offset
));
10143 rs
->next
= remembered_state
;
10144 remembered_state
= rs
;
10147 case DW_CFA_restore_state
:
10148 if (! do_debug_frames_interp
)
10149 printf (" DW_CFA_restore_state\n");
10150 rs
= remembered_state
;
10153 remembered_state
= rs
->next
;
10154 fc
->cfa_offset
= rs
->cfa_offset
;
10155 fc
->cfa_reg
= rs
->cfa_reg
;
10157 fc
->cfa_exp
= rs
->cfa_exp
;
10158 if (frame_need_space (fc
, rs
->ncols
- 1) < 0)
10160 warn (_("Invalid column number in saved frame state\n"));
10165 memcpy (fc
->col_type
, rs
->col_type
,
10166 rs
->ncols
* sizeof (*rs
->col_type
));
10167 memcpy (fc
->col_offset
, rs
->col_offset
,
10168 rs
->ncols
* sizeof (*rs
->col_offset
));
10170 free (rs
->col_type
);
10171 free (rs
->col_offset
);
10174 else if (do_debug_frames_interp
)
10175 printf ("Mismatched DW_CFA_restore_state\n");
10178 case DW_CFA_def_cfa
:
10179 READ_ULEB (fc
->cfa_reg
, start
, block_end
);
10180 READ_ULEB (fc
->cfa_offset
, start
, block_end
);
10182 if (! do_debug_frames_interp
)
10183 printf (" DW_CFA_def_cfa: %s ofs %d\n",
10184 regname (fc
->cfa_reg
, 0), (int) fc
->cfa_offset
);
10187 case DW_CFA_def_cfa_register
:
10188 READ_ULEB (fc
->cfa_reg
, start
, block_end
);
10190 if (! do_debug_frames_interp
)
10191 printf (" DW_CFA_def_cfa_register: %s\n",
10192 regname (fc
->cfa_reg
, 0));
10195 case DW_CFA_def_cfa_offset
:
10196 READ_ULEB (fc
->cfa_offset
, start
, block_end
);
10197 if (! do_debug_frames_interp
)
10198 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc
->cfa_offset
);
10202 if (! do_debug_frames_interp
)
10203 printf (" DW_CFA_nop\n");
10206 case DW_CFA_def_cfa_expression
:
10207 READ_ULEB (ofs
, start
, block_end
);
10208 if (ofs
> (size_t) (block_end
- start
))
10210 printf (_(" %s: <corrupt len %" PRIu64
">\n"),
10211 "DW_CFA_def_cfa_expression", ofs
);
10214 if (! do_debug_frames_interp
)
10216 printf (" DW_CFA_def_cfa_expression (");
10217 decode_location_expression (start
, eh_addr_size
, 0, -1,
10225 case DW_CFA_expression
:
10226 READ_ULEB (reg
, start
, block_end
);
10227 READ_ULEB (ofs
, start
, block_end
);
10228 if (reg
>= fc
->ncols
)
10229 reg_prefix
= bad_reg
;
10230 /* PR 17512: file: 069-133014-0.006. */
10231 /* PR 17512: file: 98c02eb4. */
10232 if (ofs
> (size_t) (block_end
- start
))
10234 printf (_(" %s: <corrupt len %" PRIu64
">\n"),
10235 "DW_CFA_expression", ofs
);
10238 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10240 printf (" DW_CFA_expression: %s%s (",
10241 reg_prefix
, regname (reg
, 0));
10242 decode_location_expression (start
, eh_addr_size
, 0, -1,
10246 if (*reg_prefix
== '\0')
10247 fc
->col_type
[reg
] = DW_CFA_expression
;
10251 case DW_CFA_val_expression
:
10252 READ_ULEB (reg
, start
, block_end
);
10253 READ_ULEB (ofs
, start
, block_end
);
10254 if (reg
>= fc
->ncols
)
10255 reg_prefix
= bad_reg
;
10256 if (ofs
> (size_t) (block_end
- start
))
10258 printf (" %s: <corrupt len %" PRIu64
">\n",
10259 "DW_CFA_val_expression", ofs
);
10262 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10264 printf (" DW_CFA_val_expression: %s%s (",
10265 reg_prefix
, regname (reg
, 0));
10266 decode_location_expression (start
, eh_addr_size
, 0, -1,
10270 if (*reg_prefix
== '\0')
10271 fc
->col_type
[reg
] = DW_CFA_val_expression
;
10275 case DW_CFA_offset_extended_sf
:
10276 READ_ULEB (reg
, start
, block_end
);
10277 READ_SLEB (sofs
, start
, block_end
);
10278 /* data_factor multiplicaton done here as unsigned to
10279 avoid integer overflow warnings from asan on fuzzed
10282 ofs
*= fc
->data_factor
;
10283 if (reg
>= fc
->ncols
)
10284 reg_prefix
= bad_reg
;
10285 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10286 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+" PRId64
"\n",
10287 reg_prefix
, regname (reg
, 0), ofs
);
10288 if (*reg_prefix
== '\0')
10290 fc
->col_type
[reg
] = DW_CFA_offset
;
10291 fc
->col_offset
[reg
] = ofs
;
10295 case DW_CFA_val_offset_sf
:
10296 READ_ULEB (reg
, start
, block_end
);
10297 READ_SLEB (sofs
, start
, block_end
);
10299 ofs
*= fc
->data_factor
;
10300 if (reg
>= fc
->ncols
)
10301 reg_prefix
= bad_reg
;
10302 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10303 printf (" DW_CFA_val_offset_sf: %s%s is cfa%+" PRId64
"\n",
10304 reg_prefix
, regname (reg
, 0), ofs
);
10305 if (*reg_prefix
== '\0')
10307 fc
->col_type
[reg
] = DW_CFA_val_offset
;
10308 fc
->col_offset
[reg
] = ofs
;
10312 case DW_CFA_def_cfa_sf
:
10313 READ_ULEB (fc
->cfa_reg
, start
, block_end
);
10314 READ_SLEB (sofs
, start
, block_end
);
10316 ofs
*= fc
->data_factor
;
10317 fc
->cfa_offset
= ofs
;
10319 if (! do_debug_frames_interp
)
10320 printf (" DW_CFA_def_cfa_sf: %s ofs %" PRId64
"\n",
10321 regname (fc
->cfa_reg
, 0), ofs
);
10324 case DW_CFA_def_cfa_offset_sf
:
10325 READ_SLEB (sofs
, start
, block_end
);
10327 ofs
*= fc
->data_factor
;
10328 fc
->cfa_offset
= ofs
;
10329 if (! do_debug_frames_interp
)
10330 printf (" DW_CFA_def_cfa_offset_sf: %" PRId64
"\n", ofs
);
10333 case DW_CFA_MIPS_advance_loc8
:
10334 SAFE_BYTE_GET_AND_INC (ofs
, start
, 8, block_end
);
10335 ofs
*= fc
->code_factor
;
10336 if (do_debug_frames_interp
)
10337 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10340 printf (" DW_CFA_MIPS_advance_loc8: %" PRId64
" to ", ofs
);
10341 print_hex_ns (fc
->pc_begin
+ ofs
, fc
->ptr_size
);
10344 fc
->pc_begin
+= ofs
;
10347 case DW_CFA_GNU_window_save
:
10348 if (! do_debug_frames_interp
)
10349 printf (" %s\n", DW_CFA_GNU_window_save_name
[is_aarch64
]);
10352 case DW_CFA_GNU_args_size
:
10353 READ_ULEB (ofs
, start
, block_end
);
10354 if (! do_debug_frames_interp
)
10355 printf (" DW_CFA_GNU_args_size: %" PRIu64
"\n", ofs
);
10358 case DW_CFA_GNU_negative_offset_extended
:
10359 READ_ULEB (reg
, start
, block_end
);
10360 READ_SLEB (sofs
, start
, block_end
);
10362 ofs
= -ofs
* fc
->data_factor
;
10363 if (reg
>= fc
->ncols
)
10364 reg_prefix
= bad_reg
;
10365 if (! do_debug_frames_interp
|| *reg_prefix
!= '\0')
10366 printf (" DW_CFA_GNU_negative_offset_extended: %s%s "
10367 "at cfa%+" PRId64
"\n",
10368 reg_prefix
, regname (reg
, 0), ofs
);
10369 if (*reg_prefix
== '\0')
10371 fc
->col_type
[reg
] = DW_CFA_offset
;
10372 fc
->col_offset
[reg
] = ofs
;
10377 if (op
>= DW_CFA_lo_user
&& op
<= DW_CFA_hi_user
)
10378 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op
);
10380 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op
);
10385 /* Interpret the CFA - as long as it is not completely full of NOPs. */
10386 if (do_debug_frames_interp
&& ! all_nops
)
10387 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10389 if (fde_fc
.col_type
!= NULL
)
10391 free (fde_fc
.col_type
);
10392 fde_fc
.col_type
= NULL
;
10394 if (fde_fc
.col_offset
!= NULL
)
10396 free (fde_fc
.col_offset
);
10397 fde_fc
.col_offset
= NULL
;
10401 eh_addr_size
= saved_eh_addr_size
;
10406 while (remembered_state
!= NULL
)
10408 rs
= remembered_state
;
10409 remembered_state
= rs
->next
;
10410 free (rs
->col_type
);
10411 free (rs
->col_offset
);
10412 rs
->next
= NULL
; /* Paranoia. */
10416 while (chunks
!= NULL
)
10420 free (rs
->col_type
);
10421 free (rs
->col_offset
);
10422 rs
->next
= NULL
; /* Paranoia. */
10426 while (forward_refs
!= NULL
)
10429 forward_refs
= rs
->next
;
10430 free (rs
->col_type
);
10431 free (rs
->col_offset
);
10432 rs
->next
= NULL
; /* Paranoia. */
10442 display_debug_names (struct dwarf_section
*section
, void *file
)
10444 unsigned char *hdrptr
= section
->start
;
10445 uint64_t unit_length
;
10446 unsigned char *unit_start
;
10447 const unsigned char *const section_end
= section
->start
+ section
->size
;
10448 unsigned char *unit_end
;
10450 introduce (section
, false);
10452 load_debug_section_with_follow (str
, file
);
10454 for (; hdrptr
< section_end
; hdrptr
= unit_end
)
10456 unsigned int offset_size
;
10457 uint16_t dwarf_version
, padding
;
10458 uint32_t comp_unit_count
, local_type_unit_count
, foreign_type_unit_count
;
10459 uint64_t bucket_count
, name_count
, abbrev_table_size
;
10460 uint32_t augmentation_string_size
;
10462 bool augmentation_printable
;
10463 const char *augmentation_string
;
10466 unit_start
= hdrptr
;
10468 /* Get and check the length of the block. */
10469 SAFE_BYTE_GET_AND_INC (unit_length
, hdrptr
, 4, section_end
);
10471 if (unit_length
== 0xffffffff)
10473 /* This section is 64-bit DWARF. */
10474 SAFE_BYTE_GET_AND_INC (unit_length
, hdrptr
, 8, section_end
);
10480 if (unit_length
> (size_t) (section_end
- hdrptr
)
10481 || unit_length
< 2 + 2 + 4 * 7)
10484 warn (_("Debug info is corrupted, %s header at %#tx"
10485 " has length %#" PRIx64
"\n"),
10486 section
->name
, unit_start
- section
->start
, unit_length
);
10489 unit_end
= hdrptr
+ unit_length
;
10491 /* Get and check the version number. */
10492 SAFE_BYTE_GET_AND_INC (dwarf_version
, hdrptr
, 2, unit_end
);
10493 printf (_("Version %d\n"), (int) dwarf_version
);
10495 /* Prior versions did not exist, and future versions may not be
10496 backwards compatible. */
10497 if (dwarf_version
!= 5)
10499 warn (_("Only DWARF version 5 .debug_names "
10500 "is currently supported.\n"));
10504 SAFE_BYTE_GET_AND_INC (padding
, hdrptr
, 2, unit_end
);
10506 warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
10509 SAFE_BYTE_GET_AND_INC (comp_unit_count
, hdrptr
, 4, unit_end
);
10510 if (comp_unit_count
== 0)
10511 warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
10513 SAFE_BYTE_GET_AND_INC (local_type_unit_count
, hdrptr
, 4, unit_end
);
10514 SAFE_BYTE_GET_AND_INC (foreign_type_unit_count
, hdrptr
, 4, unit_end
);
10515 SAFE_BYTE_GET_AND_INC (bucket_count
, hdrptr
, 4, unit_end
);
10516 SAFE_BYTE_GET_AND_INC (name_count
, hdrptr
, 4, unit_end
);
10517 SAFE_BYTE_GET_AND_INC (abbrev_table_size
, hdrptr
, 4, unit_end
);
10519 SAFE_BYTE_GET_AND_INC (augmentation_string_size
, hdrptr
, 4, unit_end
);
10520 if (augmentation_string_size
% 4 != 0)
10522 warn (_("Augmentation string length %u must be rounded up "
10523 "to a multiple of 4 in .debug_names.\n"),
10524 augmentation_string_size
);
10525 augmentation_string_size
+= (-augmentation_string_size
) & 3;
10527 if (augmentation_string_size
> (size_t) (unit_end
- hdrptr
))
10530 printf (_("Augmentation string:"));
10532 augmentation_printable
= true;
10533 augmentation_string
= (const char *) hdrptr
;
10535 for (i
= 0; i
< augmentation_string_size
; i
++)
10539 SAFE_BYTE_GET_AND_INC (uc
, hdrptr
, 1, unit_end
);
10540 printf (" %02x", uc
);
10542 if (uc
!= 0 && !ISPRINT (uc
))
10543 augmentation_printable
= false;
10546 if (augmentation_printable
)
10550 i
< augmentation_string_size
&& augmentation_string
[i
];
10552 putchar (augmentation_string
[i
]);
10557 printf (_("CU table:\n"));
10558 if (_mul_overflow (comp_unit_count
, offset_size
, &total
)
10559 || total
> (size_t) (unit_end
- hdrptr
))
10561 for (i
= 0; i
< comp_unit_count
; i
++)
10563 uint64_t cu_offset
;
10565 SAFE_BYTE_GET_AND_INC (cu_offset
, hdrptr
, offset_size
, unit_end
);
10566 printf ("[%3u] %#" PRIx64
"\n", i
, cu_offset
);
10570 printf (_("TU table:\n"));
10571 if (_mul_overflow (local_type_unit_count
, offset_size
, &total
)
10572 || total
> (size_t) (unit_end
- hdrptr
))
10574 for (i
= 0; i
< local_type_unit_count
; i
++)
10576 uint64_t tu_offset
;
10578 SAFE_BYTE_GET_AND_INC (tu_offset
, hdrptr
, offset_size
, unit_end
);
10579 printf ("[%3u] %#" PRIx64
"\n", i
, tu_offset
);
10583 printf (_("Foreign TU table:\n"));
10584 if (_mul_overflow (foreign_type_unit_count
, 8, &total
)
10585 || total
> (size_t) (unit_end
- hdrptr
))
10587 for (i
= 0; i
< foreign_type_unit_count
; i
++)
10589 uint64_t signature
;
10591 SAFE_BYTE_GET_AND_INC (signature
, hdrptr
, 8, unit_end
);
10592 printf (_("[%3u] "), i
);
10593 print_hex_ns (signature
, 8);
10598 uint64_t xtra
= (bucket_count
* sizeof (uint32_t)
10599 + name_count
* (sizeof (uint32_t) + 2 * offset_size
)
10600 + abbrev_table_size
);
10601 if (xtra
> (size_t) (unit_end
- hdrptr
))
10603 warn (_("Entry pool offset (%#" PRIx64
") exceeds unit size %#tx "
10604 "for unit %#tx in the debug_names\n"),
10605 xtra
, unit_end
- unit_start
, unit_start
- section
->start
);
10608 const uint32_t *const hash_table_buckets
= (uint32_t *) hdrptr
;
10609 hdrptr
+= bucket_count
* sizeof (uint32_t);
10610 const uint32_t *const hash_table_hashes
= (uint32_t *) hdrptr
;
10611 if (bucket_count
!= 0)
10612 hdrptr
+= name_count
* sizeof (uint32_t);
10613 unsigned char *const name_table_string_offsets
= hdrptr
;
10614 hdrptr
+= name_count
* offset_size
;
10615 unsigned char *const name_table_entry_offsets
= hdrptr
;
10616 hdrptr
+= name_count
* offset_size
;
10617 unsigned char *const abbrev_table
= hdrptr
;
10618 hdrptr
+= abbrev_table_size
;
10619 const unsigned char *const abbrev_table_end
= hdrptr
;
10620 unsigned char *const entry_pool
= hdrptr
;
10622 size_t buckets_filled
= 0;
10624 for (bucketi
= 0; bucketi
< bucket_count
; bucketi
++)
10626 const uint32_t bucket
= hash_table_buckets
[bucketi
];
10631 printf (ngettext ("Used %zu of %lu bucket.\n",
10632 "Used %zu of %lu buckets.\n",
10633 (unsigned long) bucket_count
),
10634 buckets_filled
, (unsigned long) bucket_count
);
10636 if (bucket_count
!= 0)
10638 uint32_t hash_prev
= 0;
10639 size_t hash_clash_count
= 0;
10640 size_t longest_clash
= 0;
10641 size_t this_length
= 0;
10643 for (hashi
= 0; hashi
< name_count
; hashi
++)
10645 const uint32_t hash_this
= hash_table_hashes
[hashi
];
10649 if (hash_prev
% bucket_count
== hash_this
% bucket_count
)
10651 ++hash_clash_count
;
10653 longest_clash
= MAX (longest_clash
, this_length
);
10658 hash_prev
= hash_this
;
10660 printf (_("Out of %" PRIu64
" items there are %zu bucket clashes"
10661 " (longest of %zu entries).\n"),
10662 name_count
, hash_clash_count
, longest_clash
);
10664 if (name_count
!= buckets_filled
+ hash_clash_count
)
10665 warn (_("The name_count (%" PRIu64
")"
10666 " is not the same as the used bucket_count"
10667 " (%zu) + the hash clash count (%zu)"),
10668 name_count
, buckets_filled
, hash_clash_count
);
10671 struct abbrev_lookup_entry
10673 uint64_t abbrev_tag
;
10674 unsigned char *abbrev_lookup_ptr
;
10676 struct abbrev_lookup_entry
*abbrev_lookup
= NULL
;
10677 size_t abbrev_lookup_used
= 0;
10678 size_t abbrev_lookup_allocated
= 0;
10680 unsigned char *abbrevptr
= abbrev_table
;
10683 uint64_t abbrev_tag
;
10685 READ_ULEB (abbrev_tag
, abbrevptr
, abbrev_table_end
);
10686 if (abbrev_tag
== 0)
10688 if (abbrev_lookup_used
== abbrev_lookup_allocated
)
10690 abbrev_lookup_allocated
= MAX (0x100,
10691 abbrev_lookup_allocated
* 2);
10692 abbrev_lookup
= xrealloc (abbrev_lookup
,
10693 (abbrev_lookup_allocated
10694 * sizeof (*abbrev_lookup
)));
10696 assert (abbrev_lookup_used
< abbrev_lookup_allocated
);
10697 struct abbrev_lookup_entry
*entry
;
10698 for (entry
= abbrev_lookup
;
10699 entry
< abbrev_lookup
+ abbrev_lookup_used
;
10701 if (entry
->abbrev_tag
== abbrev_tag
)
10703 warn (_("Duplicate abbreviation tag %" PRIu64
10704 " in unit %#tx in the debug_names section\n"),
10705 abbrev_tag
, unit_start
- section
->start
);
10708 entry
= &abbrev_lookup
[abbrev_lookup_used
++];
10709 entry
->abbrev_tag
= abbrev_tag
;
10710 entry
->abbrev_lookup_ptr
= abbrevptr
;
10712 /* Skip DWARF tag. */
10713 SKIP_ULEB (abbrevptr
, abbrev_table_end
);
10716 uint64_t xindex
, form
;
10718 READ_ULEB (xindex
, abbrevptr
, abbrev_table_end
);
10719 READ_ULEB (form
, abbrevptr
, abbrev_table_end
);
10720 if (xindex
== 0 && form
== 0)
10725 printf (_("\nSymbol table:\n"));
10727 for (namei
= 0; namei
< name_count
; ++namei
)
10729 uint64_t string_offset
, entry_offset
;
10732 p
= name_table_string_offsets
+ namei
* offset_size
;
10733 SAFE_BYTE_GET (string_offset
, p
, offset_size
, unit_end
);
10734 p
= name_table_entry_offsets
+ namei
* offset_size
;
10735 SAFE_BYTE_GET (entry_offset
, p
, offset_size
, unit_end
);
10737 /* The name table is indexed starting at 1 according to
10738 DWARF, so be sure to use the DWARF numbering here. */
10739 printf ("[%3u] ", namei
+ 1);
10740 if (bucket_count
!= 0)
10741 printf ("#%08x ", hash_table_hashes
[namei
]);
10742 printf ("%s:", fetch_indirect_string (string_offset
));
10744 unsigned char *entryptr
= entry_pool
+ entry_offset
;
10746 /* We need to scan first whether there is a single or multiple
10747 entries. TAGNO is -2 for the first entry, it is -1 for the
10748 initial tag read of the second entry, then it becomes 0 for the
10749 first entry for real printing etc. */
10751 /* Initialize it due to a false compiler warning. */
10752 uint64_t second_abbrev_tag
= -1;
10755 uint64_t abbrev_tag
;
10756 uint64_t dwarf_tag
;
10757 const struct abbrev_lookup_entry
*entry
;
10759 READ_ULEB (abbrev_tag
, entryptr
, unit_end
);
10762 second_abbrev_tag
= abbrev_tag
;
10764 entryptr
= entry_pool
+ entry_offset
;
10767 if (abbrev_tag
== 0)
10770 printf ("%s<%" PRIu64
">",
10771 (tagno
== 0 && second_abbrev_tag
== 0 ? " " : "\n\t"),
10774 for (entry
= abbrev_lookup
;
10775 entry
< abbrev_lookup
+ abbrev_lookup_used
;
10777 if (entry
->abbrev_tag
== abbrev_tag
)
10779 if (entry
>= abbrev_lookup
+ abbrev_lookup_used
)
10781 warn (_("Undefined abbreviation tag %" PRId64
10782 " in unit %#tx in the debug_names section\n"),
10784 unit_start
- section
->start
);
10787 abbrevptr
= entry
->abbrev_lookup_ptr
;
10788 READ_ULEB (dwarf_tag
, abbrevptr
, abbrev_table_end
);
10790 printf (" %s", get_TAG_name (dwarf_tag
));
10793 uint64_t xindex
, form
;
10795 READ_ULEB (xindex
, abbrevptr
, abbrev_table_end
);
10796 READ_ULEB (form
, abbrevptr
, abbrev_table_end
);
10797 if (xindex
== 0 && form
== 0)
10801 printf (" %s", get_IDX_name (xindex
));
10802 entryptr
= read_and_display_attr_value (0, form
, 0,
10803 unit_start
, entryptr
, unit_end
,
10805 dwarf_version
, NULL
,
10806 (tagno
< 0), section
,
10812 printf (_(" <no entries>"));
10816 free (abbrev_lookup
);
10823 display_debug_links (struct dwarf_section
* section
,
10824 void * file ATTRIBUTE_UNUSED
)
10826 const unsigned char * filename
;
10827 unsigned int filelen
;
10829 introduce (section
, false);
10831 /* The .gnu_debuglink section is formatted as:
10832 (c-string) Filename.
10833 (padding) If needed to reach a 4 byte boundary.
10834 (uint32_t) CRC32 value.
10836 The .gun_debugaltlink section is formatted as:
10837 (c-string) Filename.
10838 (binary) Build-ID. */
10840 filename
= section
->start
;
10841 filelen
= strnlen ((const char *) filename
, section
->size
);
10842 if (filelen
== section
->size
)
10844 warn (_("The debuglink filename is corrupt/missing\n"));
10848 printf (_(" Separate debug info file: %s\n"), filename
);
10850 if (startswith (section
->name
, ".gnu_debuglink"))
10852 unsigned int crc32
;
10853 unsigned int crc_offset
;
10855 crc_offset
= filelen
+ 1;
10856 crc_offset
= (crc_offset
+ 3) & ~3;
10857 if (crc_offset
+ 4 > section
->size
)
10859 warn (_("CRC offset missing/truncated\n"));
10863 crc32
= byte_get (filename
+ crc_offset
, 4);
10865 printf (_(" CRC value: %#x\n"), crc32
);
10867 if (crc_offset
+ 4 < section
->size
)
10869 warn (_("There are %#" PRIx64
10870 " extraneous bytes at the end of the section\n"),
10871 section
->size
- (crc_offset
+ 4));
10875 else /* startswith (section->name, ".gnu_debugaltlink") */
10877 const unsigned char *build_id
= section
->start
+ filelen
+ 1;
10878 size_t build_id_len
= section
->size
- (filelen
+ 1);
10881 /* FIXME: Should we support smaller build-id notes ? */
10882 if (build_id_len
< 0x14)
10884 warn (_("Build-ID is too short (%#zx bytes)\n"), build_id_len
);
10888 printed
= printf (_(" Build-ID (%#zx bytes):"), build_id_len
);
10889 display_data (printed
, build_id
, build_id_len
);
10898 display_gdb_index (struct dwarf_section
*section
,
10899 void *file ATTRIBUTE_UNUSED
)
10901 unsigned char *start
= section
->start
;
10903 uint32_t cu_list_offset
, tu_list_offset
;
10904 uint32_t address_table_offset
, symbol_table_offset
, constant_pool_offset
,
10905 shortcut_table_offset
;
10906 unsigned int cu_list_elements
, tu_list_elements
;
10907 unsigned int address_table_elements
, symbol_table_slots
;
10908 unsigned char *cu_list
, *tu_list
;
10909 unsigned char *address_table
, *symbol_table
, *shortcut_table
, *constant_pool
;
10912 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
10914 introduce (section
, false);
10916 version
= section
->size
< 4 ? 0 : byte_get_little_endian (start
, 4);
10917 size_t header_size
= (version
< 9 ? 6 : 7) * sizeof (uint32_t);
10918 if (section
->size
< header_size
)
10920 warn (_("Truncated header in the %s section.\n"), section
->name
);
10924 printf (_("Version %lu\n"), (unsigned long) version
);
10926 /* Prior versions are obsolete, and future versions may not be
10927 backwards compatible. */
10928 if (version
< 3 || version
> 9)
10930 warn (_("Unsupported version %lu.\n"), (unsigned long) version
);
10934 warn (_("The address table data in version 3 may be wrong.\n"));
10936 warn (_("Version 4 does not support case insensitive lookups.\n"));
10938 warn (_("Version 5 does not include inlined functions.\n"));
10940 warn (_("Version 6 does not include symbol attributes.\n"));
10941 /* Version 7 indices generated by Gold have bad type unit references,
10942 PR binutils/15021. But we don't know if the index was generated by
10943 Gold or not, so to avoid worrying users with gdb-generated indices
10944 we say nothing for version 7 here. */
10946 cu_list_offset
= byte_get_little_endian (start
+ 4, 4);
10947 tu_list_offset
= byte_get_little_endian (start
+ 8, 4);
10948 address_table_offset
= byte_get_little_endian (start
+ 12, 4);
10949 symbol_table_offset
= byte_get_little_endian (start
+ 16, 4);
10950 shortcut_table_offset
= byte_get_little_endian (start
+ 20, 4);
10952 constant_pool_offset
= shortcut_table_offset
;
10954 constant_pool_offset
= byte_get_little_endian (start
+ 24, 4);
10956 if (cu_list_offset
> section
->size
10957 || tu_list_offset
> section
->size
10958 || address_table_offset
> section
->size
10959 || symbol_table_offset
> section
->size
10960 || shortcut_table_offset
> section
->size
10961 || constant_pool_offset
> section
->size
10962 || tu_list_offset
< cu_list_offset
10963 || address_table_offset
< tu_list_offset
10964 || symbol_table_offset
< address_table_offset
10965 || shortcut_table_offset
< symbol_table_offset
10966 || constant_pool_offset
< shortcut_table_offset
)
10968 warn (_("Corrupt header in the %s section.\n"), section
->name
);
10972 cu_list_elements
= (tu_list_offset
- cu_list_offset
) / 16;
10973 tu_list_elements
= (address_table_offset
- tu_list_offset
) / 24;
10974 address_table_elements
= (symbol_table_offset
- address_table_offset
) / 20;
10975 symbol_table_slots
= (shortcut_table_offset
- symbol_table_offset
) / 8;
10977 cu_list
= start
+ cu_list_offset
;
10978 tu_list
= start
+ tu_list_offset
;
10979 address_table
= start
+ address_table_offset
;
10980 symbol_table
= start
+ symbol_table_offset
;
10981 shortcut_table
= start
+ shortcut_table_offset
;
10982 constant_pool
= start
+ constant_pool_offset
;
10984 printf (_("\nCU table:\n"));
10985 for (i
= 0; i
< cu_list_elements
; i
++)
10987 uint64_t cu_offset
= byte_get_little_endian (cu_list
+ i
* 16, 8);
10988 uint64_t cu_length
= byte_get_little_endian (cu_list
+ i
* 16 + 8, 8);
10990 printf ("[%3u] %#" PRIx64
" - %#" PRIx64
"\n",
10991 i
, cu_offset
, cu_offset
+ cu_length
- 1);
10994 printf (_("\nTU table:\n"));
10995 for (i
= 0; i
< tu_list_elements
; i
++)
10997 uint64_t tu_offset
= byte_get_little_endian (tu_list
+ i
* 24, 8);
10998 uint64_t type_offset
= byte_get_little_endian (tu_list
+ i
* 24 + 8, 8);
10999 uint64_t signature
= byte_get_little_endian (tu_list
+ i
* 24 + 16, 8);
11001 printf ("[%3u] %#" PRIx64
" %#" PRIx64
" ",
11002 i
, tu_offset
, type_offset
);
11003 print_hex_ns (signature
, 8);
11007 printf (_("\nAddress table:\n"));
11008 for (i
= 0; i
< address_table_elements
; i
++)
11010 uint64_t low
= byte_get_little_endian (address_table
+ i
* 20, 8);
11011 uint64_t high
= byte_get_little_endian (address_table
+ i
* 20 + 8, 8);
11012 uint32_t cu_index
= byte_get_little_endian (address_table
+ i
* 20 + 16, 4);
11014 print_hex (low
, 8);
11015 print_hex (high
, 8);
11016 printf ("%" PRIu32
"\n", cu_index
);
11019 printf (_("\nSymbol table:\n"));
11020 for (i
= 0; i
< symbol_table_slots
; ++i
)
11022 uint32_t name_offset
= byte_get_little_endian (symbol_table
+ i
* 8, 4);
11023 uint32_t cu_vector_offset
= byte_get_little_endian (symbol_table
+ i
* 8 + 4, 4);
11024 uint32_t num_cus
, cu
;
11026 if (name_offset
!= 0
11027 || cu_vector_offset
!= 0)
11031 /* PR 17531: file: 5b7b07ad. */
11032 if (name_offset
>= section
->size
- constant_pool_offset
)
11034 printf (_("[%3u] <corrupt offset: %x>"), i
, name_offset
);
11035 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
11039 printf ("[%3u] %.*s:", i
,
11040 (int) (section
->size
- (constant_pool_offset
+ name_offset
)),
11041 constant_pool
+ name_offset
);
11043 if (section
->size
- constant_pool_offset
< 4
11044 || cu_vector_offset
> section
->size
- constant_pool_offset
- 4)
11046 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset
);
11047 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
11048 cu_vector_offset
, i
);
11052 num_cus
= byte_get_little_endian (constant_pool
+ cu_vector_offset
, 4);
11054 if ((uint64_t) num_cus
* 4 > section
->size
- (constant_pool_offset
11055 + cu_vector_offset
+ 4))
11057 printf ("<invalid number of CUs: %d>\n", num_cus
);
11058 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
11066 for (j
= 0; j
< num_cus
; ++j
)
11069 gdb_index_symbol_kind kind
;
11071 cu
= byte_get_little_endian (constant_pool
+ cu_vector_offset
+ 4 + j
* 4, 4);
11072 is_static
= GDB_INDEX_SYMBOL_STATIC_VALUE (cu
);
11073 kind
= GDB_INDEX_SYMBOL_KIND_VALUE (cu
);
11074 cu
= GDB_INDEX_CU_VALUE (cu
);
11075 /* Convert to TU number if it's for a type unit. */
11076 if (cu
>= cu_list_elements
)
11077 printf ("%cT%lu", num_cus
> 1 ? '\t' : ' ',
11078 (unsigned long) cu
- cu_list_elements
);
11080 printf ("%c%lu", num_cus
> 1 ? '\t' : ' ', (unsigned long) cu
);
11082 printf (" [%s, %s]",
11083 is_static
? _("static") : _("global"),
11084 get_gdb_index_symbol_kind_name (kind
));
11095 printf (_("\nShortcut table:\n"));
11097 if (shortcut_table_offset
+ 8 > constant_pool_offset
)
11099 warn (_("Corrupt shortcut table in the %s section.\n"), section
->name
);
11103 uint32_t lang
= byte_get_little_endian (shortcut_table
, 4);
11104 printf (_("Language of main: "));
11105 display_lang (lang
);
11108 printf (_("Name of main: "));
11110 printf (_("<unknown>\n"));
11113 uint32_t name_offset
= byte_get_little_endian (shortcut_table
+ 4, 4);
11114 if (name_offset
>= section
->size
- constant_pool_offset
)
11116 printf (_("<corrupt offset: %x>\n"), name_offset
);
11117 warn (_("Corrupt name offset of 0x%x found for name of main\n"),
11121 printf ("%s\n", constant_pool
+ name_offset
);
11128 /* Pre-allocate enough space for the CU/TU sets needed. */
11131 prealloc_cu_tu_list (unsigned int nshndx
)
11134 /* Always allocate at least one entry for the end-marker. */
11137 if (shndx_pool
== NULL
)
11139 shndx_pool_size
= nshndx
;
11140 shndx_pool_used
= 0;
11141 shndx_pool
= (unsigned int *) xcmalloc (shndx_pool_size
,
11142 sizeof (unsigned int));
11146 shndx_pool_size
= shndx_pool_used
+ nshndx
;
11147 shndx_pool
= (unsigned int *) xcrealloc (shndx_pool
, shndx_pool_size
,
11148 sizeof (unsigned int));
11153 add_shndx_to_cu_tu_entry (unsigned int shndx
)
11155 shndx_pool
[shndx_pool_used
++] = shndx
;
11159 end_cu_tu_entry (void)
11161 shndx_pool
[shndx_pool_used
++] = 0;
11164 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
11166 static const char *
11167 get_DW_SECT_short_name (unsigned int dw_sect
)
11169 static char buf
[16];
11175 case DW_SECT_TYPES
:
11177 case DW_SECT_ABBREV
:
11183 case DW_SECT_STR_OFFSETS
:
11185 case DW_SECT_MACINFO
:
11187 case DW_SECT_MACRO
:
11193 snprintf (buf
, sizeof (buf
), "%d", dw_sect
);
11197 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
11198 These sections are extensions for Fission.
11199 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
11202 process_cu_tu_index (struct dwarf_section
*section
, int do_display
)
11204 unsigned char *phdr
= section
->start
;
11205 unsigned char *limit
= phdr
+ section
->size
;
11206 unsigned char *phash
;
11207 unsigned char *pindex
;
11208 unsigned char *ppool
;
11209 unsigned int version
;
11210 unsigned int ncols
= 0;
11211 unsigned int nused
;
11212 unsigned int nslots
;
11215 uint64_t signature
;
11218 /* PR 17512: file: 002-168123-0.004. */
11221 warn (_("Section %s is empty\n"), section
->name
);
11224 /* PR 17512: file: 002-376-0.004. */
11225 if (section
->size
< 24)
11227 warn (_("Section %s is too small to contain a CU/TU header\n"),
11233 SAFE_BYTE_GET_AND_INC (version
, phash
, 4, limit
);
11235 SAFE_BYTE_GET_AND_INC (ncols
, phash
, 4, limit
);
11236 SAFE_BYTE_GET_AND_INC (nused
, phash
, 4, limit
);
11237 SAFE_BYTE_GET_AND_INC (nslots
, phash
, 4, limit
);
11239 pindex
= phash
+ (size_t) nslots
* 8;
11240 ppool
= pindex
+ (size_t) nslots
* 4;
11244 introduce (section
, false);
11246 printf (_(" Version: %u\n"), version
);
11248 printf (_(" Number of columns: %u\n"), ncols
);
11249 printf (_(" Number of used entries: %u\n"), nused
);
11250 printf (_(" Number of slots: %u\n\n"), nslots
);
11253 /* PR 17531: file: 45d69832. */
11254 if (_mul_overflow ((size_t) nslots
, 12, &total
)
11255 || total
> (size_t) (limit
- phash
))
11257 warn (ngettext ("Section %s is too small for %u slot\n",
11258 "Section %s is too small for %u slots\n",
11260 section
->name
, nslots
);
11266 unsigned char *shndx_list
;
11267 unsigned int shndx
;
11271 prealloc_cu_tu_list ((limit
- ppool
) / 4);
11272 for (shndx_list
= ppool
+ 4; shndx_list
<= limit
- 4; shndx_list
+= 4)
11274 shndx
= byte_get (shndx_list
, 4);
11275 add_shndx_to_cu_tu_entry (shndx
);
11277 end_cu_tu_entry ();
11280 for (i
= 0; i
< nslots
; i
++)
11282 SAFE_BYTE_GET (signature
, phash
, 8, limit
);
11283 if (signature
!= 0)
11285 SAFE_BYTE_GET (j
, pindex
, 4, limit
);
11286 shndx_list
= ppool
+ j
* 4;
11287 /* PR 17531: file: 705e010d. */
11288 if (shndx_list
< ppool
)
11290 warn (_("Section index pool located before start of section\n"));
11294 printf (_(" [%3d] Signature: %#" PRIx64
" Sections: "),
11298 if (shndx_list
>= limit
)
11300 warn (_("Section %s too small for shndx pool\n"),
11304 SAFE_BYTE_GET (shndx
, shndx_list
, 4, limit
);
11307 printf (" %d", shndx
);
11316 else if (version
== 2)
11319 unsigned int dw_sect
;
11320 unsigned char *ph
= phash
;
11321 unsigned char *pi
= pindex
;
11322 unsigned char *poffsets
= ppool
+ (size_t) ncols
* 4;
11323 unsigned char *psizes
= poffsets
+ (size_t) nused
* ncols
* 4;
11325 struct cu_tu_set
*this_set
= NULL
;
11327 unsigned char *prow
;
11330 is_tu_index
= strcmp (section
->name
, ".debug_tu_index") == 0;
11332 /* PR 17531: file: 0dd159bf.
11333 Check for integer overflow (can occur when size_t is 32-bit)
11334 with overlarge ncols or nused values. */
11336 || _mul_overflow ((size_t) ncols
, 4, &temp
)
11337 || _mul_overflow ((size_t) nused
+ 1, temp
, &total
)
11338 || total
> (size_t) (limit
- ppool
)
11339 /* PR 30227: ncols could be 0. */
11340 || _mul_overflow ((size_t) nused
+ 1, 4, &total
)
11341 || total
> (size_t) (limit
- ppool
))
11343 warn (_("Section %s too small for offset and size tables\n"),
11350 printf (_(" Offset table\n"));
11351 printf (" slot %-16s ",
11352 is_tu_index
? _("signature") : _("dwo_id"));
11359 tu_sets
= xcalloc2 (nused
, sizeof (struct cu_tu_set
));
11360 this_set
= tu_sets
;
11365 cu_sets
= xcalloc2 (nused
, sizeof (struct cu_tu_set
));
11366 this_set
= cu_sets
;
11372 for (j
= 0; j
< ncols
; j
++)
11374 unsigned char *p
= ppool
+ j
* 4;
11375 SAFE_BYTE_GET (dw_sect
, p
, 4, limit
);
11376 printf (" %8s", get_DW_SECT_short_name (dw_sect
));
11381 for (i
= 0; i
< nslots
; i
++)
11383 SAFE_BYTE_GET (signature
, ph
, 8, limit
);
11385 SAFE_BYTE_GET (row
, pi
, 4, limit
);
11388 /* PR 17531: file: a05f6ab3. */
11391 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
11398 size_t num_copy
= sizeof (uint64_t);
11400 memcpy (&this_set
[row
- 1].signature
, ph
, num_copy
);
11403 prow
= poffsets
+ (row
- 1) * ncols
* 4;
11405 printf (" [%3d] %#" PRIx64
, i
, signature
);
11406 for (j
= 0; j
< ncols
; j
++)
11408 unsigned char *p
= prow
+ j
* 4;
11409 SAFE_BYTE_GET (val
, p
, 4, limit
);
11411 printf (" %8d", val
);
11415 SAFE_BYTE_GET (dw_sect
, p
, 4, limit
);
11417 /* PR 17531: file: 10796eb3. */
11418 if (dw_sect
>= DW_SECT_MAX
)
11419 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect
);
11421 this_set
[row
- 1].section_offsets
[dw_sect
] = val
;
11437 printf (_(" Size table\n"));
11438 printf (" slot %-16s ",
11439 is_tu_index
? _("signature") : _("dwo_id"));
11442 for (j
= 0; j
< ncols
; j
++)
11444 unsigned char *p
= ppool
+ j
* 4;
11445 SAFE_BYTE_GET (val
, p
, 4, limit
);
11447 printf (" %8s", get_DW_SECT_short_name (val
));
11453 for (i
= 0; i
< nslots
; i
++)
11455 SAFE_BYTE_GET (signature
, ph
, 8, limit
);
11457 SAFE_BYTE_GET (row
, pi
, 4, limit
);
11460 prow
= psizes
+ (row
- 1) * ncols
* 4;
11463 printf (" [%3d] %#" PRIx64
, i
, signature
);
11465 for (j
= 0; j
< ncols
; j
++)
11467 unsigned char *p
= prow
+ j
* 4;
11469 /* PR 28645: Check for overflow. Since we do not know how
11470 many populated rows there will be, we cannot just
11471 perform a single check at the start of this function. */
11472 if (p
> (limit
- 4))
11476 warn (_("Too many rows/columns in DWARF index section %s\n"),
11481 SAFE_BYTE_GET (val
, p
, 4, limit
);
11484 printf (" %8d", val
);
11488 SAFE_BYTE_GET (dw_sect
, p
, 4, limit
);
11489 if (dw_sect
>= DW_SECT_MAX
)
11490 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect
);
11492 this_set
[row
- 1].section_sizes
[dw_sect
] = val
;
11504 else if (do_display
)
11505 printf (_(" Unsupported version (%d)\n"), version
);
11513 static int cu_tu_indexes_read
= -1; /* Tri-state variable. */
11515 /* Load the CU and TU indexes if present. This will build a list of
11516 section sets that we can use to associate a .debug_info.dwo section
11517 with its associated .debug_abbrev.dwo section in a .dwp file. */
11520 load_cu_tu_indexes (void *file
)
11522 /* If we have already loaded (or tried to load) the CU and TU indexes
11523 then do not bother to repeat the task. */
11524 if (cu_tu_indexes_read
== -1)
11526 cu_tu_indexes_read
= true;
11528 if (load_debug_section_with_follow (dwp_cu_index
, file
))
11529 if (! process_cu_tu_index (&debug_displays
[dwp_cu_index
].section
, 0))
11530 cu_tu_indexes_read
= false;
11532 if (load_debug_section_with_follow (dwp_tu_index
, file
))
11533 if (! process_cu_tu_index (&debug_displays
[dwp_tu_index
].section
, 0))
11534 cu_tu_indexes_read
= false;
11537 return (bool) cu_tu_indexes_read
;
11540 /* Find the set of sections that includes section SHNDX. */
11543 find_cu_tu_set (void *file
, unsigned int shndx
)
11547 if (! load_cu_tu_indexes (file
))
11550 /* Find SHNDX in the shndx pool. */
11551 for (i
= 0; i
< shndx_pool_used
; i
++)
11552 if (shndx_pool
[i
] == shndx
)
11555 if (i
>= shndx_pool_used
)
11558 /* Now backup to find the first entry in the set. */
11559 while (i
> 0 && shndx_pool
[i
- 1] != 0)
11562 return shndx_pool
+ i
;
11565 /* Display a .debug_cu_index or .debug_tu_index section. */
11568 display_cu_index (struct dwarf_section
*section
, void *file ATTRIBUTE_UNUSED
)
11570 return process_cu_tu_index (section
, 1);
11574 display_debug_not_supported (struct dwarf_section
*section
,
11575 void *file ATTRIBUTE_UNUSED
)
11577 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
11583 /* Like malloc, but takes two parameters like calloc.
11584 Verifies that the first parameter is not too large.
11585 Note: does *not* initialise the allocated memory to zero. */
11588 cmalloc (uint64_t nmemb
, size_t size
)
11590 /* Check for overflow. */
11591 if (nmemb
>= ~(size_t) 0 / size
)
11594 return xmalloc (nmemb
* size
);
11597 /* Like xmalloc, but takes two parameters like calloc.
11598 Verifies that the first parameter is not too large.
11599 Note: does *not* initialise the allocated memory to zero. */
11602 xcmalloc (uint64_t nmemb
, size_t size
)
11604 /* Check for overflow. */
11605 if (nmemb
>= ~(size_t) 0 / size
)
11608 _("Attempt to allocate an array with an excessive number of elements: %#" PRIx64
"\n"),
11613 return xmalloc (nmemb
* size
);
11616 /* Like xrealloc, but takes three parameters.
11617 Verifies that the second parameter is not too large.
11618 Note: does *not* initialise any new memory to zero. */
11621 xcrealloc (void *ptr
, uint64_t nmemb
, size_t size
)
11623 /* Check for overflow. */
11624 if (nmemb
>= ~(size_t) 0 / size
)
11626 error (_("Attempt to re-allocate an array with an excessive number of elements: %#" PRIx64
"\n"),
11631 return xrealloc (ptr
, nmemb
* size
);
11634 /* Like xcalloc, but verifies that the first parameter is not too large. */
11637 xcalloc2 (uint64_t nmemb
, size_t size
)
11639 /* Check for overflow. */
11640 if (nmemb
>= ~(size_t) 0 / size
)
11642 error (_("Attempt to allocate a zero'ed array with an excessive number of elements: %#" PRIx64
"\n"),
11647 return xcalloc (nmemb
, size
);
11650 static unsigned long
11651 calc_gnu_debuglink_crc32 (unsigned long crc
,
11652 const unsigned char *buf
,
11655 static const unsigned long crc32_table
[256] =
11657 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
11658 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
11659 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
11660 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
11661 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
11662 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
11663 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
11664 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
11665 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
11666 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
11667 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
11668 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
11669 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
11670 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
11671 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
11672 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
11673 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
11674 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
11675 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
11676 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
11677 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
11678 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
11679 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
11680 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
11681 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
11682 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
11683 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
11684 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
11685 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
11686 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
11687 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
11688 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
11689 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
11690 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
11691 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
11692 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
11693 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
11694 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
11695 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
11696 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
11697 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
11698 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
11699 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
11700 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
11701 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
11702 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
11703 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
11704 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
11705 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
11706 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
11707 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
11710 const unsigned char *end
;
11712 crc
= ~crc
& 0xffffffff;
11713 for (end
= buf
+ len
; buf
< end
; ++ buf
)
11714 crc
= crc32_table
[(crc
^ *buf
) & 0xff] ^ (crc
>> 8);
11715 return ~crc
& 0xffffffff;
11718 typedef bool (*check_func_type
) (const char *, void *);
11719 typedef const char *(* parse_func_type
) (struct dwarf_section
*, void *);
11722 check_gnu_debuglink (const char * pathname
, void * crc_pointer
)
11724 static unsigned char buffer
[8 * 1024];
11727 unsigned long crc
= 0;
11730 sep_data
= open_debug_file (pathname
);
11731 if (sep_data
== NULL
)
11734 /* Yes - we are opening the file twice... */
11735 f
= fopen (pathname
, "rb");
11738 /* Paranoia: This should never happen. */
11739 close_debug_file (sep_data
);
11740 warn (_("Unable to reopen separate debug info file: %s\n"), pathname
);
11744 while ((count
= fread (buffer
, 1, sizeof (buffer
), f
)) > 0)
11745 crc
= calc_gnu_debuglink_crc32 (crc
, buffer
, count
);
11749 if (crc
!= * (unsigned long *) crc_pointer
)
11751 close_debug_file (sep_data
);
11752 warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
11760 static const char *
11761 parse_gnu_debuglink (struct dwarf_section
* section
, void * data
)
11764 unsigned int crc_offset
;
11765 unsigned long * crc32
= (unsigned long *) data
;
11767 /* The name is first.
11768 The CRC value is stored after the filename, aligned up to 4 bytes. */
11769 name
= (const char *) section
->start
;
11771 crc_offset
= strnlen (name
, section
->size
) + 1;
11772 if (crc_offset
== 1)
11774 crc_offset
= (crc_offset
+ 3) & ~3;
11775 if (crc_offset
+ 4 > section
->size
)
11778 * crc32
= byte_get (section
->start
+ crc_offset
, 4);
11783 check_gnu_debugaltlink (const char * filename
, void * data ATTRIBUTE_UNUSED
)
11785 void * sep_data
= open_debug_file (filename
);
11787 if (sep_data
== NULL
)
11790 /* FIXME: We should now extract the build-id in the separate file
11796 typedef struct build_id_data
11799 const unsigned char *data
;
11802 static const char *
11803 parse_gnu_debugaltlink (struct dwarf_section
* section
, void * data
)
11808 Build_id_data
*build_id_data
;
11810 /* The name is first.
11811 The build-id follows immediately, with no padding, up to the section's end. */
11813 name
= (const char *) section
->start
;
11814 namelen
= strnlen (name
, section
->size
) + 1;
11817 if (namelen
>= section
->size
)
11820 id_len
= section
->size
- namelen
;
11824 build_id_data
= (Build_id_data
*) data
;
11825 build_id_data
->len
= id_len
;
11826 build_id_data
->data
= section
->start
+ namelen
;
11832 add_separate_debug_file (const char * filename
, void * handle
)
11834 separate_info
* i
= xmalloc (sizeof * i
);
11836 i
->filename
= filename
;
11837 i
->handle
= handle
;
11838 i
->next
= first_separate_info
;
11839 first_separate_info
= i
;
11842 #if HAVE_LIBDEBUGINFOD
11843 /* Query debuginfod servers for the target debuglink or debugaltlink
11844 file. If successful, store the path of the file in filename and
11845 return TRUE, otherwise return FALSE. */
11848 debuginfod_fetch_separate_debug_info (struct dwarf_section
* section
,
11852 size_t build_id_len
;
11853 unsigned char * build_id
;
11855 if (strcmp (section
->uncompressed_name
, ".gnu_debuglink") == 0)
11857 /* Get the build-id of file. */
11858 build_id
= get_build_id (file
);
11861 else if (strcmp (section
->uncompressed_name
, ".gnu_debugaltlink") == 0)
11863 /* Get the build-id of the debugaltlink file. */
11864 unsigned int filelen
;
11866 filelen
= strnlen ((const char *)section
->start
, section
->size
);
11867 if (filelen
== section
->size
)
11868 /* Corrupt debugaltlink. */
11871 build_id
= section
->start
+ filelen
+ 1;
11872 build_id_len
= section
->size
- (filelen
+ 1);
11874 if (build_id_len
== 0)
11883 debuginfod_client
* client
;
11885 client
= debuginfod_begin ();
11886 if (client
== NULL
)
11889 /* Query debuginfod servers for the target file. If found its path
11890 will be stored in filename. */
11891 fd
= debuginfod_find_debuginfo (client
, build_id
, build_id_len
, filename
);
11892 debuginfod_end (client
);
11894 /* Only free build_id if we allocated space for a hex string
11895 in get_build_id (). */
11896 if (build_id_len
== 0)
11901 /* File successfully retrieved. Close fd since we want to
11902 use open_debug_file () on filename instead. */
11910 #endif /* HAVE_LIBDEBUGINFOD */
11913 load_separate_debug_info (const char * main_filename
,
11914 struct dwarf_section
* xlink
,
11915 parse_func_type parse_func
,
11916 check_func_type check_func
,
11918 void * file ATTRIBUTE_UNUSED
)
11920 const char * separate_filename
;
11921 char * debug_filename
;
11923 size_t canon_dirlen
;
11925 char * canon_filename
;
11926 char * canon_debug_filename
;
11929 if ((separate_filename
= parse_func (xlink
, func_data
)) == NULL
)
11931 warn (_("Corrupt debuglink section: %s\n"),
11932 xlink
->name
? xlink
->name
: xlink
->uncompressed_name
);
11936 /* Attempt to locate the separate file.
11937 This should duplicate the logic in bfd/opncls.c:find_separate_debug_file(). */
11939 canon_filename
= lrealpath (main_filename
);
11940 canon_dir
= xstrdup (canon_filename
);
11942 for (canon_dirlen
= strlen (canon_dir
); canon_dirlen
> 0; canon_dirlen
--)
11943 if (IS_DIR_SEPARATOR (canon_dir
[canon_dirlen
- 1]))
11945 canon_dir
[canon_dirlen
] = '\0';
11948 #define DEBUGDIR "/lib/debug"
11950 #ifndef EXTRA_DEBUG_ROOT1
11951 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
11953 #ifndef EXTRA_DEBUG_ROOT2
11954 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
11957 debug_filename
= (char *) malloc (strlen (DEBUGDIR
) + 1
11959 + strlen (".debug/")
11960 #ifdef EXTRA_DEBUG_ROOT1
11961 + strlen (EXTRA_DEBUG_ROOT1
)
11963 #ifdef EXTRA_DEBUG_ROOT2
11964 + strlen (EXTRA_DEBUG_ROOT2
)
11966 + strlen (separate_filename
)
11968 if (debug_filename
== NULL
)
11970 warn (_("Out of memory"));
11972 free (canon_filename
);
11976 /* First try in the current directory. */
11977 sprintf (debug_filename
, "%s", separate_filename
);
11978 if (check_func (debug_filename
, func_data
))
11981 /* Then try in a subdirectory called .debug. */
11982 sprintf (debug_filename
, ".debug/%s", separate_filename
);
11983 if (check_func (debug_filename
, func_data
))
11986 /* Then try in the same directory as the original file. */
11987 sprintf (debug_filename
, "%s%s", canon_dir
, separate_filename
);
11988 if (check_func (debug_filename
, func_data
))
11991 /* And the .debug subdirectory of that directory. */
11992 sprintf (debug_filename
, "%s.debug/%s", canon_dir
, separate_filename
);
11993 if (check_func (debug_filename
, func_data
))
11996 #ifdef EXTRA_DEBUG_ROOT1
11997 /* Try the first extra debug file root. */
11998 sprintf (debug_filename
, "%s/%s", EXTRA_DEBUG_ROOT1
, separate_filename
);
11999 if (check_func (debug_filename
, func_data
))
12002 /* Try the first extra debug file root. */
12003 sprintf (debug_filename
, "%s/%s/%s", EXTRA_DEBUG_ROOT1
, canon_dir
, separate_filename
);
12004 if (check_func (debug_filename
, func_data
))
12008 #ifdef EXTRA_DEBUG_ROOT2
12009 /* Try the second extra debug file root. */
12010 sprintf (debug_filename
, "%s/%s", EXTRA_DEBUG_ROOT2
, separate_filename
);
12011 if (check_func (debug_filename
, func_data
))
12015 /* Then try in the global debug_filename directory. */
12016 strcpy (debug_filename
, DEBUGDIR
);
12017 dirlen
= strlen (DEBUGDIR
) - 1;
12018 if (dirlen
> 0 && DEBUGDIR
[dirlen
] != '/')
12019 strcat (debug_filename
, "/");
12020 strcat (debug_filename
, (const char *) separate_filename
);
12022 if (check_func (debug_filename
, func_data
))
12025 #if HAVE_LIBDEBUGINFOD
12027 char * tmp_filename
;
12030 && debuginfod_fetch_separate_debug_info (xlink
,
12034 /* File successfully downloaded from server, replace
12035 debug_filename with the file's path. */
12036 free (debug_filename
);
12037 debug_filename
= tmp_filename
;
12043 if (do_debug_links
)
12045 /* Failed to find the file. */
12046 warn (_("could not find separate debug file '%s'\n"),
12047 separate_filename
);
12048 warn (_("tried: %s\n"), debug_filename
);
12050 #ifdef EXTRA_DEBUG_ROOT2
12051 sprintf (debug_filename
, "%s/%s", EXTRA_DEBUG_ROOT2
,
12052 separate_filename
);
12053 warn (_("tried: %s\n"), debug_filename
);
12056 #ifdef EXTRA_DEBUG_ROOT1
12057 sprintf (debug_filename
, "%s/%s/%s", EXTRA_DEBUG_ROOT1
,
12058 canon_dir
, separate_filename
);
12059 warn (_("tried: %s\n"), debug_filename
);
12061 sprintf (debug_filename
, "%s/%s", EXTRA_DEBUG_ROOT1
,
12062 separate_filename
);
12063 warn (_("tried: %s\n"), debug_filename
);
12066 sprintf (debug_filename
, "%s.debug/%s", canon_dir
,
12067 separate_filename
);
12068 warn (_("tried: %s\n"), debug_filename
);
12070 sprintf (debug_filename
, "%s%s", canon_dir
, separate_filename
);
12071 warn (_("tried: %s\n"), debug_filename
);
12073 sprintf (debug_filename
, ".debug/%s", separate_filename
);
12074 warn (_("tried: %s\n"), debug_filename
);
12076 sprintf (debug_filename
, "%s", separate_filename
);
12077 warn (_("tried: %s\n"), debug_filename
);
12079 #if HAVE_LIBDEBUGINFOD
12080 if (use_debuginfod
)
12082 char *urls
= getenv (DEBUGINFOD_URLS_ENV_VAR
);
12087 warn (_("tried: DEBUGINFOD_URLS=%s\n"), urls
);
12093 free (debug_filename
);
12094 free (canon_filename
);
12100 canon_debug_filename
= lrealpath (debug_filename
);
12101 self
= strcmp (canon_debug_filename
, canon_filename
) == 0;
12102 free (canon_filename
);
12103 free (canon_debug_filename
);
12106 free (debug_filename
);
12110 void * debug_handle
;
12112 /* Now open the file.... */
12113 if ((debug_handle
= open_debug_file (debug_filename
)) == NULL
)
12115 warn (_("failed to open separate debug file: %s\n"), debug_filename
);
12116 free (debug_filename
);
12120 /* FIXME: We do not check to see if there are any other separate debug info
12121 files that would also match. */
12123 if (do_debug_links
)
12124 printf (_("\n%s: Found separate debug info file: %s\n"), main_filename
, debug_filename
);
12125 add_separate_debug_file (debug_filename
, debug_handle
);
12127 /* Do not free debug_filename - it might be referenced inside
12128 the structure returned by open_debug_file(). */
12129 return debug_handle
;
12132 /* Attempt to load a separate dwarf object file. */
12135 load_dwo_file (const char * main_filename
, const char * name
, const char * dir
, const char * id ATTRIBUTE_UNUSED
)
12137 char * separate_filename
;
12138 void * separate_handle
;
12140 if (IS_ABSOLUTE_PATH (name
))
12141 separate_filename
= strdup (name
);
12143 /* FIXME: Skip adding / if dwo_dir ends in /. */
12144 separate_filename
= concat (dir
, "/", name
, NULL
);
12145 if (separate_filename
== NULL
)
12147 warn (_("Out of memory allocating dwo filename\n"));
12151 if ((separate_handle
= open_debug_file (separate_filename
)) == NULL
)
12153 warn (_("Unable to load dwo file: %s\n"), separate_filename
);
12154 free (separate_filename
);
12158 /* FIXME: We should check the dwo_id. */
12160 printf (_("%s: Found separate debug object file: %s\n\n"), main_filename
, separate_filename
);
12162 add_separate_debug_file (separate_filename
, separate_handle
);
12163 /* Note - separate_filename will be freed in free_debug_memory(). */
12164 return separate_handle
;
12168 try_build_id_prefix (const char * prefix
, char * filename
, const unsigned char * data
, unsigned long id_len
)
12170 char * f
= filename
;
12172 f
+= sprintf (f
, "%s.build-id/%02x/", prefix
, (unsigned) *data
++);
12175 f
+= sprintf (f
, "%02x", (unsigned) *data
++);
12176 strcpy (f
, ".debug");
12178 return open_debug_file (filename
);
12181 /* Try to load a debug file based upon the build-id held in the .note.gnu.build-id section. */
12184 load_build_id_debug_file (const char * main_filename ATTRIBUTE_UNUSED
, void * main_file
)
12186 if (! load_debug_section (note_gnu_build_id
, main_file
))
12187 return; /* No .note.gnu.build-id section. */
12189 struct dwarf_section
* section
= & debug_displays
[note_gnu_build_id
].section
;
12190 if (section
== NULL
)
12192 warn (_("Unable to load the .note.gnu.build-id section\n"));
12196 if (section
->start
== NULL
|| section
->size
< 0x18)
12198 warn (_(".note.gnu.build-id section is corrupt/empty\n"));
12202 /* In theory we should extract the contents of the section into
12203 a note structure and then check the fields. For now though
12204 just use hard coded offsets instead:
12206 Field Bytes Contents
12209 Type 8..11 3 (NT_GNU_BUILD_ID)
12213 /* FIXME: Check the name size, name and type fields. */
12215 unsigned long build_id_size
;
12216 build_id_size
= byte_get (section
->start
+ 4, 4);
12217 if (build_id_size
< 8)
12219 warn (_(".note.gnu.build-id data size is too small\n"));
12223 if (build_id_size
> (section
->size
- 16))
12225 warn (_(".note.gnu.build-id data size is too big\n"));
12230 filename
= xmalloc (strlen (".build-id/")
12231 + build_id_size
* 2 + 2
12232 + strlen (".debug")
12233 /* The next string should be the same as the longest
12234 name found in the prefixes[] array below. */
12235 + strlen ("/usrlib64/debug/usr")
12239 static const char * prefixes
[] =
12244 "/usr/lib/debug/usr/",
12245 "/usr/lib64/debug/",
12246 "/usr/lib64/debug/usr"
12248 long unsigned int i
;
12250 for (i
= 0; i
< ARRAY_SIZE (prefixes
); i
++)
12252 handle
= try_build_id_prefix (prefixes
[i
], filename
,
12253 section
->start
+ 16, build_id_size
);
12254 if (handle
!= NULL
)
12257 /* FIXME: TYhe BFD library also tries a global debugfile directory prefix. */
12258 if (handle
== NULL
)
12260 /* Failed to find a debug file associated with the build-id.
12261 This is not an error however, rather it just means that
12262 the debug info has probably not been loaded on the system,
12263 or that another method is being used to link to the debug
12269 add_separate_debug_file (filename
, handle
);
12272 /* Try to load a debug file pointed to by the .debug_sup section. */
12275 load_debug_sup_file (const char * main_filename
, void * file
)
12277 if (! load_debug_section (debug_sup
, file
))
12278 return; /* No .debug_sup section. */
12280 struct dwarf_section
* section
;
12281 section
= & debug_displays
[debug_sup
].section
;
12282 assert (section
!= NULL
);
12284 if (section
->start
== NULL
|| section
->size
< 5)
12286 warn (_(".debug_sup section is corrupt/empty\n"));
12290 if (section
->start
[2] != 0)
12291 return; /* This is a supplementary file. */
12293 const char * filename
= (const char *) section
->start
+ 3;
12294 if (strnlen (filename
, section
->size
- 3) == section
->size
- 3)
12296 warn (_("filename in .debug_sup section is corrupt\n"));
12300 if (filename
[0] != '/' && strchr (main_filename
, '/'))
12305 new_len
= asprintf (& new_name
, "%.*s/%s",
12306 (int) (strrchr (main_filename
, '/') - main_filename
),
12311 warn (_("unable to construct path for supplementary debug file"));
12316 filename
= new_name
;
12320 /* PR 27796: Make sure that we pass a filename that can be free'd to
12321 add_separate_debug_file(). */
12322 filename
= strdup (filename
);
12323 if (filename
== NULL
)
12325 warn (_("out of memory constructing filename for .debug_sup link\n"));
12330 void * handle
= open_debug_file (filename
);
12331 if (handle
== NULL
)
12333 warn (_("unable to open file '%s' referenced from .debug_sup section\n"), filename
);
12334 free ((void *) filename
);
12338 printf (_("%s: Found supplementary debug file: %s\n\n"), main_filename
, filename
);
12340 /* FIXME: Compare the checksums, if present. */
12341 add_separate_debug_file (filename
, handle
);
12344 /* Load a debuglink section and/or a debugaltlink section, if either are present.
12345 Recursively check the loaded files for more of these sections.
12346 Also follow any links in .debug_sup sections.
12347 FIXME: Should also check for DWO_* entries in the newly loaded files. */
12350 check_for_and_load_links (void * file
, const char * filename
)
12352 void * handle
= NULL
;
12354 if (load_debug_section (gnu_debugaltlink
, file
))
12356 Build_id_data build_id_data
;
12358 handle
= load_separate_debug_info (filename
,
12359 & debug_displays
[gnu_debugaltlink
].section
,
12360 parse_gnu_debugaltlink
,
12361 check_gnu_debugaltlink
,
12366 assert (handle
== first_separate_info
->handle
);
12367 check_for_and_load_links (first_separate_info
->handle
,
12368 first_separate_info
->filename
);
12372 if (load_debug_section (gnu_debuglink
, file
))
12374 unsigned long crc32
;
12376 handle
= load_separate_debug_info (filename
,
12377 & debug_displays
[gnu_debuglink
].section
,
12378 parse_gnu_debuglink
,
12379 check_gnu_debuglink
,
12384 assert (handle
== first_separate_info
->handle
);
12385 check_for_and_load_links (first_separate_info
->handle
,
12386 first_separate_info
->filename
);
12390 load_debug_sup_file (filename
, file
);
12392 load_build_id_debug_file (filename
, file
);
12395 /* Load the separate debug info file(s) attached to FILE, if any exist.
12396 Returns TRUE if any were found, FALSE otherwise.
12397 If TRUE is returned then the linked list starting at first_separate_info
12398 will be populated with open file handles. */
12401 load_separate_debug_files (void * file
, const char * filename
)
12403 /* Skip this operation if we are not interested in debug links. */
12404 if (! do_follow_links
&& ! do_debug_links
)
12407 /* See if there are any dwo links. */
12408 if (load_debug_section (str
, file
)
12409 && load_debug_section (abbrev
, file
)
12410 && load_debug_section (info
, file
))
12412 /* Load the .debug_addr section, if it exists. */
12413 load_debug_section (debug_addr
, file
);
12414 /* Load the .debug_str_offsets section, if it exists. */
12415 load_debug_section (str_index
, file
);
12416 /* Load the .debug_loclists section, if it exists. */
12417 load_debug_section (loclists
, file
);
12418 /* Load the .debug_rnglists section, if it exists. */
12419 load_debug_section (rnglists
, file
);
12423 if (process_debug_info (& debug_displays
[info
].section
, file
, abbrev
,
12426 bool introduced
= false;
12428 const char *dir
= NULL
;
12429 const char *id
= NULL
;
12430 const char *name
= NULL
;
12432 for (dwinfo
= first_dwo_info
; dwinfo
!= NULL
; dwinfo
= dwinfo
->next
)
12434 /* Accumulate NAME, DIR and ID fields. */
12435 switch (dwinfo
->type
)
12439 warn (_("Multiple DWO_NAMEs encountered for the same CU\n"));
12440 name
= dwinfo
->value
;
12444 /* There can be multiple DW_AT_comp_dir entries in a CU,
12445 so do not complain. */
12446 dir
= dwinfo
->value
;
12451 warn (_("multiple DWO_IDs encountered for the same CU\n"));
12452 id
= dwinfo
->value
;
12456 error (_("Unexpected DWO INFO type"));
12460 /* If we have reached the end of our list, or we are changing
12461 CUs, then display the information that we have accumulated
12464 && (dwinfo
->next
== NULL
12465 || dwinfo
->next
->cu_offset
!= dwinfo
->cu_offset
))
12467 if (do_debug_links
)
12471 printf (_("The %s section contains link(s) to dwo file(s):\n\n"),
12472 debug_displays
[info
].section
.uncompressed_name
);
12476 printf (_(" Name: %s\n"), name
);
12477 printf (_(" Directory: %s\n"), dir
? dir
: _("<not-found>"));
12479 display_data (printf (_(" ID: ")), (unsigned char *) id
, 8);
12480 else if (debug_information
[0].dwarf_version
!= 5)
12481 printf (_(" ID: <not specified>\n"));
12485 if (do_follow_links
)
12486 load_dwo_file (filename
, name
, dir
, id
);
12488 name
= dir
= id
= NULL
;
12494 if (! do_follow_links
)
12495 /* The other debug links will be displayed by display_debug_links()
12496 so we do not need to do any further processing here. */
12499 /* FIXME: We do not check for the presence of both link sections in the same file. */
12500 /* FIXME: We do not check for the presence of multiple, same-name debuglink sections. */
12501 /* FIXME: We do not check for the presence of a dwo link as well as a debuglink. */
12503 check_for_and_load_links (file
, filename
);
12504 if (first_separate_info
!= NULL
)
12507 do_follow_links
= 0;
12512 free_debug_memory (void)
12516 free_all_abbrevs ();
12520 shndx_pool_size
= 0;
12521 shndx_pool_used
= 0;
12529 memset (level_type_signed
, 0, sizeof level_type_signed
);
12530 cu_tu_indexes_read
= -1;
12532 for (i
= 0; i
< max
; i
++)
12533 free_debug_section ((enum dwarf_section_display_enum
) i
);
12535 if (debug_information
!= NULL
)
12537 for (i
= 0; i
< alloc_num_debug_info_entries
; i
++)
12538 free_debug_information (&debug_information
[i
]);
12539 free (debug_information
);
12540 debug_information
= NULL
;
12541 alloc_num_debug_info_entries
= num_debug_info_entries
= 0;
12545 separate_info
* next
;
12547 for (d
= first_separate_info
; d
!= NULL
; d
= next
)
12549 close_debug_file (d
->handle
);
12550 free ((void *) d
->filename
);
12554 first_separate_info
= NULL
;
12562 const char *option
;
12565 } debug_dump_long_opts
;
12567 static const debug_dump_long_opts debug_option_table
[] =
12569 { 'A', "addr", &do_debug_addr
, 1 },
12570 { 'a', "abbrev", &do_debug_abbrevs
, 1 },
12571 { 'c', "cu_index", &do_debug_cu_index
, 1 },
12572 #ifdef HAVE_LIBDEBUGINFOD
12573 { 'D', "use-debuginfod", &use_debuginfod
, 1 },
12574 { 'E', "do-not-use-debuginfod", &use_debuginfod
, 0 },
12576 { 'F', "frames-interp", &do_debug_frames_interp
, 1 },
12577 { 'f', "frames", &do_debug_frames
, 1 },
12578 { 'g', "gdb_index", &do_gdb_index
, 1 },
12579 { 'i', "info", &do_debug_info
, 1 },
12580 { 'K', "follow-links", &do_follow_links
, 1 },
12581 { 'k', "links", &do_debug_links
, 1 },
12582 { 'L', "decodedline", &do_debug_lines
, FLAG_DEBUG_LINES_DECODED
},
12583 { 'l', "rawline", &do_debug_lines
, FLAG_DEBUG_LINES_RAW
},
12584 /* For compatibility with earlier versions of readelf. */
12585 { 'l', "line", &do_debug_lines
, FLAG_DEBUG_LINES_RAW
},
12586 { 'm', "macro", &do_debug_macinfo
, 1 },
12587 { 'N', "no-follow-links", &do_follow_links
, 0 },
12588 { 'O', "str-offsets", &do_debug_str_offsets
, 1 },
12589 { 'o', "loc", &do_debug_loc
, 1 },
12590 { 'p', "pubnames", &do_debug_pubnames
, 1 },
12591 { 'R', "Ranges", &do_debug_ranges
, 1 },
12592 { 'r', "aranges", &do_debug_aranges
, 1 },
12593 /* For compatibility with earlier versions of readelf. */
12594 { 'r', "ranges", &do_debug_aranges
, 1 },
12595 { 's', "str", &do_debug_str
, 1 },
12596 { 'T', "trace_aranges", &do_trace_aranges
, 1 },
12597 { 't', "pubtypes", &do_debug_pubtypes
, 1 },
12598 { 'U', "trace_info", &do_trace_info
, 1 },
12599 { 'u', "trace_abbrev", &do_trace_abbrevs
, 1 },
12600 { 0, NULL
, NULL
, 0 }
12603 /* Enable display of specific DWARF sections as determined by the comma
12604 separated strings in NAMES. Returns non-zero if any displaying was
12608 dwarf_select_sections_by_names (const char *names
)
12616 const debug_dump_long_opts
*entry
;
12618 for (entry
= debug_option_table
; entry
->option
; entry
++)
12620 size_t len
= strlen (entry
->option
);
12622 if (strncmp (p
, entry
->option
, len
) == 0
12623 && (p
[len
] == ',' || p
[len
] == '\0'))
12625 if (entry
->val
== 0)
12626 * entry
->variable
= 0;
12628 * entry
->variable
= entry
->val
;
12629 result
|= entry
->val
;
12636 if (entry
->option
== NULL
)
12638 warn (_("Unrecognized debug option '%s'\n"), p
);
12639 p
= strchr (p
, ',');
12648 /* The --debug-dump=frames-interp option also enables the
12649 --debug-dump=frames option. */
12650 if (do_debug_frames_interp
)
12651 do_debug_frames
= 1;
12656 /* Enable display of specific DWARF sections as determined by the characters
12657 in LETTERS. Returns non-zero if any displaying was enabled. */
12660 dwarf_select_sections_by_letters (const char *letters
)
12666 const debug_dump_long_opts
*entry
;
12668 for (entry
= debug_option_table
; entry
->letter
; entry
++)
12670 if (entry
->letter
== * letters
)
12672 if (entry
->val
== 0)
12673 * entry
->variable
= 0;
12675 * entry
->variable
|= entry
->val
;
12676 result
|= entry
->val
;
12681 if (entry
->letter
== 0)
12682 warn (_("Unrecognized debug letter option '%c'\n"), * letters
);
12687 /* The --debug-dump=frames-interp option also enables the
12688 --debug-dump=frames option. */
12689 if (do_debug_frames_interp
)
12690 do_debug_frames
= 1;
12696 dwarf_select_sections_all (void)
12699 do_debug_abbrevs
= 1;
12700 do_debug_lines
= FLAG_DEBUG_LINES_RAW
;
12701 do_debug_pubnames
= 1;
12702 do_debug_pubtypes
= 1;
12703 do_debug_aranges
= 1;
12704 do_debug_ranges
= 1;
12705 do_debug_frames
= 1;
12706 do_debug_macinfo
= 1;
12711 do_trace_abbrevs
= 1;
12712 do_trace_aranges
= 1;
12714 do_debug_cu_index
= 1;
12715 do_follow_links
= 1;
12716 do_debug_links
= 1;
12717 do_debug_str_offsets
= 1;
12720 #define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0
12721 #define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0
12723 /* N.B. The order here must match the order in section_display_enum. */
12725 struct dwarf_section_display debug_displays
[] =
12727 { { ".debug_abbrev", ".zdebug_abbrev", ".dwabrev", NO_ABBREVS
}, display_debug_abbrev
, &do_debug_abbrevs
, false },
12728 { { ".debug_aranges", ".zdebug_aranges", ".dwarnge", NO_ABBREVS
}, display_debug_aranges
, &do_debug_aranges
, true },
12729 { { ".debug_frame", ".zdebug_frame", ".dwframe", NO_ABBREVS
}, display_debug_frames
, &do_debug_frames
, true },
12730 { { ".debug_info", ".zdebug_info", ".dwinfo", ABBREV (abbrev
)}, display_debug_info
, &do_debug_info
, true },
12731 { { ".debug_line", ".zdebug_line", ".dwline", NO_ABBREVS
}, display_debug_lines
, &do_debug_lines
, true },
12732 { { ".debug_pubnames", ".zdebug_pubnames", ".dwpbnms", NO_ABBREVS
}, display_debug_pubnames
, &do_debug_pubnames
, false },
12733 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", "", NO_ABBREVS
}, display_debug_gnu_pubnames
, &do_debug_pubnames
, false },
12734 { { ".eh_frame", "", "", NO_ABBREVS
}, display_debug_frames
, &do_debug_frames
, true },
12735 { { ".eh_frame_hdr", "", "", NO_ABBREVS
}, display_eh_frame_hdr
, &do_debug_frames
, true },
12736 { { ".debug_macinfo", ".zdebug_macinfo", "", NO_ABBREVS
}, display_debug_macinfo
, &do_debug_macinfo
, false },
12737 { { ".debug_macro", ".zdebug_macro", ".dwmac", NO_ABBREVS
}, display_debug_macro
, &do_debug_macinfo
, true },
12738 { { ".debug_str", ".zdebug_str", ".dwstr", NO_ABBREVS
}, display_debug_str
, &do_debug_str
, false },
12739 { { ".debug_line_str", ".zdebug_line_str", "", NO_ABBREVS
}, display_debug_str
, &do_debug_str
, false },
12740 { { ".debug_loc", ".zdebug_loc", ".dwloc", NO_ABBREVS
}, display_debug_loc
, &do_debug_loc
, true },
12741 { { ".debug_loclists", ".zdebug_loclists", "", NO_ABBREVS
}, display_debug_loc
, &do_debug_loc
, true },
12742 { { ".debug_loclists.dwo", ".zdebug_loclists.dwo", "", NO_ABBREVS
}, display_debug_loc
, &do_debug_loc
, true },
12743 { { ".debug_pubtypes", ".zdebug_pubtypes", ".dwpbtyp", NO_ABBREVS
}, display_debug_pubnames
, &do_debug_pubtypes
, false },
12744 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", "", NO_ABBREVS
}, display_debug_gnu_pubnames
, &do_debug_pubtypes
, false },
12745 { { ".debug_ranges", ".zdebug_ranges", ".dwrnges", NO_ABBREVS
}, display_debug_ranges
, &do_debug_ranges
, true },
12746 { { ".debug_rnglists", ".zdebug_rnglists", "", NO_ABBREVS
}, display_debug_ranges
, &do_debug_ranges
, true },
12747 { { ".debug_rnglists.dwo", ".zdebug_rnglists.dwo", "", NO_ABBREVS
}, display_debug_ranges
, &do_debug_ranges
, true },
12748 { { ".debug_static_func", ".zdebug_static_func", "", NO_ABBREVS
}, display_debug_not_supported
, NULL
, false },
12749 { { ".debug_static_vars", ".zdebug_static_vars", "", NO_ABBREVS
}, display_debug_not_supported
, NULL
, false },
12750 { { ".debug_types", ".zdebug_types", "", ABBREV (abbrev
) }, display_debug_types
, &do_debug_info
, true },
12751 { { ".debug_weaknames", ".zdebug_weaknames", "", NO_ABBREVS
}, display_debug_not_supported
, NULL
, false },
12752 { { ".gdb_index", "", "", NO_ABBREVS
}, display_gdb_index
, &do_gdb_index
, false },
12753 { { ".debug_names", "", "", NO_ABBREVS
}, display_debug_names
, &do_gdb_index
, false },
12754 { { ".trace_info", "", "", ABBREV (trace_abbrev
) }, display_trace_info
, &do_trace_info
, true },
12755 { { ".trace_abbrev", "", "", NO_ABBREVS
}, display_debug_abbrev
, &do_trace_abbrevs
, false },
12756 { { ".trace_aranges", "", "", NO_ABBREVS
}, display_debug_aranges
, &do_trace_aranges
, false },
12757 { { ".debug_info.dwo", ".zdebug_info.dwo", "", ABBREV (abbrev_dwo
) }, display_debug_info
, &do_debug_info
, true },
12758 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", "", NO_ABBREVS
}, display_debug_abbrev
, &do_debug_abbrevs
, false },
12759 { { ".debug_types.dwo", ".zdebug_types.dwo", "", ABBREV (abbrev_dwo
) }, display_debug_types
, &do_debug_info
, true },
12760 { { ".debug_line.dwo", ".zdebug_line.dwo", "", NO_ABBREVS
}, display_debug_lines
, &do_debug_lines
, true },
12761 { { ".debug_loc.dwo", ".zdebug_loc.dwo", "", NO_ABBREVS
}, display_debug_loc
, &do_debug_loc
, true },
12762 { { ".debug_macro.dwo", ".zdebug_macro.dwo", "", NO_ABBREVS
}, display_debug_macro
, &do_debug_macinfo
, true },
12763 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", "", NO_ABBREVS
}, display_debug_macinfo
, &do_debug_macinfo
, false },
12764 { { ".debug_str.dwo", ".zdebug_str.dwo", "", NO_ABBREVS
}, display_debug_str
, &do_debug_str
, true },
12765 { { ".debug_str_offsets", ".zdebug_str_offsets", "", NO_ABBREVS
}, display_debug_str_offsets
, &do_debug_str_offsets
, true },
12766 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", "", NO_ABBREVS
}, display_debug_str_offsets
, &do_debug_str_offsets
, true },
12767 { { ".debug_addr", ".zdebug_addr", "", NO_ABBREVS
}, display_debug_addr
, &do_debug_addr
, true },
12768 { { ".debug_cu_index", "", "", NO_ABBREVS
}, display_cu_index
, &do_debug_cu_index
, false },
12769 { { ".debug_tu_index", "", "", NO_ABBREVS
}, display_cu_index
, &do_debug_cu_index
, false },
12770 { { ".gnu_debuglink", "", "", NO_ABBREVS
}, display_debug_links
, &do_debug_links
, false },
12771 { { ".gnu_debugaltlink", "", "", NO_ABBREVS
}, display_debug_links
, &do_debug_links
, false },
12772 { { ".debug_sup", "", "", NO_ABBREVS
}, display_debug_sup
, &do_debug_links
, false },
12773 /* Separate debug info files can containt their own .debug_str section,
12774 and this might be in *addition* to a .debug_str section already present
12775 in the main file. Hence we need to have two entries for .debug_str. */
12776 { { ".debug_str", ".zdebug_str", "", NO_ABBREVS
}, display_debug_str
, &do_debug_str
, false },
12777 { { ".note.gnu.build-id", "", "", NO_ABBREVS
}, display_debug_not_supported
, NULL
, false },
12780 /* A static assertion. */
12781 extern int debug_displays_assert
[ARRAY_SIZE (debug_displays
) == max
? 1 : -1];