• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Print information from ELF file in human-readable form.
2    Copyright (C) 1999-2018 Red Hat, Inc.
3    This file is part of elfutils.
4 
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    elfutils is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #ifdef HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21 
22 #include <argp.h>
23 #include <assert.h>
24 #include <ctype.h>
25 #include <dwarf.h>
26 #include <errno.h>
27 #include <fcntl.h>
28 #include <gelf.h>
29 #include <inttypes.h>
30 #include <langinfo.h>
31 #include <libdw.h>
32 #include <libdwfl.h>
33 #include <locale.h>
34 #include <stdarg.h>
35 #include <stdbool.h>
36 #include <stdio.h>
37 #include <stdio_ext.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <strings.h>
41 #include <time.h>
42 #include <unistd.h>
43 #include <sys/stat.h>
44 #include <signal.h>
45 
46 #include <libeu.h>
47 #include <system.h>
48 #include <printversion.h>
49 #include "../libelf/libelfP.h"
50 #include "../libelf/common.h"
51 #include "../libebl/libeblP.h"
52 #include "../libdwelf/libdwelf.h"
53 #include "../libdw/libdwP.h"
54 #include "../libdwfl/libdwflP.h"
55 #include "../libdw/memory-access.h"
56 
57 #include "../libdw/known-dwarf.h"
58 
59 #ifdef __linux__
60 #define CORE_SIGILL  SIGILL
61 #define CORE_SIGBUS  SIGBUS
62 #define CORE_SIGFPE  SIGFPE
63 #define CORE_SIGSEGV SIGSEGV
64 #define CORE_SI_USER SI_USER
65 #else
66 /* We want the linux version of those as that is what shows up in the core files. */
67 #define CORE_SIGILL  4  /* Illegal instruction (ANSI).  */
68 #define CORE_SIGBUS  7  /* BUS error (4.2 BSD).  */
69 #define CORE_SIGFPE  8  /* Floating-point exception (ANSI).  */
70 #define CORE_SIGSEGV 11 /* Segmentation violation (ANSI).  */
71 #define CORE_SI_USER 0  /* Sent by kill, sigsend.  */
72 #endif
73 
74 /* Name and version of program.  */
75 ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
76 
77 /* Bug report address.  */
78 ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
79 
80 /* argp key value for --elf-section, non-ascii.  */
81 #define ELF_INPUT_SECTION 256
82 
83 /* argp key value for --dwarf-skeleton, non-ascii.  */
84 #define DWARF_SKELETON 257
85 
86 /* argp key value for --dyn-syms, non-ascii.  */
87 #define PRINT_DYNSYM_TABLE 258
88 
89 /* Terrible hack for hooking unrelated skeleton/split compile units,
90    see __libdw_link_skel_split in print_debug.  */
91 static bool do_not_close_dwfl = false;
92 
93 /* Definitions of arguments for argp functions.  */
94 static const struct argp_option options[] =
95 {
96   { NULL, 0, NULL, 0, N_("ELF input selection:"), 0 },
97   { "elf-section", ELF_INPUT_SECTION, "SECTION", OPTION_ARG_OPTIONAL,
98     N_("Use the named SECTION (default .gnu_debugdata) as (compressed) ELF "
99        "input data"), 0 },
100   { "dwarf-skeleton", DWARF_SKELETON, "FILE", 0,
101     N_("Used with -w to find the skeleton Compile Units in FILE associated "
102        "with the Split Compile units in a .dwo input file"), 0 },
103   { NULL, 0, NULL, 0, N_("ELF output selection:"), 0 },
104   { "all", 'a', NULL, 0,
105     N_("All these plus -p .strtab -p .dynstr -p .comment"), 0 },
106   { "dynamic", 'd', NULL, 0, N_("Display the dynamic segment"), 0 },
107   { "file-header", 'h', NULL, 0, N_("Display the ELF file header"), 0 },
108   { "histogram", 'I', NULL, 0,
109     N_("Display histogram of bucket list lengths"), 0 },
110   { "program-headers", 'l', NULL, 0, N_("Display the program headers"), 0 },
111   { "segments", 'l', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
112   { "relocs", 'r', NULL, 0, N_("Display relocations"), 0 },
113   { "section-groups", 'g', NULL, 0, N_("Display the section groups"), 0 },
114   { "section-headers", 'S', NULL, 0, N_("Display the sections' headers"), 0 },
115   { "sections", 'S', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
116   { "symbols", 's', "SECTION", OPTION_ARG_OPTIONAL,
117     N_("Display the symbol table sections"), 0 },
118   { "syms", 's', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
119   { "dyn-syms", PRINT_DYNSYM_TABLE, NULL, 0,
120     N_("Display (only) the dynamic symbol table"), 0 },
121   { "version-info", 'V', NULL, 0, N_("Display versioning information"), 0 },
122   { "notes", 'n', "SECTION", OPTION_ARG_OPTIONAL, N_("Display the ELF notes"), 0 },
123   { "arch-specific", 'A', NULL, 0,
124     N_("Display architecture specific information, if any"), 0 },
125   { "exception", 'e', NULL, 0,
126     N_("Display sections for exception handling"), 0 },
127 
128   { NULL, 0, NULL, 0, N_("Additional output selection:"), 0 },
129   { "debug-dump", 'w', "SECTION", OPTION_ARG_OPTIONAL,
130     N_("Display DWARF section content.  SECTION can be one of abbrev, addr, "
131        "aranges, decodedaranges, frame, gdb_index, info, info+, loc, line, "
132        "decodedline, ranges, pubnames, str, macinfo, macro or exception"), 0 },
133   { "hex-dump", 'x', "SECTION", 0,
134     N_("Dump the uninterpreted contents of SECTION, by number or name"), 0 },
135   { "strings", 'p', "SECTION", OPTION_ARG_OPTIONAL,
136     N_("Print string contents of sections"), 0 },
137   { "string-dump", 'p', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
138   { "archive-index", 'c', NULL, 0,
139     N_("Display the symbol index of an archive"), 0 },
140   { "use-dynamic", 'D', NULL, 0,
141     N_("Use the dynamic segment when possible for displaying info"), 0 },
142 
143   { NULL, 0, NULL, 0, N_("Output control:"), 0 },
144   { "numeric-addresses", 'N', NULL, 0,
145     N_("Do not find symbol names for addresses in DWARF data"), 0 },
146   { "unresolved-address-offsets", 'U', NULL, 0,
147     N_("Display just offsets instead of resolving values to addresses in DWARF data"), 0 },
148   { "wide", 'W', NULL, 0,
149     N_("Ignored for compatibility (lines always wide)"), 0 },
150   { "decompress", 'z', NULL, 0,
151     N_("Show compression information for compressed sections (when used with -S); decompress section before dumping data (when used with -p or -x)"), 0 },
152   { NULL, 0, NULL, 0, NULL, 0 }
153 };
154 
155 /* Short description of program.  */
156 static const char doc[] = N_("\
157 Print information from ELF file in human-readable form.");
158 
159 /* Strings for arguments in help texts.  */
160 static const char args_doc[] = N_("FILE...");
161 
162 /* Prototype for option handler.  */
163 static error_t parse_opt (int key, char *arg, struct argp_state *state);
164 
165 /* Data structure to communicate with argp functions.  */
166 static struct argp argp =
167 {
168   options, parse_opt, args_doc, doc, NULL, NULL, NULL
169 };
170 
171 /* If non-null, the section from which we should read to (compressed) ELF.  */
172 static const char *elf_input_section = NULL;
173 
174 /* If non-null, the file that contains the skeleton CUs.  */
175 static const char *dwarf_skeleton = NULL;
176 
177 /* Flags set by the option controlling the output.  */
178 
179 /* True if dynamic segment should be printed.  */
180 static bool print_dynamic_table;
181 
182 /* True if the file header should be printed.  */
183 static bool print_file_header;
184 
185 /* True if the program headers should be printed.  */
186 static bool print_program_header;
187 
188 /* True if relocations should be printed.  */
189 static bool print_relocations;
190 
191 /* True if the section headers should be printed.  */
192 static bool print_section_header;
193 
194 /* True if the symbol table should be printed.  */
195 static bool print_symbol_table;
196 
197 /* True if (only) the dynsym table should be printed.  */
198 static bool print_dynsym_table;
199 
200 /* True if reconstruct dynamic symbol table from the PT_DYNAMIC segment.  */
201 static bool use_dynamic_segment;
202 
203 /* A specific section name, or NULL to print all symbol tables.  */
204 static char *symbol_table_section;
205 
206 /* A specific section name, or NULL to print all ELF notes.  */
207 static char *notes_section;
208 
209 /* True if the version information should be printed.  */
210 static bool print_version_info;
211 
212 /* True if section groups should be printed.  */
213 static bool print_section_groups;
214 
215 /* True if bucket list length histogram should be printed.  */
216 static bool print_histogram;
217 
218 /* True if the architecture specific data should be printed.  */
219 static bool print_arch;
220 
221 /* True if note section content should be printed.  */
222 static bool print_notes;
223 
224 /* True if SHF_STRINGS section content should be printed.  */
225 static bool print_string_sections;
226 
227 /* True if archive index should be printed.  */
228 static bool print_archive_index;
229 
230 /* True if any of the control options except print_archive_index is set.  */
231 static bool any_control_option;
232 
233 /* True if we should print addresses from DWARF in symbolic form.  */
234 static bool print_address_names = true;
235 
236 /* True if we should print raw values instead of relativized addresses.  */
237 static bool print_unresolved_addresses = false;
238 
239 /* True if we should print the .debug_aranges section using libdw.  */
240 static bool decodedaranges = false;
241 
242 /* True if we should print the .debug_aranges section using libdw.  */
243 static bool decodedline = false;
244 
245 /* True if we want to show more information about compressed sections.  */
246 static bool print_decompress = false;
247 
248 /* True if we want to show split compile units for debug_info skeletons.  */
249 static bool show_split_units = false;
250 
251 /* Select printing of debugging sections.  */
252 static enum section_e
253 {
254   section_abbrev = 1,		/* .debug_abbrev  */
255   section_aranges = 2,		/* .debug_aranges  */
256   section_frame = 4,		/* .debug_frame or .eh_frame & al.  */
257   section_info = 8,		/* .debug_info, (implies .debug_types)  */
258   section_line = 16,		/* .debug_line  */
259   section_loc = 32,		/* .debug_loc  */
260   section_pubnames = 64,	/* .debug_pubnames  */
261   section_str = 128,		/* .debug_str  */
262   section_macinfo = 256,	/* .debug_macinfo  */
263   section_ranges = 512, 	/* .debug_ranges  */
264   section_exception = 1024,	/* .eh_frame & al.  */
265   section_gdb_index = 2048,	/* .gdb_index  */
266   section_macro = 4096,		/* .debug_macro  */
267   section_addr = 8192,		/* .debug_addr  */
268   section_types = 16384,	/* .debug_types (implied by .debug_info)  */
269   section_all = (section_abbrev | section_aranges | section_frame
270 		 | section_info | section_line | section_loc
271 		 | section_pubnames | section_str | section_macinfo
272 		 | section_ranges | section_exception | section_gdb_index
273 		 | section_macro | section_addr | section_types)
274 } print_debug_sections, implicit_debug_sections;
275 
276 /* Select hex dumping of sections.  */
277 static struct section_argument *dump_data_sections;
278 static struct section_argument **dump_data_sections_tail = &dump_data_sections;
279 
280 /* Select string dumping of sections.  */
281 static struct section_argument *string_sections;
282 static struct section_argument **string_sections_tail = &string_sections;
283 
284 struct section_argument
285 {
286   struct section_argument *next;
287   const char *arg;
288   bool implicit;
289 };
290 
291 /* Numbers of sections and program headers in the file.  */
292 static size_t shnum;
293 static size_t phnum;
294 
295 
296 /* Declarations of local functions.  */
297 static void process_file (int fd, const char *fname, bool only_one);
298 static void process_elf_file (Dwfl_Module *dwflmod, int fd);
299 static void print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr);
300 static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr);
301 static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr);
302 static void print_scngrp (Ebl *ebl);
303 static void print_dynamic (Ebl *ebl);
304 static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr);
305 static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
306 			       GElf_Shdr *shdr);
307 static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
308 				GElf_Shdr *shdr);
309 static void print_symtab (Ebl *ebl, int type);
310 static void handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
311 static void print_verinfo (Ebl *ebl);
312 static void handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
313 static void handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
314 static void handle_versym (Ebl *ebl, Elf_Scn *scn,
315 			   GElf_Shdr *shdr);
316 static void print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr);
317 static void handle_hash (Ebl *ebl);
318 static void handle_notes (Ebl *ebl, GElf_Ehdr *ehdr);
319 static void print_liblist (Ebl *ebl);
320 static void print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr);
321 static void dump_data (Ebl *ebl);
322 static void dump_strings (Ebl *ebl);
323 static void print_strings (Ebl *ebl);
324 static void dump_archive_index (Elf *, const char *);
325 
326 enum dyn_idx
327 {
328   i_strsz,
329   i_verneed,
330   i_verdef,
331   i_versym,
332   i_symtab,
333   i_strtab,
334   i_hash,
335   i_gnu_hash,
336   i_max
337 };
338 
339 /* Declarations of local functions for use-dynamic.  */
340 static Elf_Data *get_dynscn_strtab (Elf *elf, GElf_Phdr *phdr);
341 static void get_dynscn_addrs (Elf *elf, GElf_Phdr *phdr, GElf_Addr addrs[i_max]);
342 static void find_offsets (Elf *elf, GElf_Addr main_bias, size_t n,
343 			  GElf_Addr addrs[n], GElf_Off offs[n]);
344 
345 /* Looked up once with gettext in main.  */
346 static char *yes_str;
347 static char *no_str;
348 
349 static void
cleanup_list(struct section_argument * list)350 cleanup_list (struct section_argument *list)
351 {
352   while (list != NULL)
353     {
354       struct section_argument *a = list;
355       list = a->next;
356       free (a);
357     }
358 }
359 
360 int
main(int argc,char * argv[])361 main (int argc, char *argv[])
362 {
363   /* We use no threads here which can interfere with handling a stream.  */
364   (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);
365 
366   /* Set locale.  */
367   setlocale (LC_ALL, "");
368 
369   /* Initialize the message catalog.  */
370   textdomain (PACKAGE_TARNAME);
371 
372   /* Look up once.  */
373   yes_str = _("yes");
374   no_str = _("no");
375 
376   /* Parse and process arguments.  */
377   int remaining;
378   argp_parse (&argp, argc, argv, 0, &remaining, NULL);
379 
380   /* Before we start tell the ELF library which version we are using.  */
381   elf_version (EV_CURRENT);
382 
383   /* Now process all the files given at the command line.  */
384   bool only_one = remaining + 1 == argc;
385   do
386     {
387       /* Open the file.  */
388       int fd = open (argv[remaining], O_RDONLY);
389       if (fd == -1)
390 	{
391 	  error (0, errno, _("cannot open input file '%s'"), argv[remaining]);
392 	  continue;
393 	}
394 
395       process_file (fd, argv[remaining], only_one);
396 
397       close (fd);
398     }
399   while (++remaining < argc);
400 
401   cleanup_list (dump_data_sections);
402   cleanup_list (string_sections);
403 
404   return error_message_count != 0;
405 }
406 
407 static void
add_dump_section(const char * name,int key,bool implicit)408 add_dump_section (const char *name,
409 		  int key,
410 		  bool implicit)
411 {
412   struct section_argument *a = xmalloc (sizeof *a);
413   a->arg = name;
414   a->next = NULL;
415   a->implicit = implicit;
416   struct section_argument ***tailp
417     = key == 'x' ? &dump_data_sections_tail : &string_sections_tail;
418   **tailp = a;
419   *tailp = &a->next;
420 }
421 
422 /* Handle program arguments.  */
423 static error_t
parse_opt(int key,char * arg,struct argp_state * state)424 parse_opt (int key, char *arg,
425 	   struct argp_state *state __attribute__ ((unused)))
426 {
427   switch (key)
428     {
429     case 'a':
430       print_file_header = true;
431       print_program_header = true;
432       print_relocations = true;
433       print_section_header = true;
434       print_symbol_table = true;
435       print_version_info = true;
436       print_dynamic_table = true;
437       print_section_groups = true;
438       print_histogram = true;
439       print_arch = true;
440       print_notes = true;
441       implicit_debug_sections |= section_exception;
442       add_dump_section (".strtab", key, true);
443       add_dump_section (".dynstr", key, true);
444       add_dump_section (".comment", key, true);
445       any_control_option = true;
446       break;
447     case 'A':
448       print_arch = true;
449       any_control_option = true;
450       break;
451     case 'd':
452       print_dynamic_table = true;
453       any_control_option = true;
454       break;
455     case 'D':
456       use_dynamic_segment = true;
457       break;
458     case 'e':
459       print_debug_sections |= section_exception;
460       any_control_option = true;
461       break;
462     case 'g':
463       print_section_groups = true;
464       any_control_option = true;
465       break;
466     case 'h':
467       print_file_header = true;
468       any_control_option = true;
469       break;
470     case 'I':
471       print_histogram = true;
472       any_control_option = true;
473       break;
474     case 'l':
475       print_program_header = true;
476       any_control_option = true;
477       break;
478     case 'n':
479       print_notes = true;
480       any_control_option = true;
481       notes_section = arg;
482       break;
483     case 'r':
484       print_relocations = true;
485       any_control_option = true;
486      break;
487     case 'S':
488       print_section_header = true;
489       any_control_option = true;
490       break;
491     case 's':
492       print_symbol_table = true;
493       any_control_option = true;
494       symbol_table_section = arg;
495       break;
496     case PRINT_DYNSYM_TABLE:
497       print_dynsym_table = true;
498       any_control_option = true;
499       break;
500     case 'V':
501       print_version_info = true;
502       any_control_option = true;
503       break;
504     case 'c':
505       print_archive_index = true;
506       break;
507     case 'w':
508       if (arg == NULL)
509 	{
510 	  print_debug_sections = section_all;
511 	  implicit_debug_sections = section_info;
512 	  show_split_units = true;
513 	}
514       else if (strcmp (arg, "abbrev") == 0)
515 	print_debug_sections |= section_abbrev;
516       else if (strcmp (arg, "addr") == 0)
517 	{
518 	  print_debug_sections |= section_addr;
519 	  implicit_debug_sections |= section_info;
520 	}
521       else if (strcmp (arg, "aranges") == 0)
522 	print_debug_sections |= section_aranges;
523       else if (strcmp (arg, "decodedaranges") == 0)
524 	{
525 	  print_debug_sections |= section_aranges;
526 	  decodedaranges = true;
527 	}
528       else if (strcmp (arg, "ranges") == 0)
529 	{
530 	  print_debug_sections |= section_ranges;
531 	  implicit_debug_sections |= section_info;
532 	}
533       else if (strcmp (arg, "frame") == 0 || strcmp (arg, "frames") == 0)
534 	print_debug_sections |= section_frame;
535       else if (strcmp (arg, "info") == 0)
536 	{
537 	  print_debug_sections |= section_info;
538 	  print_debug_sections |= section_types;
539 	}
540       else if (strcmp (arg, "info+") == 0)
541 	{
542 	  print_debug_sections |= section_info;
543 	  print_debug_sections |= section_types;
544 	  show_split_units = true;
545 	}
546       else if (strcmp (arg, "loc") == 0)
547 	{
548 	  print_debug_sections |= section_loc;
549 	  implicit_debug_sections |= section_info;
550 	}
551       else if (strcmp (arg, "line") == 0)
552 	print_debug_sections |= section_line;
553       else if (strcmp (arg, "decodedline") == 0)
554 	{
555 	  print_debug_sections |= section_line;
556 	  decodedline = true;
557 	}
558       else if (strcmp (arg, "pubnames") == 0)
559 	print_debug_sections |= section_pubnames;
560       else if (strcmp (arg, "str") == 0)
561 	{
562 	  print_debug_sections |= section_str;
563 	  /* For mapping string offset tables to CUs.  */
564 	  implicit_debug_sections |= section_info;
565 	}
566       else if (strcmp (arg, "macinfo") == 0)
567 	print_debug_sections |= section_macinfo;
568       else if (strcmp (arg, "macro") == 0)
569 	print_debug_sections |= section_macro;
570       else if (strcmp (arg, "exception") == 0)
571 	print_debug_sections |= section_exception;
572       else if (strcmp (arg, "gdb_index") == 0)
573 	print_debug_sections |= section_gdb_index;
574       else
575 	{
576 	  fprintf (stderr, _("Unknown DWARF debug section `%s'.\n"),
577 		   arg);
578 	  argp_help (&argp, stderr, ARGP_HELP_SEE,
579 		     program_invocation_short_name);
580 	  exit (1);
581 	}
582       any_control_option = true;
583       break;
584     case 'p':
585       any_control_option = true;
586       if (arg == NULL)
587 	{
588 	  print_string_sections = true;
589 	  break;
590 	}
591       FALLTHROUGH;
592     case 'x':
593       add_dump_section (arg, key, false);
594       any_control_option = true;
595       break;
596     case 'N':
597       print_address_names = false;
598       break;
599     case 'U':
600       print_unresolved_addresses = true;
601       break;
602     case ARGP_KEY_NO_ARGS:
603       fputs (_("Missing file name.\n"), stderr);
604       goto do_argp_help;
605     case ARGP_KEY_FINI:
606       if (! any_control_option && ! print_archive_index)
607 	{
608 	  fputs (_("No operation specified.\n"), stderr);
609 	do_argp_help:
610 	  argp_help (&argp, stderr, ARGP_HELP_SEE,
611 		     program_invocation_short_name);
612 	  exit (EXIT_FAILURE);
613 	}
614       break;
615     case 'W':			/* Ignored.  */
616       break;
617     case 'z':
618       print_decompress = true;
619       break;
620     case ELF_INPUT_SECTION:
621       if (arg == NULL)
622 	elf_input_section = ".gnu_debugdata";
623       else
624 	elf_input_section = arg;
625       break;
626     case DWARF_SKELETON:
627       dwarf_skeleton = arg;
628       break;
629     default:
630       return ARGP_ERR_UNKNOWN;
631     }
632   return 0;
633 }
634 
635 
636 /* Create a file descriptor to read the data from the
637    elf_input_section given a file descriptor to an ELF file.  */
638 static int
open_input_section(int fd)639 open_input_section (int fd)
640 {
641   size_t shnums;
642   size_t cnt;
643   size_t shstrndx;
644   Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
645   if (elf == NULL)
646     {
647       error (0, 0, _("cannot generate Elf descriptor: %s"),
648 	     elf_errmsg (-1));
649       return -1;
650     }
651 
652   if (elf_getshdrnum (elf, &shnums) < 0)
653     {
654       error (0, 0, _("cannot determine number of sections: %s"),
655 	     elf_errmsg (-1));
656     open_error:
657       elf_end (elf);
658       return -1;
659     }
660 
661   if (elf_getshdrstrndx (elf, &shstrndx) < 0)
662     {
663       error (0, 0, _("cannot get section header string table index"));
664       goto open_error;
665     }
666 
667   for (cnt = 0; cnt < shnums; ++cnt)
668     {
669       Elf_Scn *scn = elf_getscn (elf, cnt);
670       if (scn == NULL)
671 	{
672 	  error (0, 0, _("cannot get section: %s"),
673 		 elf_errmsg (-1));
674 	  goto open_error;
675 	}
676 
677       GElf_Shdr shdr_mem;
678       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
679       if (unlikely (shdr == NULL))
680 	{
681 	  error (0, 0, _("cannot get section header: %s"),
682 		 elf_errmsg (-1));
683 	  goto open_error;
684 	}
685 
686       const char *sname = elf_strptr (elf, shstrndx, shdr->sh_name);
687       if (sname == NULL)
688 	{
689 	  error (0, 0, _("cannot get section name"));
690 	  goto open_error;
691 	}
692 
693       if (strcmp (sname, elf_input_section) == 0)
694 	{
695 	  Elf_Data *data = elf_rawdata (scn, NULL);
696 	  if (data == NULL)
697 	    {
698 	      error (0, 0, _("cannot get %s content: %s"),
699 		     sname, elf_errmsg (-1));
700 	      goto open_error;
701 	    }
702 
703 	  /* Create (and immediately unlink) a temporary file to store
704 	     section data in to create a file descriptor for it.  */
705 	  const char *tmpdir = getenv ("TMPDIR") ?: P_tmpdir;
706 	  static const char suffix[] = "/readelfXXXXXX";
707 	  int tmplen = strlen (tmpdir) + sizeof (suffix);
708 	  char *tempname = alloca (tmplen);
709 	  sprintf (tempname, "%s%s", tmpdir, suffix);
710 
711 	  int sfd = mkstemp (tempname);
712 	  if (sfd == -1)
713 	    {
714 	      error (0, 0, _("cannot create temp file '%s'"),
715 		     tempname);
716 	      goto open_error;
717 	    }
718 	  unlink (tempname);
719 
720 	  ssize_t size = data->d_size;
721 	  if (write_retry (sfd, data->d_buf, size) != size)
722 	    {
723 	      error (0, 0, _("cannot write section data"));
724 	      goto open_error;
725 	    }
726 
727 	  if (elf_end (elf) != 0)
728 	    {
729 	      error (0, 0, _("error while closing Elf descriptor: %s"),
730 		     elf_errmsg (-1));
731 	      return -1;
732 	    }
733 
734 	  if (lseek (sfd, 0, SEEK_SET) == -1)
735 	    {
736 	      error (0, 0, _("error while rewinding file descriptor"));
737 	      return -1;
738 	    }
739 
740 	  return sfd;
741 	}
742     }
743 
744   /* Named section not found.  */
745   if (elf_end (elf) != 0)
746     error (0, 0, _("error while closing Elf descriptor: %s"),
747 	   elf_errmsg (-1));
748   return -1;
749 }
750 
751 /* Check if the file is an archive, and if so dump its index.  */
752 static void
check_archive_index(int fd,const char * fname,bool only_one)753 check_archive_index (int fd, const char *fname, bool only_one)
754 {
755   /* Create an `Elf' descriptor.  */
756   Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
757   if (elf == NULL)
758     error (0, 0, _("cannot generate Elf descriptor: %s"),
759 	   elf_errmsg (-1));
760   else
761     {
762       if (elf_kind (elf) == ELF_K_AR)
763 	{
764 	  if (!only_one)
765 	    printf ("\n%s:\n\n", fname);
766 	  dump_archive_index (elf, fname);
767 	}
768       else
769 	error (0, 0,
770 	       _("'%s' is not an archive, cannot print archive index"),
771 	       fname);
772 
773       /* Now we can close the descriptor.  */
774       if (elf_end (elf) != 0)
775 	error (0, 0, _("error while closing Elf descriptor: %s"),
776 	       elf_errmsg (-1));
777     }
778 }
779 
780 /* Trivial callback used for checking if we opened an archive.  */
781 static int
count_dwflmod(Dwfl_Module * dwflmod,void ** userdata,const char * name,Dwarf_Addr base,void * arg)782 count_dwflmod (Dwfl_Module *dwflmod __attribute__ ((unused)),
783 	       void **userdata __attribute__ ((unused)),
784 	       const char *name __attribute__ ((unused)),
785 	       Dwarf_Addr base __attribute__ ((unused)),
786 	       void *arg)
787 {
788   if (*(bool *) arg)
789     return DWARF_CB_ABORT;
790   *(bool *) arg = true;
791   return DWARF_CB_OK;
792 }
793 
794 struct process_dwflmod_args
795 {
796   int fd;
797   bool only_one;
798 };
799 
800 static int
process_dwflmod(Dwfl_Module * dwflmod,void ** userdata,const char * name,Dwarf_Addr base,void * arg)801 process_dwflmod (Dwfl_Module *dwflmod,
802 		 void **userdata __attribute__ ((unused)),
803 		 const char *name __attribute__ ((unused)),
804 		 Dwarf_Addr base __attribute__ ((unused)),
805 		 void *arg)
806 {
807   const struct process_dwflmod_args *a = arg;
808 
809   /* Print the file name.  */
810   if (!a->only_one)
811     {
812       const char *fname;
813       dwfl_module_info (dwflmod, NULL, NULL, NULL, NULL, NULL, &fname, NULL);
814 
815       printf ("\n%s:\n\n", fname);
816     }
817 
818   process_elf_file (dwflmod, a->fd);
819 
820   return DWARF_CB_OK;
821 }
822 
823 /* Stub libdwfl callback, only the ELF handle already open is ever used.
824    Only used for finding the alternate debug file if the Dwarf comes from
825    the main file.  We are not interested in separate debuginfo.  */
826 static int
find_no_debuginfo(Dwfl_Module * mod,void ** userdata,const char * modname,Dwarf_Addr base,const char * file_name,const char * debuglink_file,GElf_Word debuglink_crc,char ** debuginfo_file_name)827 find_no_debuginfo (Dwfl_Module *mod,
828 		   void **userdata,
829 		   const char *modname,
830 		   Dwarf_Addr base,
831 		   const char *file_name,
832 		   const char *debuglink_file,
833 		   GElf_Word debuglink_crc,
834 		   char **debuginfo_file_name)
835 {
836   Dwarf_Addr dwbias;
837   dwfl_module_info (mod, NULL, NULL, NULL, &dwbias, NULL, NULL, NULL);
838 
839   /* We are only interested if the Dwarf has been setup on the main
840      elf file but is only missing the alternate debug link.  If dwbias
841      hasn't even been setup, this is searching for separate debuginfo
842      for the main elf.  We don't care in that case.  */
843   if (dwbias == (Dwarf_Addr) -1)
844     return -1;
845 
846   return dwfl_standard_find_debuginfo (mod, userdata, modname, base,
847 				       file_name, debuglink_file,
848 				       debuglink_crc, debuginfo_file_name);
849 }
850 
851 static Dwfl *
create_dwfl(int fd,const char * fname)852 create_dwfl (int fd, const char *fname)
853 {
854   /* Duplicate an fd for dwfl_report_offline to swallow.  */
855   int dwfl_fd = dup (fd);
856   if (unlikely (dwfl_fd < 0))
857     error_exit (errno, "dup");
858 
859   /* Use libdwfl in a trivial way to open the libdw handle for us.
860      This takes care of applying relocations to DWARF data in ET_REL files.  */
861   static const Dwfl_Callbacks callbacks =
862     {
863       .section_address = dwfl_offline_section_address,
864       .find_debuginfo = find_no_debuginfo
865     };
866   Dwfl *dwfl = dwfl_begin (&callbacks);
867   if (likely (dwfl != NULL))
868     /* Let 0 be the logical address of the file (or first in archive).  */
869     dwfl->offline_next_address = 0;
870   if (dwfl_report_offline (dwfl, fname, fname, dwfl_fd) == NULL)
871     {
872       struct stat st;
873       if (fstat (dwfl_fd, &st) != 0)
874 	error (0, errno, _("cannot stat input file"));
875       else if (unlikely (st.st_size == 0))
876 	error (0, 0, _("input file is empty"));
877       else
878 	error (0, 0, _("failed reading '%s': %s"),
879 	       fname, dwfl_errmsg (-1));
880       close (dwfl_fd);		/* Consumed on success, not on failure.  */
881       dwfl = NULL;
882     }
883   else
884     dwfl_report_end (dwfl, NULL, NULL);
885 
886   return dwfl;
887 }
888 
889 /* Process one input file.  */
890 static void
process_file(int fd,const char * fname,bool only_one)891 process_file (int fd, const char *fname, bool only_one)
892 {
893   if (print_archive_index)
894     check_archive_index (fd, fname, only_one);
895 
896   if (!any_control_option)
897     return;
898 
899   if (elf_input_section != NULL)
900     {
901       /* Replace fname and fd with section content. */
902       char *fnname = alloca (strlen (fname) + strlen (elf_input_section) + 2);
903       sprintf (fnname, "%s:%s", fname, elf_input_section);
904       fd = open_input_section (fd);
905       if (fd == -1)
906         {
907           error (0, 0, _("No such section '%s' in '%s'"),
908 		 elf_input_section, fname);
909           return;
910         }
911       fname = fnname;
912     }
913 
914   Dwfl *dwfl = create_dwfl (fd, fname);
915   if (dwfl != NULL)
916     {
917       if (only_one)
918 	{
919 	  /* Clear ONLY_ONE if we have multiple modules, from an archive.  */
920 	  bool seen = false;
921 	  only_one = dwfl_getmodules (dwfl, &count_dwflmod, &seen, 0) == 0;
922 	}
923 
924       /* Process the one or more modules gleaned from this file.  */
925       struct process_dwflmod_args a = { .fd = fd, .only_one = only_one };
926       dwfl_getmodules (dwfl, &process_dwflmod, &a, 0);
927     }
928   /* Terrible hack for hooking unrelated skeleton/split compile units,
929      see __libdw_link_skel_split in print_debug.  */
930   if (! do_not_close_dwfl)
931     dwfl_end (dwfl);
932 
933   /* Need to close the replaced fd if we created it.  Caller takes
934      care of original.  */
935   if (elf_input_section != NULL)
936     close (fd);
937 }
938 
939 /* Check whether there are any compressed sections in the ELF file.  */
940 static bool
elf_contains_chdrs(Elf * elf)941 elf_contains_chdrs (Elf *elf)
942 {
943   Elf_Scn *scn = NULL;
944   while ((scn = elf_nextscn (elf, scn)) != NULL)
945     {
946       GElf_Shdr shdr_mem;
947       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
948       if (shdr != NULL && (shdr->sh_flags & SHF_COMPRESSED) != 0)
949 	return true;
950     }
951   return false;
952 }
953 
954 /* Process one ELF file.  */
955 static void
process_elf_file(Dwfl_Module * dwflmod,int fd)956 process_elf_file (Dwfl_Module *dwflmod, int fd)
957 {
958   GElf_Addr dwflbias;
959   Elf *elf = dwfl_module_getelf (dwflmod, &dwflbias);
960 
961   GElf_Ehdr ehdr_mem;
962   GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
963 
964   if (ehdr == NULL)
965     {
966       error (0, 0, _("cannot read ELF header: %s"), elf_errmsg (-1));
967       return;
968     }
969 
970   Ebl *ebl = ebl_openbackend (elf);
971   if (unlikely (ebl == NULL))
972     {
973     ebl_error:
974       error (0, errno, _("cannot create EBL handle"));
975       return;
976     }
977 
978   /* Determine the number of sections.  */
979   if (unlikely (elf_getshdrnum (ebl->elf, &shnum) < 0))
980     error_exit (0, _("cannot determine number of sections: %s"),
981 		elf_errmsg (-1));
982 
983   /* Determine the number of phdrs.  */
984   if (unlikely (elf_getphdrnum (ebl->elf, &phnum) < 0))
985     error_exit (0, _("cannot determine number of program headers: %s"),
986 		elf_errmsg (-1));
987 
988   /* For an ET_REL file, libdwfl has adjusted the in-core shdrs and
989      may have applied relocation to some sections.  If there are any
990      compressed sections, any pass (or libdw/libdwfl) might have
991      uncompressed them.  So we need to get a fresh Elf handle on the
992      file to display those.  */
993   bool print_unchanged = ((print_section_header
994 			   || print_relocations
995 			   || dump_data_sections != NULL
996 			   || print_notes)
997 			  && (ehdr->e_type == ET_REL
998 			      || elf_contains_chdrs (ebl->elf)));
999 
1000   Elf *pure_elf = NULL;
1001   Ebl *pure_ebl = ebl;
1002   if (print_unchanged)
1003     {
1004       /* Read the file afresh.  */
1005       off_t aroff = elf_getaroff (elf);
1006       pure_elf = dwelf_elf_begin (fd);
1007       if (aroff > 0)
1008 	{
1009 	  /* Archive member.  */
1010 	  (void) elf_rand (pure_elf, aroff);
1011 	  Elf *armem = elf_begin (-1, ELF_C_READ_MMAP, pure_elf);
1012 	  elf_end (pure_elf);
1013 	  pure_elf = armem;
1014 	}
1015       if (pure_elf == NULL)
1016 	{
1017 	  error (0, 0, _("cannot read ELF: %s"), elf_errmsg (-1));
1018 	  return;
1019 	}
1020       pure_ebl = ebl_openbackend (pure_elf);
1021       if (pure_ebl == NULL)
1022 	goto ebl_error;
1023     }
1024 
1025   if (print_file_header)
1026     print_ehdr (ebl, ehdr);
1027   if (print_section_header)
1028     print_shdr (pure_ebl, ehdr);
1029   if (print_program_header)
1030     print_phdr (ebl, ehdr);
1031   if (print_section_groups)
1032     print_scngrp (ebl);
1033   if (print_dynamic_table)
1034     print_dynamic (ebl);
1035   if (print_relocations)
1036     print_relocs (pure_ebl, ehdr);
1037   if (print_histogram)
1038     handle_hash (ebl);
1039   if (print_symbol_table || print_dynsym_table)
1040     print_symtab (ebl, SHT_DYNSYM);
1041   if (print_version_info)
1042     print_verinfo (ebl);
1043   if (print_symbol_table)
1044     print_symtab (ebl, SHT_SYMTAB);
1045   if (print_arch)
1046     print_liblist (ebl);
1047   if (print_arch)
1048     print_attributes (ebl, ehdr);
1049   if (dump_data_sections != NULL)
1050     dump_data (pure_ebl);
1051   if (string_sections != NULL)
1052     dump_strings (ebl);
1053   if ((print_debug_sections | implicit_debug_sections) != 0)
1054     print_debug (dwflmod, ebl, ehdr);
1055   if (print_notes)
1056     handle_notes (pure_ebl, ehdr);
1057   if (print_string_sections)
1058     print_strings (ebl);
1059 
1060   ebl_closebackend (ebl);
1061 
1062   if (pure_ebl != ebl)
1063     {
1064       ebl_closebackend (pure_ebl);
1065       elf_end (pure_elf);
1066     }
1067 }
1068 
1069 
1070 /* Print file type.  */
1071 static void
print_file_type(unsigned short int e_type)1072 print_file_type (unsigned short int e_type)
1073 {
1074   if (likely (e_type <= ET_CORE))
1075     {
1076       static const char *const knowntypes[] =
1077       {
1078 	N_("NONE (None)"),
1079 	N_("REL (Relocatable file)"),
1080 	N_("EXEC (Executable file)"),
1081 	N_("DYN (Shared object file)"),
1082 	N_("CORE (Core file)")
1083       };
1084       puts (_(knowntypes[e_type]));
1085     }
1086   else if (e_type >= ET_LOOS && e_type <= ET_HIOS)
1087     printf (_("OS Specific: (%x)\n"),  e_type);
1088   else if (e_type >= ET_LOPROC /* && e_type <= ET_HIPROC always true */)
1089     printf (_("Processor Specific: (%x)\n"),  e_type);
1090   else
1091     puts ("???");
1092 }
1093 
1094 
1095 /* Print ELF header.  */
1096 static void
print_ehdr(Ebl * ebl,GElf_Ehdr * ehdr)1097 print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr)
1098 {
1099   fputs_unlocked (_("ELF Header:\n  Magic:  "), stdout);
1100   for (size_t cnt = 0; cnt < EI_NIDENT; ++cnt)
1101     printf (" %02hhx", ehdr->e_ident[cnt]);
1102 
1103   printf (_("\n  Class:                             %s\n"),
1104 	  ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? "ELF32"
1105 	  : ehdr->e_ident[EI_CLASS] == ELFCLASS64 ? "ELF64"
1106 	  : "\?\?\?");
1107 
1108   printf (_("  Data:                              %s\n"),
1109 	  ehdr->e_ident[EI_DATA] == ELFDATA2LSB
1110 	  ? "2's complement, little endian"
1111 	  : ehdr->e_ident[EI_DATA] == ELFDATA2MSB
1112 	  ? "2's complement, big endian" : "\?\?\?");
1113 
1114   printf (_("  Ident Version:                     %hhd %s\n"),
1115 	  ehdr->e_ident[EI_VERSION],
1116 	  ehdr->e_ident[EI_VERSION] == EV_CURRENT ? _("(current)")
1117 	  : "(\?\?\?)");
1118 
1119   char buf[512];
1120   printf (_("  OS/ABI:                            %s\n"),
1121 	  ebl_osabi_name (ebl, ehdr->e_ident[EI_OSABI], buf, sizeof (buf)));
1122 
1123   printf (_("  ABI Version:                       %hhd\n"),
1124 	  ehdr->e_ident[EI_ABIVERSION]);
1125 
1126   fputs_unlocked (_("  Type:                              "), stdout);
1127   print_file_type (ehdr->e_type);
1128 
1129   const char *machine = dwelf_elf_e_machine_string (ehdr->e_machine);
1130   if (machine != NULL)
1131     printf (_("  Machine:                           %s\n"), machine);
1132   else
1133     printf (_("  Machine:                           <unknown>: 0x%x\n"),
1134 	    ehdr->e_machine);
1135 
1136   printf (_("  Version:                           %d %s\n"),
1137 	  ehdr->e_version,
1138 	  ehdr->e_version  == EV_CURRENT ? _("(current)") : "(\?\?\?)");
1139 
1140   printf (_("  Entry point address:               %#" PRIx64 "\n"),
1141 	  ehdr->e_entry);
1142 
1143   printf (_("  Start of program headers:          %" PRId64 " %s\n"),
1144 	  ehdr->e_phoff, _("(bytes into file)"));
1145 
1146   printf (_("  Start of section headers:          %" PRId64 " %s\n"),
1147 	  ehdr->e_shoff, _("(bytes into file)"));
1148 
1149   printf (_("  Flags:                             %s\n"),
1150 	  ebl_machine_flag_name (ebl, ehdr->e_flags, buf, sizeof (buf)));
1151 
1152   printf (_("  Size of this header:               %" PRId16 " %s\n"),
1153 	  ehdr->e_ehsize, _("(bytes)"));
1154 
1155   printf (_("  Size of program header entries:    %" PRId16 " %s\n"),
1156 	  ehdr->e_phentsize, _("(bytes)"));
1157 
1158   printf (_("  Number of program headers entries: %" PRId16),
1159 	  ehdr->e_phnum);
1160   if (ehdr->e_phnum == PN_XNUM)
1161     {
1162       GElf_Shdr shdr_mem;
1163       GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
1164       if (shdr != NULL)
1165 	printf (_(" (%" PRIu32 " in [0].sh_info)"),
1166 		(uint32_t) shdr->sh_info);
1167       else
1168 	fputs_unlocked (_(" ([0] not available)"), stdout);
1169     }
1170   fputc_unlocked ('\n', stdout);
1171 
1172   printf (_("  Size of section header entries:    %" PRId16 " %s\n"),
1173 	  ehdr->e_shentsize, _("(bytes)"));
1174 
1175   printf (_("  Number of section headers entries: %" PRId16),
1176 	  ehdr->e_shnum);
1177   if (ehdr->e_shnum == 0)
1178     {
1179       GElf_Shdr shdr_mem;
1180       GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
1181       if (shdr != NULL)
1182 	printf (_(" (%" PRIu32 " in [0].sh_size)"),
1183 		(uint32_t) shdr->sh_size);
1184       else
1185 	fputs_unlocked (_(" ([0] not available)"), stdout);
1186     }
1187   fputc_unlocked ('\n', stdout);
1188 
1189   if (unlikely (ehdr->e_shstrndx == SHN_XINDEX))
1190     {
1191       GElf_Shdr shdr_mem;
1192       GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
1193       if (shdr != NULL)
1194 	/* We managed to get the zeroth section.  */
1195 	snprintf (buf, sizeof (buf), _(" (%" PRIu32 " in [0].sh_link)"),
1196 		  (uint32_t) shdr->sh_link);
1197       else
1198 	{
1199 	  strncpy (buf, _(" ([0] not available)"), sizeof (buf) - 1);
1200 	  buf[sizeof (buf) - 1] = '\0';
1201 	}
1202 
1203       printf (_("  Section header string table index: XINDEX%s\n\n"),
1204 	      buf);
1205     }
1206   else
1207     printf (_("  Section header string table index: %" PRId16 "\n\n"),
1208 	    ehdr->e_shstrndx);
1209 }
1210 
1211 
1212 static const char *
get_visibility_type(int value)1213 get_visibility_type (int value)
1214 {
1215   switch (value)
1216     {
1217     case STV_DEFAULT:
1218       return "DEFAULT";
1219     case STV_INTERNAL:
1220       return "INTERNAL";
1221     case STV_HIDDEN:
1222       return "HIDDEN";
1223     case STV_PROTECTED:
1224       return "PROTECTED";
1225     default:
1226       return "???";
1227     }
1228 }
1229 
1230 static const char *
elf_ch_type_name(unsigned int code)1231 elf_ch_type_name (unsigned int code)
1232 {
1233   if (code == 0)
1234     return "NONE";
1235 
1236   if (code == ELFCOMPRESS_ZLIB)
1237     return "ZLIB";
1238 
1239   return "UNKNOWN";
1240 }
1241 
1242 /* Print the section headers.  */
1243 static void
print_shdr(Ebl * ebl,GElf_Ehdr * ehdr)1244 print_shdr (Ebl *ebl, GElf_Ehdr *ehdr)
1245 {
1246   size_t cnt;
1247   size_t shstrndx;
1248 
1249   if (! print_file_header)
1250     {
1251       size_t sections;
1252       if (unlikely (elf_getshdrnum (ebl->elf, &sections) < 0))
1253 	error_exit (0, _("cannot get number of sections: %s"),
1254 		    elf_errmsg (-1));
1255 
1256       printf (_("\
1257 There are %zd section headers, starting at offset %#" PRIx64 ":\n\
1258 \n"),
1259 	      sections, ehdr->e_shoff);
1260     }
1261 
1262   /* Get the section header string table index.  */
1263   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
1264     error_exit (0, _("cannot get section header string table index: %s"),
1265 		elf_errmsg (-1));
1266 
1267   puts (_("Section Headers:"));
1268 
1269   if (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1270     puts (_("[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk Inf Al"));
1271   else
1272     puts (_("[Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al"));
1273 
1274   if (print_decompress)
1275     {
1276       if (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1277 	puts (_("     [Compression  Size   Al]"));
1278       else
1279 	puts (_("     [Compression  Size     Al]"));
1280     }
1281 
1282   for (cnt = 0; cnt < shnum; ++cnt)
1283     {
1284       Elf_Scn *scn = elf_getscn (ebl->elf, cnt);
1285 
1286       if (unlikely (scn == NULL))
1287 	error_exit (0, _("cannot get section: %s"),
1288 		    elf_errmsg (-1));
1289 
1290       /* Get the section header.  */
1291       GElf_Shdr shdr_mem;
1292       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
1293       if (unlikely (shdr == NULL))
1294 	error_exit (0, _("cannot get section header: %s"),
1295 		    elf_errmsg (-1));
1296 
1297       char flagbuf[20];
1298       char *cp = flagbuf;
1299       if (shdr->sh_flags & SHF_WRITE)
1300 	*cp++ = 'W';
1301       if (shdr->sh_flags & SHF_ALLOC)
1302 	*cp++ = 'A';
1303       if (shdr->sh_flags & SHF_EXECINSTR)
1304 	*cp++ = 'X';
1305       if (shdr->sh_flags & SHF_MERGE)
1306 	*cp++ = 'M';
1307       if (shdr->sh_flags & SHF_STRINGS)
1308 	*cp++ = 'S';
1309       if (shdr->sh_flags & SHF_INFO_LINK)
1310 	*cp++ = 'I';
1311       if (shdr->sh_flags & SHF_LINK_ORDER)
1312 	*cp++ = 'L';
1313       if (shdr->sh_flags & SHF_OS_NONCONFORMING)
1314 	*cp++ = 'N';
1315       if (shdr->sh_flags & SHF_GROUP)
1316 	*cp++ = 'G';
1317       if (shdr->sh_flags & SHF_TLS)
1318 	*cp++ = 'T';
1319       if (shdr->sh_flags & SHF_COMPRESSED)
1320 	*cp++ = 'C';
1321       if (shdr->sh_flags & SHF_ORDERED)
1322 	*cp++ = 'O';
1323       if (shdr->sh_flags & SHF_EXCLUDE)
1324 	*cp++ = 'E';
1325       if (shdr->sh_flags & SHF_GNU_RETAIN)
1326 	*cp++ = 'R';
1327       *cp = '\0';
1328 
1329       const char *sname;
1330       char buf[128];
1331       sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name) ?: "<corrupt>";
1332       printf ("[%2zu] %-20s %-12s %0*" PRIx64 " %0*" PRIx64 " %0*" PRIx64
1333 	      " %2" PRId64 " %-5s %2" PRId32 " %3" PRId32
1334 	      " %2" PRId64 "\n",
1335 	      cnt, sname,
1336 	      ebl_section_type_name (ebl, shdr->sh_type, buf, sizeof (buf)),
1337 	      ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 8 : 16, shdr->sh_addr,
1338 	      ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 6 : 8, shdr->sh_offset,
1339 	      ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 6 : 8, shdr->sh_size,
1340 	      shdr->sh_entsize, flagbuf, shdr->sh_link, shdr->sh_info,
1341 	      shdr->sh_addralign);
1342 
1343       if (print_decompress)
1344 	{
1345 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
1346 	    {
1347 	      GElf_Chdr chdr;
1348 	      if (gelf_getchdr (scn, &chdr) != NULL)
1349 		printf ("     [ELF %s (%" PRId32 ") %0*" PRIx64
1350 			" %2" PRId64 "]\n",
1351 			elf_ch_type_name (chdr.ch_type),
1352 			chdr.ch_type,
1353 			ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 6 : 8,
1354 			chdr.ch_size, chdr.ch_addralign);
1355 	      else
1356 		error (0, 0,
1357 		       _("bad compression header for section %zd: %s"),
1358 		       elf_ndxscn (scn), elf_errmsg (-1));
1359 	    }
1360 	  else if (startswith (sname, ".zdebug"))
1361 	    {
1362 	      ssize_t size;
1363 	      if ((size = dwelf_scn_gnu_compressed_size (scn)) >= 0)
1364 		printf ("     [GNU ZLIB     %0*zx   ]\n",
1365 			ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 6 : 8, size);
1366 	      else
1367 		error (0, 0,
1368 		       _("bad gnu compressed size for section %zd: %s"),
1369 		       elf_ndxscn (scn), elf_errmsg (-1));
1370 	    }
1371 	}
1372     }
1373 
1374   fputc_unlocked ('\n', stdout);
1375 }
1376 
1377 
1378 /* Print the program header.  */
1379 static void
print_phdr(Ebl * ebl,GElf_Ehdr * ehdr)1380 print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
1381 {
1382   if (phnum == 0)
1383     /* No program header, this is OK in relocatable objects.  */
1384     return;
1385 
1386   puts (_("Program Headers:"));
1387   if (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1388     puts (_("\
1389   Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"));
1390   else
1391     puts (_("\
1392   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align"));
1393 
1394   /* Process all program headers.  */
1395   bool has_relro = false;
1396   GElf_Addr relro_from = 0;
1397   GElf_Addr relro_to = 0;
1398   for (size_t cnt = 0; cnt < phnum; ++cnt)
1399     {
1400       char buf[128];
1401       GElf_Phdr mem;
1402       GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &mem);
1403 
1404       /* If for some reason the header cannot be returned show this.  */
1405       if (unlikely (phdr == NULL))
1406 	{
1407 	  puts ("  ???");
1408 	  continue;
1409 	}
1410 
1411       printf ("  %-14s 0x%06" PRIx64 " 0x%0*" PRIx64 " 0x%0*" PRIx64
1412 	      " 0x%06" PRIx64 " 0x%06" PRIx64 " %c%c%c 0x%" PRIx64 "\n",
1413 	      ebl_segment_type_name (ebl, phdr->p_type, buf, sizeof (buf)),
1414 	      phdr->p_offset,
1415 	      ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 8 : 16, phdr->p_vaddr,
1416 	      ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 8 : 16, phdr->p_paddr,
1417 	      phdr->p_filesz,
1418 	      phdr->p_memsz,
1419 	      phdr->p_flags & PF_R ? 'R' : ' ',
1420 	      phdr->p_flags & PF_W ? 'W' : ' ',
1421 	      phdr->p_flags & PF_X ? 'E' : ' ',
1422 	      phdr->p_align);
1423 
1424       if (phdr->p_type == PT_INTERP)
1425 	{
1426 	  /* If we are sure the file offset is valid then we can show
1427 	     the user the name of the interpreter.  We check whether
1428 	     there is a section at the file offset.  Normally there
1429 	     would be a section called ".interp".  But in separate
1430 	     .debug files it is a NOBITS section (and so doesn't match
1431 	     with gelf_offscn).  Which probably means the offset is
1432 	     not valid another reason could be because the ELF file
1433 	     just doesn't contain any section headers, in that case
1434 	     just play it safe and don't display anything.  */
1435 
1436 	  Elf_Scn *scn = gelf_offscn (ebl->elf, phdr->p_offset);
1437 	  GElf_Shdr shdr_mem;
1438 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
1439 
1440 	  size_t maxsize;
1441 	  char *filedata = elf_rawfile (ebl->elf, &maxsize);
1442 
1443 	  if (shdr != NULL && shdr->sh_type == SHT_PROGBITS
1444 	      && filedata != NULL && phdr->p_offset < maxsize
1445 	      && phdr->p_filesz <= maxsize - phdr->p_offset
1446 	      && memchr (filedata + phdr->p_offset, '\0',
1447 			 phdr->p_filesz) != NULL)
1448 	    printf (_("\t[Requesting program interpreter: %s]\n"),
1449 		    filedata + phdr->p_offset);
1450 	}
1451       else if (phdr->p_type == PT_GNU_RELRO)
1452 	{
1453 	  has_relro = true;
1454 	  relro_from = phdr->p_vaddr;
1455 	  relro_to = relro_from + phdr->p_memsz;
1456 	}
1457     }
1458 
1459   size_t sections;
1460   if (unlikely (elf_getshdrnum (ebl->elf, &sections) < 0))
1461     error_exit (0, _("cannot get number of sections: %s"),
1462 		elf_errmsg (-1));
1463 
1464   if (sections == 0)
1465     /* No sections in the file.  Punt.  */
1466     return;
1467 
1468   /* Get the section header string table index.  */
1469   size_t shstrndx;
1470   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
1471     error_exit (0, _("cannot get section header string table index"));
1472 
1473   puts (_("\n Section to Segment mapping:\n  Segment Sections..."));
1474 
1475   for (size_t cnt = 0; cnt < phnum; ++cnt)
1476     {
1477       /* Print the segment number.  */
1478       printf ("   %2.2zu     ", cnt);
1479 
1480       GElf_Phdr phdr_mem;
1481       GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &phdr_mem);
1482       /* This must not happen.  */
1483       if (unlikely (phdr == NULL))
1484 	error_exit (0, _("cannot get program header: %s"),
1485 		    elf_errmsg (-1));
1486 
1487       /* Iterate over the sections.  */
1488       bool in_relro = false;
1489       bool in_ro = false;
1490       for (size_t inner = 1; inner < shnum; ++inner)
1491 	{
1492 	  Elf_Scn *scn = elf_getscn (ebl->elf, inner);
1493 	  /* This should not happen.  */
1494 	  if (unlikely (scn == NULL))
1495 	    error_exit (0, _("cannot get section: %s"),
1496 			elf_errmsg (-1));
1497 
1498 	  /* Get the section header.  */
1499 	  GElf_Shdr shdr_mem;
1500 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
1501 	  if (unlikely (shdr == NULL))
1502 	    error_exit (0, _("cannot get section header: %s"),
1503 			elf_errmsg (-1));
1504 
1505 	  if (shdr->sh_size > 0
1506 	      /* Compare allocated sections by VMA, unallocated
1507 		 sections by file offset.  */
1508 	      && (shdr->sh_flags & SHF_ALLOC
1509 		  ? (shdr->sh_addr >= phdr->p_vaddr
1510 		     && (shdr->sh_addr + shdr->sh_size
1511 			 <= phdr->p_vaddr + phdr->p_memsz))
1512 		  : (shdr->sh_offset >= phdr->p_offset
1513 		     && (shdr->sh_offset + shdr->sh_size
1514 			 <= phdr->p_offset + phdr->p_filesz))))
1515 	    {
1516 	      if (has_relro && !in_relro
1517 		  && shdr->sh_addr >= relro_from
1518 		  && shdr->sh_addr + shdr->sh_size <= relro_to)
1519 		{
1520 		  fputs_unlocked (" [RELRO:", stdout);
1521 		  in_relro = true;
1522 		}
1523 	      else if (has_relro && in_relro && shdr->sh_addr >= relro_to)
1524 		{
1525 		  fputs_unlocked ("]", stdout);
1526 		  in_relro =  false;
1527 		}
1528 	      else if (has_relro && in_relro
1529 		       && shdr->sh_addr + shdr->sh_size > relro_to)
1530 		fputs_unlocked ("] <RELRO:", stdout);
1531 	      else if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_W) == 0)
1532 		{
1533 		  if (!in_ro)
1534 		    {
1535 		      fputs_unlocked (" [RO:", stdout);
1536 		      in_ro = true;
1537 		    }
1538 		}
1539 	      else
1540 		{
1541 		  /* Determine the segment this section is part of.  */
1542 		  size_t cnt2;
1543 		  GElf_Phdr phdr2_mem;
1544 		  GElf_Phdr *phdr2 = NULL;
1545 		  for (cnt2 = 0; cnt2 < phnum; ++cnt2)
1546 		    {
1547 		      phdr2 = gelf_getphdr (ebl->elf, cnt2, &phdr2_mem);
1548 
1549 		      if (phdr2 != NULL && phdr2->p_type == PT_LOAD
1550 			  && shdr->sh_addr >= phdr2->p_vaddr
1551 			  && (shdr->sh_addr + shdr->sh_size
1552 			      <= phdr2->p_vaddr + phdr2->p_memsz))
1553 			break;
1554 		    }
1555 
1556 		  if (cnt2 < phnum)
1557 		    {
1558 		      if ((phdr2->p_flags & PF_W) == 0 && !in_ro)
1559 			{
1560 			  fputs_unlocked (" [RO:", stdout);
1561 			  in_ro = true;
1562 			}
1563 		      else if ((phdr2->p_flags & PF_W) != 0 && in_ro)
1564 			{
1565 			  fputs_unlocked ("]", stdout);
1566 			  in_ro = false;
1567 			}
1568 		    }
1569 		}
1570 
1571 	      printf (" %s",
1572 		      elf_strptr (ebl->elf, shstrndx, shdr->sh_name));
1573 
1574 	      /* Signal that this section is only partially covered.  */
1575 	      if (has_relro && in_relro
1576 		       && shdr->sh_addr + shdr->sh_size > relro_to)
1577 		{
1578 		  fputs_unlocked (">", stdout);
1579 		  in_relro =  false;
1580 		}
1581 	    }
1582 	}
1583       if (in_relro || in_ro)
1584 	fputs_unlocked ("]", stdout);
1585 
1586       /* Finish the line.  */
1587       fputc_unlocked ('\n', stdout);
1588     }
1589 }
1590 
1591 
1592 static const char *
section_name(Ebl * ebl,GElf_Shdr * shdr)1593 section_name (Ebl *ebl, GElf_Shdr *shdr)
1594 {
1595   size_t shstrndx;
1596   if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
1597     return "???";
1598   return elf_strptr (ebl->elf, shstrndx, shdr->sh_name) ?: "???";
1599 }
1600 
1601 
1602 static void
handle_scngrp(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr)1603 handle_scngrp (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
1604 {
1605   /* Get the data of the section.  */
1606   Elf_Data *data = elf_getdata (scn, NULL);
1607 
1608   Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
1609   GElf_Shdr symshdr_mem;
1610   GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
1611   Elf_Data *symdata = elf_getdata (symscn, NULL);
1612 
1613   if (data == NULL || data->d_size < sizeof (Elf32_Word) || symshdr == NULL
1614       || symdata == NULL)
1615     return;
1616 
1617   /* Get the section header string table index.  */
1618   size_t shstrndx;
1619   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
1620     error_exit (0, _("cannot get section header string table index"));
1621 
1622   Elf32_Word *grpref = (Elf32_Word *) data->d_buf;
1623 
1624   GElf_Sym sym_mem;
1625   GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem);
1626 
1627   printf ((grpref[0] & GRP_COMDAT)
1628 	  ? ngettext ("\
1629 \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n",
1630 		      "\
1631 \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n",
1632 		      data->d_size / sizeof (Elf32_Word) - 1)
1633 	  : ngettext ("\
1634 \nSection group [%2zu] '%s' with signature '%s' contains %zu entry:\n", "\
1635 \nSection group [%2zu] '%s' with signature '%s' contains %zu entries:\n",
1636 		      data->d_size / sizeof (Elf32_Word) - 1),
1637 	  elf_ndxscn (scn),
1638 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
1639 	  (sym == NULL ? NULL
1640 	   : elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name))
1641 	  ?: _("<INVALID SYMBOL>"),
1642 	  data->d_size / sizeof (Elf32_Word) - 1);
1643 
1644   for (size_t cnt = 1; cnt < data->d_size / sizeof (Elf32_Word); ++cnt)
1645     {
1646       GElf_Shdr grpshdr_mem;
1647       GElf_Shdr *grpshdr = gelf_getshdr (elf_getscn (ebl->elf, grpref[cnt]),
1648 					 &grpshdr_mem);
1649 
1650       const char *str;
1651       printf ("  [%2u] %s\n",
1652 	      grpref[cnt],
1653 	      grpshdr != NULL
1654 	      && (str = elf_strptr (ebl->elf, shstrndx, grpshdr->sh_name))
1655 	      ? str : _("<INVALID SECTION>"));
1656     }
1657 }
1658 
1659 
1660 static void
print_scngrp(Ebl * ebl)1661 print_scngrp (Ebl *ebl)
1662 {
1663   /* Find all relocation sections and handle them.  */
1664   Elf_Scn *scn = NULL;
1665 
1666   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
1667     {
1668        /* Handle the section if it is a symbol table.  */
1669       GElf_Shdr shdr_mem;
1670       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
1671 
1672       if (shdr != NULL && shdr->sh_type == SHT_GROUP)
1673 	{
1674 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
1675 	    {
1676 	      if (elf_compress (scn, 0, 0) < 0)
1677 		printf ("WARNING: %s [%zd]\n",
1678 			_("Couldn't uncompress section"),
1679 			elf_ndxscn (scn));
1680 	      shdr = gelf_getshdr (scn, &shdr_mem);
1681 	      if (unlikely (shdr == NULL))
1682 		error_exit (0, _("cannot get section [%zd] header: %s"),
1683 			    elf_ndxscn (scn),
1684 			    elf_errmsg (-1));
1685 	    }
1686 	  handle_scngrp (ebl, scn, shdr);
1687 	}
1688     }
1689 }
1690 
1691 
1692 static const struct flags
1693 {
1694   int mask;
1695   const char *str;
1696 } dt_flags[] =
1697   {
1698     { DF_ORIGIN, "ORIGIN" },
1699     { DF_SYMBOLIC, "SYMBOLIC" },
1700     { DF_TEXTREL, "TEXTREL" },
1701     { DF_BIND_NOW, "BIND_NOW" },
1702     { DF_STATIC_TLS, "STATIC_TLS" }
1703   };
1704 static const int ndt_flags = sizeof (dt_flags) / sizeof (dt_flags[0]);
1705 
1706 static const struct flags dt_flags_1[] =
1707   {
1708     { DF_1_NOW, "NOW" },
1709     { DF_1_GLOBAL, "GLOBAL" },
1710     { DF_1_GROUP, "GROUP" },
1711     { DF_1_NODELETE, "NODELETE" },
1712     { DF_1_LOADFLTR, "LOADFLTR" },
1713     { DF_1_INITFIRST, "INITFIRST" },
1714     { DF_1_NOOPEN, "NOOPEN" },
1715     { DF_1_ORIGIN, "ORIGIN" },
1716     { DF_1_DIRECT, "DIRECT" },
1717     { DF_1_TRANS, "TRANS" },
1718     { DF_1_INTERPOSE, "INTERPOSE" },
1719     { DF_1_NODEFLIB, "NODEFLIB" },
1720     { DF_1_NODUMP, "NODUMP" },
1721     { DF_1_CONFALT, "CONFALT" },
1722     { DF_1_ENDFILTEE, "ENDFILTEE" },
1723     { DF_1_DISPRELDNE, "DISPRELDNE" },
1724     { DF_1_DISPRELPND, "DISPRELPND" },
1725   };
1726 static const int ndt_flags_1 = sizeof (dt_flags_1) / sizeof (dt_flags_1[0]);
1727 
1728 static const struct flags dt_feature_1[] =
1729   {
1730     { DTF_1_PARINIT, "PARINIT" },
1731     { DTF_1_CONFEXP, "CONFEXP" }
1732   };
1733 static const int ndt_feature_1 = (sizeof (dt_feature_1)
1734 				  / sizeof (dt_feature_1[0]));
1735 
1736 static const struct flags dt_posflag_1[] =
1737   {
1738     { DF_P1_LAZYLOAD, "LAZYLOAD" },
1739     { DF_P1_GROUPPERM, "GROUPPERM" }
1740   };
1741 static const int ndt_posflag_1 = (sizeof (dt_posflag_1)
1742 				  / sizeof (dt_posflag_1[0]));
1743 
1744 
1745 static void
print_flags(int class,GElf_Xword d_val,const struct flags * flags,int nflags)1746 print_flags (int class, GElf_Xword d_val, const struct flags *flags,
1747 		int nflags)
1748 {
1749   bool first = true;
1750   int cnt;
1751 
1752   for (cnt = 0; cnt < nflags; ++cnt)
1753     if (d_val & flags[cnt].mask)
1754       {
1755 	if (!first)
1756 	  putchar_unlocked (' ');
1757 	fputs_unlocked (flags[cnt].str, stdout);
1758 	d_val &= ~flags[cnt].mask;
1759 	first = false;
1760       }
1761 
1762   if (d_val != 0)
1763     {
1764       if (!first)
1765 	putchar_unlocked (' ');
1766       printf ("%#0*" PRIx64, class == ELFCLASS32 ? 10 : 18, d_val);
1767     }
1768 
1769   putchar_unlocked ('\n');
1770 }
1771 
1772 
1773 static void
print_dt_flags(int class,GElf_Xword d_val)1774 print_dt_flags (int class, GElf_Xword d_val)
1775 {
1776   print_flags (class, d_val, dt_flags, ndt_flags);
1777 }
1778 
1779 
1780 static void
print_dt_flags_1(int class,GElf_Xword d_val)1781 print_dt_flags_1 (int class, GElf_Xword d_val)
1782 {
1783   print_flags (class, d_val, dt_flags_1, ndt_flags_1);
1784 }
1785 
1786 
1787 static void
print_dt_feature_1(int class,GElf_Xword d_val)1788 print_dt_feature_1 (int class, GElf_Xword d_val)
1789 {
1790   print_flags (class, d_val, dt_feature_1, ndt_feature_1);
1791 }
1792 
1793 
1794 static void
print_dt_posflag_1(int class,GElf_Xword d_val)1795 print_dt_posflag_1 (int class, GElf_Xword d_val)
1796 {
1797   print_flags (class, d_val, dt_posflag_1, ndt_posflag_1);
1798 }
1799 
1800 
1801 static size_t
get_dyn_ents(Elf_Data * dyn_data)1802 get_dyn_ents (Elf_Data * dyn_data)
1803 {
1804   GElf_Dyn *dyn;
1805   GElf_Dyn dyn_mem;
1806   size_t dyn_idx = 0;
1807   do
1808     {
1809       dyn = gelf_getdyn(dyn_data, dyn_idx, &dyn_mem);
1810       if (dyn != NULL)
1811 	++dyn_idx;
1812     }
1813   while (dyn != NULL && dyn->d_tag != DT_NULL);
1814 
1815   return dyn_idx;
1816 }
1817 
1818 
1819 static void
handle_dynamic(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr,GElf_Phdr * phdr)1820 handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr)
1821 {
1822   int class = gelf_getclass (ebl->elf);
1823   GElf_Shdr glink_mem;
1824   GElf_Shdr *glink;
1825   Elf_Data *data;
1826   size_t cnt;
1827   size_t shstrndx;
1828   size_t dyn_ents;
1829 
1830   /* Get the data of the section.  */
1831   if (use_dynamic_segment)
1832     data = elf_getdata_rawchunk(ebl->elf, phdr->p_offset,
1833 				phdr->p_filesz, ELF_T_DYN);
1834   else
1835     data = elf_getdata (scn, NULL);
1836 
1837   if (data == NULL)
1838     return;
1839 
1840   /* Get the dynamic section entry number */
1841   dyn_ents = get_dyn_ents (data);
1842 
1843   if (!use_dynamic_segment)
1844     {
1845       /* Get the section header string table index.  */
1846       if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
1847 	error_exit (0, _("cannot get section header string table index"));
1848 
1849       glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
1850       if (glink == NULL)
1851 	error_exit (0, _("invalid sh_link value in section %zu"),
1852 		    elf_ndxscn (scn));
1853 
1854       printf (ngettext ("\
1855 \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
1856 		    "\
1857 \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
1858 			dyn_ents),
1859 	      (unsigned long int) dyn_ents,
1860 	      class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
1861 	      shdr->sh_offset,
1862 	      (int) shdr->sh_link,
1863 	      elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1864     }
1865   else
1866     {
1867       printf (ngettext ("\
1868 \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "\n",
1869 		    "\
1870 \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "\n",
1871 			dyn_ents),
1872 	      (unsigned long int) dyn_ents,
1873 	      class == ELFCLASS32 ? 10 : 18, phdr->p_paddr,
1874 	      phdr->p_offset);
1875     }
1876 
1877   fputs_unlocked (_("  Type              Value\n"), stdout);
1878 
1879   /* if --use-dynamic option is enabled,
1880      use the string table to get the related library info.  */
1881   Elf_Data *strtab_data = NULL;
1882   if (use_dynamic_segment)
1883     {
1884       strtab_data = get_dynscn_strtab(ebl->elf, phdr);
1885       if (strtab_data == NULL)
1886 	error_exit (0, _("cannot get string table by using dynamic segment"));
1887     }
1888 
1889   for (cnt = 0; cnt < dyn_ents; ++cnt)
1890     {
1891       GElf_Dyn dynmem;
1892       GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem);
1893       if (dyn == NULL)
1894 	break;
1895 
1896       char buf[64];
1897       printf ("  %-17s ",
1898 	      ebl_dynamic_tag_name (ebl, dyn->d_tag, buf, sizeof (buf)));
1899 
1900       char *name = NULL;
1901       if (dyn->d_tag == DT_NEEDED
1902 	  || dyn->d_tag == DT_SONAME
1903 	  || dyn->d_tag == DT_RPATH
1904 	  || dyn->d_tag == DT_RUNPATH)
1905 	{
1906 	  if (! use_dynamic_segment)
1907 	    name = elf_strptr (ebl->elf, shdr->sh_link, dyn->d_un.d_val);
1908 	  else if (dyn->d_un.d_val < strtab_data->d_size
1909 		   && memrchr (strtab_data->d_buf + dyn->d_un.d_val, '\0',
1910 			       strtab_data->d_size - 1 - dyn->d_un.d_val) != NULL)
1911 	    name = ((char *) strtab_data->d_buf) + dyn->d_un.d_val;
1912 	}
1913 
1914       switch (dyn->d_tag)
1915 	{
1916 	case DT_NULL:
1917 	case DT_DEBUG:
1918 	case DT_BIND_NOW:
1919 	case DT_TEXTREL:
1920 	  /* No further output.  */
1921 	  fputc_unlocked ('\n', stdout);
1922 	  break;
1923 
1924 	case DT_NEEDED:
1925 	  printf (_("Shared library: [%s]\n"), name);
1926 	  break;
1927 
1928 	case DT_SONAME:
1929 	  printf (_("Library soname: [%s]\n"), name);
1930 	  break;
1931 
1932 	case DT_RPATH:
1933 	  printf (_("Library rpath: [%s]\n"), name);
1934 	  break;
1935 
1936 	case DT_RUNPATH:
1937 	  printf (_("Library runpath: [%s]\n"), name);
1938 	  break;
1939 
1940 	case DT_PLTRELSZ:
1941 	case DT_RELASZ:
1942 	case DT_STRSZ:
1943 	case DT_RELSZ:
1944 	case DT_RELAENT:
1945 	case DT_SYMENT:
1946 	case DT_RELENT:
1947 	case DT_PLTPADSZ:
1948 	case DT_MOVEENT:
1949 	case DT_MOVESZ:
1950 	case DT_INIT_ARRAYSZ:
1951 	case DT_FINI_ARRAYSZ:
1952 	case DT_SYMINSZ:
1953 	case DT_SYMINENT:
1954 	case DT_GNU_CONFLICTSZ:
1955 	case DT_GNU_LIBLISTSZ:
1956 	  printf (_("%" PRId64 " (bytes)\n"), dyn->d_un.d_val);
1957 	  break;
1958 
1959 	case DT_VERDEFNUM:
1960 	case DT_VERNEEDNUM:
1961 	case DT_RELACOUNT:
1962 	case DT_RELCOUNT:
1963 	  printf ("%" PRId64 "\n", dyn->d_un.d_val);
1964 	  break;
1965 
1966 	case DT_PLTREL:;
1967 	  const char *tagname = ebl_dynamic_tag_name (ebl, dyn->d_un.d_val,
1968 						      NULL, 0);
1969 	  puts (tagname ?: "???");
1970 	  break;
1971 
1972 	case DT_FLAGS:
1973 	  print_dt_flags (class, dyn->d_un.d_val);
1974 	  break;
1975 
1976 	case DT_FLAGS_1:
1977 	  print_dt_flags_1 (class, dyn->d_un.d_val);
1978 	  break;
1979 
1980 	case DT_FEATURE_1:
1981 	  print_dt_feature_1 (class, dyn->d_un.d_val);
1982 	  break;
1983 
1984 	case DT_POSFLAG_1:
1985 	  print_dt_posflag_1 (class, dyn->d_un.d_val);
1986 	  break;
1987 
1988 	default:
1989 	  printf ("%#0*" PRIx64 "\n",
1990 		  class == ELFCLASS32 ? 10 : 18, dyn->d_un.d_val);
1991 	  break;
1992 	}
1993     }
1994 }
1995 
1996 
1997 /* Print the dynamic segment.  */
1998 static void
print_dynamic(Ebl * ebl)1999 print_dynamic (Ebl *ebl)
2000 {
2001   for (size_t i = 0; i < phnum; ++i)
2002     {
2003       GElf_Phdr phdr_mem;
2004       GElf_Phdr *phdr = gelf_getphdr (ebl->elf, i, &phdr_mem);
2005 
2006       if (phdr != NULL && phdr->p_type == PT_DYNAMIC)
2007 	{
2008 	  Elf_Scn *scn = gelf_offscn (ebl->elf, phdr->p_offset);
2009 	  GElf_Shdr shdr_mem;
2010 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2011 	  if ((use_dynamic_segment && phdr != NULL)
2012 	      || (shdr != NULL && shdr->sh_type == SHT_DYNAMIC))
2013 	    handle_dynamic (ebl, scn, shdr, phdr);
2014 	  break;
2015 	}
2016     }
2017 }
2018 
2019 
2020 /* Print relocations.  */
2021 static void
print_relocs(Ebl * ebl,GElf_Ehdr * ehdr)2022 print_relocs (Ebl *ebl, GElf_Ehdr *ehdr)
2023 {
2024   /* Find all relocation sections and handle them.  */
2025   Elf_Scn *scn = NULL;
2026 
2027   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
2028     {
2029        /* Handle the section if it is a symbol table.  */
2030       GElf_Shdr shdr_mem;
2031       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2032 
2033       if (likely (shdr != NULL))
2034 	{
2035 	  if (shdr->sh_type == SHT_REL)
2036 	    handle_relocs_rel (ebl, ehdr, scn, shdr);
2037 	  else if (shdr->sh_type == SHT_RELA)
2038 	    handle_relocs_rela (ebl, ehdr, scn, shdr);
2039 	}
2040     }
2041 }
2042 
2043 
2044 /* Handle a relocation section.  */
2045 static void
handle_relocs_rel(Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr)2046 handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
2047 {
2048   int class = gelf_getclass (ebl->elf);
2049   size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
2050   int nentries = shdr->sh_size / sh_entsize;
2051 
2052   /* Get the data of the section.  */
2053   Elf_Data *data = elf_getdata (scn, NULL);
2054   if (data == NULL)
2055     return;
2056 
2057   /* Get the symbol table information.  */
2058   Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
2059   GElf_Shdr symshdr_mem;
2060   GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
2061   Elf_Data *symdata = elf_getdata (symscn, NULL);
2062 
2063   /* Get the section header of the section the relocations are for.  */
2064   GElf_Shdr destshdr_mem;
2065   GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_info),
2066 				      &destshdr_mem);
2067 
2068   if (unlikely (symshdr == NULL || symdata == NULL || destshdr == NULL))
2069     {
2070       printf (_("\nInvalid symbol table at offset %#0" PRIx64 "\n"),
2071 	      shdr->sh_offset);
2072       return;
2073     }
2074 
2075   /* Search for the optional extended section index table.  */
2076   Elf_Data *xndxdata = NULL;
2077   int xndxscnidx = elf_scnshndx (scn);
2078   if (unlikely (xndxscnidx > 0))
2079     xndxdata = elf_getdata (elf_getscn (ebl->elf, xndxscnidx), NULL);
2080 
2081   /* Get the section header string table index.  */
2082   size_t shstrndx;
2083   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2084     error_exit (0, _("cannot get section header string table index"));
2085 
2086   if (shdr->sh_info != 0)
2087     printf (ngettext ("\
2088 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
2089 		    "\
2090 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
2091 		      nentries),
2092 	    elf_ndxscn (scn),
2093 	    elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
2094 	    (unsigned int) shdr->sh_info,
2095 	    elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
2096 	    shdr->sh_offset,
2097 	    nentries);
2098   else
2099     /* The .rel.dyn section does not refer to a specific section but
2100        instead of section index zero.  Do not try to print a section
2101        name.  */
2102     printf (ngettext ("\
2103 \nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
2104 		    "\
2105 \nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
2106 		      nentries),
2107 	    (unsigned int) elf_ndxscn (scn),
2108 	    elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
2109 	    shdr->sh_offset,
2110 	    nentries);
2111   fputs_unlocked (class == ELFCLASS32
2112 		  ? _("\
2113   Offset      Type                 Value       Name\n")
2114 		  : _("\
2115   Offset              Type                 Value               Name\n"),
2116 	 stdout);
2117 
2118   int is_statically_linked = 0;
2119   for (int cnt = 0; cnt < nentries; ++cnt)
2120     {
2121       GElf_Rel relmem;
2122       GElf_Rel *rel = gelf_getrel (data, cnt, &relmem);
2123       if (likely (rel != NULL))
2124 	{
2125 	  char buf[128];
2126 	  GElf_Sym symmem;
2127 	  Elf32_Word xndx;
2128 	  GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata,
2129 					    GELF_R_SYM (rel->r_info),
2130 					    &symmem, &xndx);
2131 	  if (unlikely (sym == NULL))
2132 	    {
2133 	      /* As a special case we have to handle relocations in static
2134 		 executables.  This only happens for IRELATIVE relocations
2135 		 (so far).  There is no symbol table.  */
2136 	      if (is_statically_linked == 0)
2137 		{
2138 		  /* Find the program header and look for a PT_INTERP entry. */
2139 		  is_statically_linked = -1;
2140 		  if (ehdr->e_type == ET_EXEC)
2141 		    {
2142 		      is_statically_linked = 1;
2143 
2144 		      for (size_t inner = 0; inner < phnum; ++inner)
2145 			{
2146 			  GElf_Phdr phdr_mem;
2147 			  GElf_Phdr *phdr = gelf_getphdr (ebl->elf, inner,
2148 							  &phdr_mem);
2149 			  if (phdr != NULL && phdr->p_type == PT_INTERP)
2150 			    {
2151 			      is_statically_linked = -1;
2152 			      break;
2153 			    }
2154 			}
2155 		    }
2156 		}
2157 
2158 	      if (is_statically_linked > 0 && shdr->sh_link == 0)
2159 		printf ("\
2160   %#0*" PRIx64 "  %-20s %*s  %s\n",
2161 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2162 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2163 			/* Avoid the leading R_ which isn't carrying any
2164 			   information.  */
2165 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2166 					       buf, sizeof (buf)) + 2
2167 			: _("<INVALID RELOC>"),
2168 			class == ELFCLASS32 ? 10 : 18, "",
2169 			elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
2170 	      else
2171 		printf ("  %#0*" PRIx64 "  %-20s <%s %ld>\n",
2172 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2173 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2174 			/* Avoid the leading R_ which isn't carrying any
2175 			   information.  */
2176 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2177 					       buf, sizeof (buf)) + 2
2178 			: _("<INVALID RELOC>"),
2179 			_("INVALID SYMBOL"),
2180 			(long int) GELF_R_SYM (rel->r_info));
2181 	    }
2182 	  else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
2183 	    printf ("  %#0*" PRIx64 "  %-20s %#0*" PRIx64 "  %s\n",
2184 		    class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2185 		    likely (ebl_reloc_type_check (ebl,
2186 						  GELF_R_TYPE (rel->r_info)))
2187 		    /* Avoid the leading R_ which isn't carrying any
2188 		       information.  */
2189 		    ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2190 					   buf, sizeof (buf)) + 2
2191 		    : _("<INVALID RELOC>"),
2192 		    class == ELFCLASS32 ? 10 : 18, sym->st_value,
2193 		    elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name));
2194 	  else
2195 	    {
2196 	      /* This is a relocation against a STT_SECTION symbol.  */
2197 	      GElf_Shdr secshdr_mem;
2198 	      GElf_Shdr *secshdr;
2199 	      secshdr = gelf_getshdr (elf_getscn (ebl->elf,
2200 						  sym->st_shndx == SHN_XINDEX
2201 						  ? xndx : sym->st_shndx),
2202 				      &secshdr_mem);
2203 
2204 	      if (unlikely (secshdr == NULL))
2205 		printf ("  %#0*" PRIx64 "  %-20s <%s %ld>\n",
2206 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2207 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2208 			/* Avoid the leading R_ which isn't carrying any
2209 			   information.  */
2210 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2211 					       buf, sizeof (buf)) + 2
2212 			: _("<INVALID RELOC>"),
2213 			_("INVALID SECTION"),
2214 			(long int) (sym->st_shndx == SHN_XINDEX
2215 				    ? xndx : sym->st_shndx));
2216 	      else
2217 		printf ("  %#0*" PRIx64 "  %-20s %#0*" PRIx64 "  %s\n",
2218 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2219 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2220 			/* Avoid the leading R_ which isn't carrying any
2221 			   information.  */
2222 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2223 					       buf, sizeof (buf)) + 2
2224 			: _("<INVALID RELOC>"),
2225 			class == ELFCLASS32 ? 10 : 18, sym->st_value,
2226 			elf_strptr (ebl->elf, shstrndx, secshdr->sh_name));
2227 	    }
2228 	}
2229     }
2230 }
2231 
2232 
2233 /* Handle a relocation section.  */
2234 static void
handle_relocs_rela(Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr)2235 handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
2236 {
2237   int class = gelf_getclass (ebl->elf);
2238   size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
2239   int nentries = shdr->sh_size / sh_entsize;
2240 
2241   /* Get the data of the section.  */
2242   Elf_Data *data = elf_getdata (scn, NULL);
2243   if (data == NULL)
2244     return;
2245 
2246   /* Get the symbol table information.  */
2247   Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
2248   GElf_Shdr symshdr_mem;
2249   GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
2250   Elf_Data *symdata = elf_getdata (symscn, NULL);
2251 
2252   /* Get the section header of the section the relocations are for.  */
2253   GElf_Shdr destshdr_mem;
2254   GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_info),
2255 				      &destshdr_mem);
2256 
2257   if (unlikely (symshdr == NULL || symdata == NULL || destshdr == NULL))
2258     {
2259       printf (_("\nInvalid symbol table at offset %#0" PRIx64 "\n"),
2260 	      shdr->sh_offset);
2261       return;
2262     }
2263 
2264   /* Search for the optional extended section index table.  */
2265   Elf_Data *xndxdata = NULL;
2266   int xndxscnidx = elf_scnshndx (scn);
2267   if (unlikely (xndxscnidx > 0))
2268     xndxdata = elf_getdata (elf_getscn (ebl->elf, xndxscnidx), NULL);
2269 
2270   /* Get the section header string table index.  */
2271   size_t shstrndx;
2272   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2273     error_exit (0, _("cannot get section header string table index"));
2274 
2275   if (shdr->sh_info != 0)
2276     printf (ngettext ("\
2277 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
2278 		    "\
2279 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
2280 		    nentries),
2281 	  elf_ndxscn (scn),
2282 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
2283 	  (unsigned int) shdr->sh_info,
2284 	  elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
2285 	  shdr->sh_offset,
2286 	  nentries);
2287   else
2288     /* The .rela.dyn section does not refer to a specific section but
2289        instead of section index zero.  Do not try to print a section
2290        name.  */
2291     printf (ngettext ("\
2292 \nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
2293 		    "\
2294 \nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
2295 		      nentries),
2296 	    (unsigned int) elf_ndxscn (scn),
2297 	    elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
2298 	    shdr->sh_offset,
2299 	    nentries);
2300   fputs_unlocked (class == ELFCLASS32
2301 		  ? _("\
2302   Offset      Type            Value       Addend Name\n")
2303 		  : _("\
2304   Offset              Type            Value               Addend Name\n"),
2305 		  stdout);
2306 
2307   int is_statically_linked = 0;
2308   for (int cnt = 0; cnt < nentries; ++cnt)
2309     {
2310       GElf_Rela relmem;
2311       GElf_Rela *rel = gelf_getrela (data, cnt, &relmem);
2312       if (likely (rel != NULL))
2313 	{
2314 	  char buf[64];
2315 	  GElf_Sym symmem;
2316 	  Elf32_Word xndx;
2317 	  GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata,
2318 					    GELF_R_SYM (rel->r_info),
2319 					    &symmem, &xndx);
2320 
2321 	  if (unlikely (sym == NULL))
2322 	    {
2323 	      /* As a special case we have to handle relocations in static
2324 		 executables.  This only happens for IRELATIVE relocations
2325 		 (so far).  There is no symbol table.  */
2326 	      if (is_statically_linked == 0)
2327 		{
2328 		  /* Find the program header and look for a PT_INTERP entry. */
2329 		  is_statically_linked = -1;
2330 		  if (ehdr->e_type == ET_EXEC)
2331 		    {
2332 		      is_statically_linked = 1;
2333 
2334 		      for (size_t inner = 0; inner < phnum; ++inner)
2335 			{
2336 			  GElf_Phdr phdr_mem;
2337 			  GElf_Phdr *phdr = gelf_getphdr (ebl->elf, inner,
2338 							  &phdr_mem);
2339 			  if (phdr != NULL && phdr->p_type == PT_INTERP)
2340 			    {
2341 			      is_statically_linked = -1;
2342 			      break;
2343 			    }
2344 			}
2345 		    }
2346 		}
2347 
2348 	      if (is_statically_linked > 0 && shdr->sh_link == 0)
2349 		printf ("\
2350   %#0*" PRIx64 "  %-15s %*s  %#6" PRIx64 " %s\n",
2351 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2352 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2353 			/* Avoid the leading R_ which isn't carrying any
2354 			   information.  */
2355 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2356 					       buf, sizeof (buf)) + 2
2357 			: _("<INVALID RELOC>"),
2358 			class == ELFCLASS32 ? 10 : 18, "",
2359 			rel->r_addend,
2360 			elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
2361 	      else
2362 		printf ("  %#0*" PRIx64 "  %-15s <%s %ld>\n",
2363 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2364 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2365 			/* Avoid the leading R_ which isn't carrying any
2366 			   information.  */
2367 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2368 					       buf, sizeof (buf)) + 2
2369 			: _("<INVALID RELOC>"),
2370 			_("INVALID SYMBOL"),
2371 			(long int) GELF_R_SYM (rel->r_info));
2372 	    }
2373 	  else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
2374 	    printf ("\
2375   %#0*" PRIx64 "  %-15s %#0*" PRIx64 "  %+6" PRId64 " %s\n",
2376 		    class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2377 		    likely (ebl_reloc_type_check (ebl,
2378 						  GELF_R_TYPE (rel->r_info)))
2379 		    /* Avoid the leading R_ which isn't carrying any
2380 		       information.  */
2381 		    ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2382 					   buf, sizeof (buf)) + 2
2383 		    : _("<INVALID RELOC>"),
2384 		    class == ELFCLASS32 ? 10 : 18, sym->st_value,
2385 		    rel->r_addend,
2386 		    elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name));
2387 	  else
2388 	    {
2389 	      /* This is a relocation against a STT_SECTION symbol.  */
2390 	      GElf_Shdr secshdr_mem;
2391 	      GElf_Shdr *secshdr;
2392 	      secshdr = gelf_getshdr (elf_getscn (ebl->elf,
2393 						  sym->st_shndx == SHN_XINDEX
2394 						  ? xndx : sym->st_shndx),
2395 				      &secshdr_mem);
2396 
2397 	      if (unlikely (secshdr == NULL))
2398 		printf ("  %#0*" PRIx64 "  %-15s <%s %ld>\n",
2399 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2400 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2401 			/* Avoid the leading R_ which isn't carrying any
2402 			   information.  */
2403 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2404 					       buf, sizeof (buf)) + 2
2405 			: _("<INVALID RELOC>"),
2406 			_("INVALID SECTION"),
2407 			(long int) (sym->st_shndx == SHN_XINDEX
2408 				    ? xndx : sym->st_shndx));
2409 	      else
2410 		printf ("\
2411   %#0*" PRIx64 "  %-15s %#0*" PRIx64 "  %+6" PRId64 " %s\n",
2412 			class == ELFCLASS32 ? 10 : 18, rel->r_offset,
2413 			ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
2414 			/* Avoid the leading R_ which isn't carrying any
2415 			   information.  */
2416 			? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
2417 					       buf, sizeof (buf)) + 2
2418 			: _("<INVALID RELOC>"),
2419 			class == ELFCLASS32 ? 10 : 18, sym->st_value,
2420 			rel->r_addend,
2421 			elf_strptr (ebl->elf, shstrndx, secshdr->sh_name));
2422 	    }
2423 	}
2424     }
2425 }
2426 
2427 
2428 /* Print the program header.  */
2429 static void
print_symtab(Ebl * ebl,int type)2430 print_symtab (Ebl *ebl, int type)
2431 {
2432   /* Find the symbol table(s).  For this we have to search through the
2433      section table.  */
2434   Elf_Scn *scn = NULL;
2435 
2436   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
2437     {
2438       /* Handle the section if it is a symbol table.  */
2439       GElf_Shdr shdr_mem;
2440       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2441 
2442       if (shdr != NULL && shdr->sh_type == (GElf_Word) type)
2443 	{
2444 	  if (symbol_table_section != NULL)
2445 	    {
2446 	      /* Get the section header string table index.  */
2447 	      size_t shstrndx;
2448 	      const char *sname;
2449 	      if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2450 		error_exit (0,
2451 			    _("cannot get section header string table index"));
2452 	      sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
2453 	      if (sname == NULL || strcmp (sname, symbol_table_section) != 0)
2454 		continue;
2455 	    }
2456 
2457 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
2458 	    {
2459 	      if (elf_compress (scn, 0, 0) < 0)
2460 		printf ("WARNING: %s [%zd]\n",
2461 			_("Couldn't uncompress section"),
2462 			elf_ndxscn (scn));
2463 	      shdr = gelf_getshdr (scn, &shdr_mem);
2464 	      if (unlikely (shdr == NULL))
2465 		error_exit (0,
2466 			    _("cannot get section [%zd] header: %s"),
2467 			    elf_ndxscn (scn), elf_errmsg (-1));
2468 	    }
2469 	  handle_symtab (ebl, scn, shdr);
2470 	}
2471     }
2472 }
2473 
2474 
2475 static void
handle_symtab(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr)2476 handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
2477 {
2478   Elf_Data *versym_data = NULL;
2479   Elf_Data *verneed_data = NULL;
2480   Elf_Data *verdef_data = NULL;
2481   Elf_Data *xndx_data = NULL;
2482   int class = gelf_getclass (ebl->elf);
2483   Elf32_Word verneed_stridx = 0;
2484   Elf32_Word verdef_stridx = 0;
2485 
2486   /* Get the data of the section.  */
2487   Elf_Data *data = elf_getdata (scn, NULL);
2488   if (data == NULL)
2489     return;
2490 
2491   /* Find out whether we have other sections we might need.  */
2492   Elf_Scn *runscn = NULL;
2493   while ((runscn = elf_nextscn (ebl->elf, runscn)) != NULL)
2494     {
2495       GElf_Shdr runshdr_mem;
2496       GElf_Shdr *runshdr = gelf_getshdr (runscn, &runshdr_mem);
2497 
2498       if (likely (runshdr != NULL))
2499 	{
2500 	  if (runshdr->sh_type == SHT_GNU_versym
2501 	      && runshdr->sh_link == elf_ndxscn (scn))
2502 	    /* Bingo, found the version information.  Now get the data.  */
2503 	    versym_data = elf_getdata (runscn, NULL);
2504 	  else if (runshdr->sh_type == SHT_GNU_verneed)
2505 	    {
2506 	      /* This is the information about the needed versions.  */
2507 	      verneed_data = elf_getdata (runscn, NULL);
2508 	      verneed_stridx = runshdr->sh_link;
2509 	    }
2510 	  else if (runshdr->sh_type == SHT_GNU_verdef)
2511 	    {
2512 	      /* This is the information about the defined versions.  */
2513 	      verdef_data = elf_getdata (runscn, NULL);
2514 	      verdef_stridx = runshdr->sh_link;
2515 	    }
2516 	  else if (runshdr->sh_type == SHT_SYMTAB_SHNDX
2517 	      && runshdr->sh_link == elf_ndxscn (scn))
2518 	    /* Extended section index.  */
2519 	    xndx_data = elf_getdata (runscn, NULL);
2520 	}
2521     }
2522 
2523   /* Get the section header string table index.  */
2524   size_t shstrndx;
2525   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2526     error_exit (0, _("cannot get section header string table index"));
2527 
2528   GElf_Shdr glink_mem;
2529   GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2530 				   &glink_mem);
2531   if (glink == NULL)
2532     error_exit (0, _("invalid sh_link value in section %zu"),
2533 		elf_ndxscn (scn));
2534 
2535   /* Now we can compute the number of entries in the section.  */
2536   unsigned int nsyms = data->d_size / (class == ELFCLASS32
2537 				       ? sizeof (Elf32_Sym)
2538 				       : sizeof (Elf64_Sym));
2539 
2540   printf (ngettext ("\nSymbol table [%2u] '%s' contains %u entry:\n",
2541 		    "\nSymbol table [%2u] '%s' contains %u entries:\n",
2542 		    nsyms),
2543 	  (unsigned int) elf_ndxscn (scn),
2544 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms);
2545   printf (ngettext (" %lu local symbol  String table: [%2u] '%s'\n",
2546 		    " %lu local symbols  String table: [%2u] '%s'\n",
2547 		    shdr->sh_info),
2548 	  (unsigned long int) shdr->sh_info,
2549 	  (unsigned int) shdr->sh_link,
2550 	  elf_strptr (ebl->elf, shstrndx, glink->sh_name));
2551 
2552   fputs_unlocked (class == ELFCLASS32
2553 		  ? _("\
2554   Num:    Value   Size Type    Bind   Vis          Ndx Name\n")
2555 		  : _("\
2556   Num:            Value   Size Type    Bind   Vis          Ndx Name\n"),
2557 		  stdout);
2558 
2559   for (unsigned int cnt = 0; cnt < nsyms; ++cnt)
2560     {
2561       char typebuf[64];
2562       char bindbuf[64];
2563       char scnbuf[64];
2564       Elf32_Word xndx;
2565       GElf_Sym sym_mem;
2566       GElf_Sym *sym = gelf_getsymshndx (data, xndx_data, cnt, &sym_mem, &xndx);
2567 
2568       if (unlikely (sym == NULL))
2569 	continue;
2570 
2571       /* Determine the real section index.  */
2572       if (likely (sym->st_shndx != SHN_XINDEX))
2573 	xndx = sym->st_shndx;
2574 
2575       printf (_("\
2576 %5u: %0*" PRIx64 " %6" PRId64 " %-7s %-6s %-9s %6s %s"),
2577 	      cnt,
2578 	      class == ELFCLASS32 ? 8 : 16,
2579 	      sym->st_value,
2580 	      sym->st_size,
2581 	      ebl_symbol_type_name (ebl, GELF_ST_TYPE (sym->st_info),
2582 				    typebuf, sizeof (typebuf)),
2583 	      ebl_symbol_binding_name (ebl, GELF_ST_BIND (sym->st_info),
2584 				       bindbuf, sizeof (bindbuf)),
2585 	      get_visibility_type (GELF_ST_VISIBILITY (sym->st_other)),
2586 	      ebl_section_name (ebl, sym->st_shndx, xndx, scnbuf,
2587 				sizeof (scnbuf), NULL, shnum),
2588 	      elf_strptr (ebl->elf, shdr->sh_link, sym->st_name));
2589 
2590       if (versym_data != NULL)
2591 	{
2592 	  /* Get the version information.  */
2593 	  GElf_Versym versym_mem;
2594 	  GElf_Versym *versym = gelf_getversym (versym_data, cnt, &versym_mem);
2595 
2596 	  if (versym != NULL && ((*versym & 0x8000) != 0 || *versym > 1))
2597 	    {
2598 	      bool is_nobits = false;
2599 	      bool check_def = xndx != SHN_UNDEF;
2600 
2601 	      if (xndx < SHN_LORESERVE || sym->st_shndx == SHN_XINDEX)
2602 		{
2603 		  GElf_Shdr symshdr_mem;
2604 		  GElf_Shdr *symshdr =
2605 		    gelf_getshdr (elf_getscn (ebl->elf, xndx), &symshdr_mem);
2606 
2607 		  is_nobits = (symshdr != NULL
2608 			       && symshdr->sh_type == SHT_NOBITS);
2609 		}
2610 
2611 	      if (is_nobits || ! check_def)
2612 		{
2613 		  /* We must test both.  */
2614 		  GElf_Vernaux vernaux_mem;
2615 		  GElf_Vernaux *vernaux = NULL;
2616 		  size_t vn_offset = 0;
2617 
2618 		  GElf_Verneed verneed_mem;
2619 		  GElf_Verneed *verneed = gelf_getverneed (verneed_data, 0,
2620 							   &verneed_mem);
2621 		  while (verneed != NULL)
2622 		    {
2623 		      size_t vna_offset = vn_offset;
2624 
2625 		      vernaux = gelf_getvernaux (verneed_data,
2626 						 vna_offset += verneed->vn_aux,
2627 						 &vernaux_mem);
2628 		      while (vernaux != NULL
2629 			     && vernaux->vna_other != *versym
2630 			     && vernaux->vna_next != 0
2631 			     && (verneed_data->d_size - vna_offset
2632 				 >= vernaux->vna_next))
2633 			{
2634 			  /* Update the offset.  */
2635 			  vna_offset += vernaux->vna_next;
2636 
2637 			  vernaux = (vernaux->vna_next == 0
2638 				     ? NULL
2639 				     : gelf_getvernaux (verneed_data,
2640 							vna_offset,
2641 							&vernaux_mem));
2642 			}
2643 
2644 		      /* Check whether we found the version.  */
2645 		      if (vernaux != NULL && vernaux->vna_other == *versym)
2646 			/* Found it.  */
2647 			break;
2648 
2649 		      if (verneed_data->d_size - vn_offset < verneed->vn_next)
2650 			break;
2651 
2652 		      vn_offset += verneed->vn_next;
2653 		      verneed = (verneed->vn_next == 0
2654 				 ? NULL
2655 				 : gelf_getverneed (verneed_data, vn_offset,
2656 						    &verneed_mem));
2657 		    }
2658 
2659 		  if (vernaux != NULL && vernaux->vna_other == *versym)
2660 		    {
2661 		      printf ("@%s (%u)",
2662 			      elf_strptr (ebl->elf, verneed_stridx,
2663 					  vernaux->vna_name),
2664 			      (unsigned int) vernaux->vna_other);
2665 		      check_def = 0;
2666 		    }
2667 		  else if (unlikely (! is_nobits))
2668 		    error (0, 0, _("bad dynamic symbol"));
2669 		  else
2670 		    check_def = 1;
2671 		}
2672 
2673 	      if (check_def && *versym != 0x8001)
2674 		{
2675 		  /* We must test both.  */
2676 		  size_t vd_offset = 0;
2677 
2678 		  GElf_Verdef verdef_mem;
2679 		  GElf_Verdef *verdef = gelf_getverdef (verdef_data, 0,
2680 							&verdef_mem);
2681 		  while (verdef != NULL)
2682 		    {
2683 		      if (verdef->vd_ndx == (*versym & 0x7fff))
2684 			/* Found the definition.  */
2685 			break;
2686 
2687 		      if (verdef_data->d_size - vd_offset < verdef->vd_next)
2688 			break;
2689 
2690 		      vd_offset += verdef->vd_next;
2691 		      verdef = (verdef->vd_next == 0
2692 				? NULL
2693 				: gelf_getverdef (verdef_data, vd_offset,
2694 						  &verdef_mem));
2695 		    }
2696 
2697 		  if (verdef != NULL)
2698 		    {
2699 		      GElf_Verdaux verdaux_mem;
2700 		      GElf_Verdaux *verdaux
2701 			= gelf_getverdaux (verdef_data,
2702 					   vd_offset + verdef->vd_aux,
2703 					   &verdaux_mem);
2704 
2705 		      if (verdaux != NULL)
2706 			printf ((*versym & 0x8000) ? "@%s" : "@@%s",
2707 				elf_strptr (ebl->elf, verdef_stridx,
2708 					    verdaux->vda_name));
2709 		    }
2710 		}
2711 	    }
2712 	}
2713 
2714       putchar_unlocked ('\n');
2715     }
2716 }
2717 
2718 
2719 /* Print version information.  */
2720 static void
print_verinfo(Ebl * ebl)2721 print_verinfo (Ebl *ebl)
2722 {
2723   /* Find the version information sections.  For this we have to
2724      search through the section table.  */
2725   Elf_Scn *scn = NULL;
2726 
2727   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
2728     {
2729       /* Handle the section if it is part of the versioning handling.  */
2730       GElf_Shdr shdr_mem;
2731       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2732 
2733       if (likely (shdr != NULL))
2734 	{
2735 	  if (shdr->sh_type == SHT_GNU_verneed)
2736 	    handle_verneed (ebl, scn, shdr);
2737 	  else if (shdr->sh_type == SHT_GNU_verdef)
2738 	    handle_verdef (ebl, scn, shdr);
2739 	  else if (shdr->sh_type == SHT_GNU_versym)
2740 	    handle_versym (ebl, scn, shdr);
2741 	}
2742     }
2743 }
2744 
2745 
2746 static const char *
get_ver_flags(unsigned int flags)2747 get_ver_flags (unsigned int flags)
2748 {
2749   static char buf[32];
2750   char *endp;
2751 
2752   if (flags == 0)
2753     return _("none");
2754 
2755   if (flags & VER_FLG_BASE)
2756     endp = stpcpy (buf, "BASE ");
2757   else
2758     endp = buf;
2759 
2760   if (flags & VER_FLG_WEAK)
2761     {
2762       if (endp != buf)
2763 	endp = stpcpy (endp, "| ");
2764 
2765       endp = stpcpy (endp, "WEAK ");
2766     }
2767 
2768   if (unlikely (flags & ~(VER_FLG_BASE | VER_FLG_WEAK)))
2769     {
2770       strncpy (endp, _("| <unknown>"), buf + sizeof (buf) - endp);
2771       buf[sizeof (buf) - 1] = '\0';
2772     }
2773 
2774   return buf;
2775 }
2776 
2777 
2778 static void
handle_verneed(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr)2779 handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
2780 {
2781   int class = gelf_getclass (ebl->elf);
2782 
2783   /* Get the data of the section.  */
2784   Elf_Data *data = elf_getdata (scn, NULL);
2785   if (data == NULL)
2786     return;
2787 
2788   /* Get the section header string table index.  */
2789   size_t shstrndx;
2790   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2791     error_exit (0, _("cannot get section header string table index"));
2792 
2793   GElf_Shdr glink_mem;
2794   GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2795 				   &glink_mem);
2796   if (glink == NULL)
2797     error_exit (0, _("invalid sh_link value in section %zu"),
2798 		elf_ndxscn (scn));
2799 
2800   printf (ngettext ("\
2801 \nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
2802 		    "\
2803 \nVersion needs section [%2u] '%s' contains %d entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
2804 		    shdr->sh_info),
2805 	  (unsigned int) elf_ndxscn (scn),
2806 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name), shdr->sh_info,
2807 	  class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
2808 	  shdr->sh_offset,
2809 	  (unsigned int) shdr->sh_link,
2810 	  elf_strptr (ebl->elf, shstrndx, glink->sh_name));
2811 
2812   unsigned int offset = 0;
2813   for (int cnt = shdr->sh_info; --cnt >= 0; )
2814     {
2815       /* Get the data at the next offset.  */
2816       GElf_Verneed needmem;
2817       GElf_Verneed *need = gelf_getverneed (data, offset, &needmem);
2818       if (unlikely (need == NULL))
2819 	break;
2820 
2821       printf (_("  %#06x: Version: %hu  File: %s  Cnt: %hu\n"),
2822 	      offset, (unsigned short int) need->vn_version,
2823 	      elf_strptr (ebl->elf, shdr->sh_link, need->vn_file),
2824 	      (unsigned short int) need->vn_cnt);
2825 
2826       unsigned int auxoffset = offset + need->vn_aux;
2827       for (int cnt2 = need->vn_cnt; --cnt2 >= 0; )
2828 	{
2829 	  GElf_Vernaux auxmem;
2830 	  GElf_Vernaux *aux = gelf_getvernaux (data, auxoffset, &auxmem);
2831 	  if (unlikely (aux == NULL))
2832 	    break;
2833 
2834 	  printf (_("  %#06x: Name: %s  Flags: %s  Version: %hu\n"),
2835 		  auxoffset,
2836 		  elf_strptr (ebl->elf, shdr->sh_link, aux->vna_name),
2837 		  get_ver_flags (aux->vna_flags),
2838 		  (unsigned short int) aux->vna_other);
2839 
2840 	  if (aux->vna_next == 0)
2841 	    break;
2842 
2843 	  auxoffset += aux->vna_next;
2844 	}
2845 
2846       /* Find the next offset.  */
2847       if (need->vn_next == 0)
2848 	break;
2849 
2850       offset += need->vn_next;
2851     }
2852 }
2853 
2854 
2855 static void
handle_verdef(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr)2856 handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
2857 {
2858   /* Get the data of the section.  */
2859   Elf_Data *data = elf_getdata (scn, NULL);
2860   if (data == NULL)
2861     return;
2862 
2863   /* Get the section header string table index.  */
2864   size_t shstrndx;
2865   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2866     error_exit (0, _("cannot get section header string table index"));
2867 
2868   GElf_Shdr glink_mem;
2869   GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2870 				   &glink_mem);
2871   if (glink == NULL)
2872     error_exit (0, _("invalid sh_link value in section %zu"),
2873 		elf_ndxscn (scn));
2874 
2875   int class = gelf_getclass (ebl->elf);
2876   printf (ngettext ("\
2877 \nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
2878 		    "\
2879 \nVersion definition section [%2u] '%s' contains %d entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
2880 		    shdr->sh_info),
2881 	  (unsigned int) elf_ndxscn (scn),
2882 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
2883 	  shdr->sh_info,
2884 	  class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
2885 	  shdr->sh_offset,
2886 	  (unsigned int) shdr->sh_link,
2887 	  elf_strptr (ebl->elf, shstrndx, glink->sh_name));
2888 
2889   unsigned int offset = 0;
2890   for (int cnt = shdr->sh_info; --cnt >= 0; )
2891     {
2892       /* Get the data at the next offset.  */
2893       GElf_Verdef defmem;
2894       GElf_Verdef *def = gelf_getverdef (data, offset, &defmem);
2895       if (unlikely (def == NULL))
2896 	break;
2897 
2898       unsigned int auxoffset = offset + def->vd_aux;
2899       GElf_Verdaux auxmem;
2900       GElf_Verdaux *aux = gelf_getverdaux (data, auxoffset, &auxmem);
2901       if (unlikely (aux == NULL))
2902 	break;
2903 
2904       printf (_("\
2905   %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"),
2906 	      offset, def->vd_version,
2907 	      get_ver_flags (def->vd_flags),
2908 	      def->vd_ndx,
2909 	      def->vd_cnt,
2910 	      elf_strptr (ebl->elf, shdr->sh_link, aux->vda_name));
2911 
2912       auxoffset += aux->vda_next;
2913       for (int cnt2 = 1; cnt2 < def->vd_cnt; ++cnt2)
2914 	{
2915 	  aux = gelf_getverdaux (data, auxoffset, &auxmem);
2916 	  if (unlikely (aux == NULL))
2917 	    break;
2918 
2919 	  printf (_("  %#06x: Parent %d: %s\n"),
2920 		  auxoffset, cnt2,
2921 		  elf_strptr (ebl->elf, shdr->sh_link, aux->vda_name));
2922 
2923 	  if (aux->vda_next == 0)
2924 	    break;
2925 
2926 	  auxoffset += aux->vda_next;
2927 	}
2928 
2929       /* Find the next offset.  */
2930       if (def->vd_next == 0)
2931 	break;
2932       offset += def->vd_next;
2933     }
2934 }
2935 
2936 
2937 static void
handle_versym(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr)2938 handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
2939 {
2940   int class = gelf_getclass (ebl->elf);
2941   const char **vername;
2942   const char **filename;
2943 
2944   /* Get the data of the section.  */
2945   Elf_Data *data = elf_getdata (scn, NULL);
2946   if (data == NULL)
2947     return;
2948 
2949   /* Get the section header string table index.  */
2950   size_t shstrndx;
2951   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
2952     error_exit (0, _("cannot get section header string table index"));
2953 
2954   /* We have to find the version definition section and extract the
2955      version names.  */
2956   Elf_Scn *defscn = NULL;
2957   Elf_Scn *needscn = NULL;
2958 
2959   Elf_Scn *verscn = NULL;
2960   while ((verscn = elf_nextscn (ebl->elf, verscn)) != NULL)
2961     {
2962       GElf_Shdr vershdr_mem;
2963       GElf_Shdr *vershdr = gelf_getshdr (verscn, &vershdr_mem);
2964 
2965       if (likely (vershdr != NULL))
2966 	{
2967 	  if (vershdr->sh_type == SHT_GNU_verdef)
2968 	    defscn = verscn;
2969 	  else if (vershdr->sh_type == SHT_GNU_verneed)
2970 	    needscn = verscn;
2971 	}
2972     }
2973 
2974   size_t nvername;
2975   if (defscn != NULL || needscn != NULL)
2976     {
2977       /* We have a version information (better should have).  Now get
2978 	 the version names.  First find the maximum version number.  */
2979       nvername = 0;
2980       if (defscn != NULL)
2981 	{
2982 	  /* Run through the version definitions and find the highest
2983 	     index.  */
2984 	  unsigned int offset = 0;
2985 	  Elf_Data *defdata;
2986 	  GElf_Shdr defshdrmem;
2987 	  GElf_Shdr *defshdr;
2988 
2989 	  defdata = elf_getdata (defscn, NULL);
2990 	  if (unlikely (defdata == NULL))
2991 	    return;
2992 
2993 	  defshdr = gelf_getshdr (defscn, &defshdrmem);
2994 	  if (unlikely (defshdr == NULL))
2995 	    return;
2996 
2997 	  for (unsigned int cnt = 0; cnt < defshdr->sh_info; ++cnt)
2998 	    {
2999 	      GElf_Verdef defmem;
3000 	      GElf_Verdef *def;
3001 
3002 	      /* Get the data at the next offset.  */
3003 	      def = gelf_getverdef (defdata, offset, &defmem);
3004 	      if (unlikely (def == NULL))
3005 		break;
3006 
3007 	      nvername = MAX (nvername, (size_t) (def->vd_ndx & 0x7fff));
3008 
3009 	      if (def->vd_next == 0)
3010 		break;
3011 	      offset += def->vd_next;
3012 	    }
3013 	}
3014       if (needscn != NULL)
3015 	{
3016 	  unsigned int offset = 0;
3017 	  Elf_Data *needdata;
3018 	  GElf_Shdr needshdrmem;
3019 	  GElf_Shdr *needshdr;
3020 
3021 	  needdata = elf_getdata (needscn, NULL);
3022 	  if (unlikely (needdata == NULL))
3023 	    return;
3024 
3025 	  needshdr = gelf_getshdr (needscn, &needshdrmem);
3026 	  if (unlikely (needshdr == NULL))
3027 	    return;
3028 
3029 	  for (unsigned int cnt = 0; cnt < needshdr->sh_info; ++cnt)
3030 	    {
3031 	      GElf_Verneed needmem;
3032 	      GElf_Verneed *need;
3033 	      unsigned int auxoffset;
3034 	      int cnt2;
3035 
3036 	      /* Get the data at the next offset.  */
3037 	      need = gelf_getverneed (needdata, offset, &needmem);
3038 	      if (unlikely (need == NULL))
3039 		break;
3040 
3041 	      /* Run through the auxiliary entries.  */
3042 	      auxoffset = offset + need->vn_aux;
3043 	      for (cnt2 = need->vn_cnt; --cnt2 >= 0; )
3044 		{
3045 		  GElf_Vernaux auxmem;
3046 		  GElf_Vernaux *aux;
3047 
3048 		  aux = gelf_getvernaux (needdata, auxoffset, &auxmem);
3049 		  if (unlikely (aux == NULL))
3050 		    break;
3051 
3052 		  nvername = MAX (nvername,
3053 				  (size_t) (aux->vna_other & 0x7fff));
3054 
3055 		  if (aux->vna_next == 0)
3056 		    break;
3057 		  auxoffset += aux->vna_next;
3058 		}
3059 
3060 	      if (need->vn_next == 0)
3061 		break;
3062 	      offset += need->vn_next;
3063 	    }
3064 	}
3065 
3066       /* This is the number of versions we know about.  */
3067       ++nvername;
3068 
3069       /* Allocate the array.  */
3070       vername = (const char **) alloca (nvername * sizeof (const char *));
3071       memset(vername, 0, nvername * sizeof (const char *));
3072       filename = (const char **) alloca (nvername * sizeof (const char *));
3073       memset(filename, 0, nvername * sizeof (const char *));
3074 
3075       /* Run through the data structures again and collect the strings.  */
3076       if (defscn != NULL)
3077 	{
3078 	  /* Run through the version definitions and find the highest
3079 	     index.  */
3080 	  unsigned int offset = 0;
3081 	  Elf_Data *defdata;
3082 	  GElf_Shdr defshdrmem;
3083 	  GElf_Shdr *defshdr;
3084 
3085 	  defdata = elf_getdata (defscn, NULL);
3086 	  if (unlikely (defdata == NULL))
3087 	    return;
3088 
3089 	  defshdr = gelf_getshdr (defscn, &defshdrmem);
3090 	  if (unlikely (defshdr == NULL))
3091 	    return;
3092 
3093 	  for (unsigned int cnt = 0; cnt < defshdr->sh_info; ++cnt)
3094 	    {
3095 
3096 	      /* Get the data at the next offset.  */
3097 	      GElf_Verdef defmem;
3098 	      GElf_Verdef *def = gelf_getverdef (defdata, offset, &defmem);
3099 	      if (unlikely (def == NULL))
3100 		break;
3101 
3102 	      GElf_Verdaux auxmem;
3103 	      GElf_Verdaux *aux = gelf_getverdaux (defdata,
3104 						   offset + def->vd_aux,
3105 						   &auxmem);
3106 	      if (unlikely (aux == NULL))
3107 		break;
3108 
3109 	      vername[def->vd_ndx & 0x7fff]
3110 		= elf_strptr (ebl->elf, defshdr->sh_link, aux->vda_name);
3111 	      filename[def->vd_ndx & 0x7fff] = NULL;
3112 
3113 	      if (def->vd_next == 0)
3114 		break;
3115 	      offset += def->vd_next;
3116 	    }
3117 	}
3118       if (needscn != NULL)
3119 	{
3120 	  unsigned int offset = 0;
3121 
3122 	  Elf_Data *needdata = elf_getdata (needscn, NULL);
3123 	  GElf_Shdr needshdrmem;
3124 	  GElf_Shdr *needshdr = gelf_getshdr (needscn, &needshdrmem);
3125 	  if (unlikely (needdata == NULL || needshdr == NULL))
3126 	    return;
3127 
3128 	  for (unsigned int cnt = 0; cnt < needshdr->sh_info; ++cnt)
3129 	    {
3130 	      /* Get the data at the next offset.  */
3131 	      GElf_Verneed needmem;
3132 	      GElf_Verneed *need = gelf_getverneed (needdata, offset,
3133 						    &needmem);
3134 	      if (unlikely (need == NULL))
3135 		break;
3136 
3137 	      /* Run through the auxiliary entries.  */
3138 	      unsigned int auxoffset = offset + need->vn_aux;
3139 	      for (int cnt2 = need->vn_cnt; --cnt2 >= 0; )
3140 		{
3141 		  GElf_Vernaux auxmem;
3142 		  GElf_Vernaux *aux = gelf_getvernaux (needdata, auxoffset,
3143 						       &auxmem);
3144 		  if (unlikely (aux == NULL))
3145 		    break;
3146 
3147 		  vername[aux->vna_other & 0x7fff]
3148 		    = elf_strptr (ebl->elf, needshdr->sh_link, aux->vna_name);
3149 		  filename[aux->vna_other & 0x7fff]
3150 		    = elf_strptr (ebl->elf, needshdr->sh_link, need->vn_file);
3151 
3152 		  if (aux->vna_next == 0)
3153 		    break;
3154 		  auxoffset += aux->vna_next;
3155 		}
3156 
3157 	      if (need->vn_next == 0)
3158 		break;
3159 	      offset += need->vn_next;
3160 	    }
3161 	}
3162     }
3163   else
3164     {
3165       vername = NULL;
3166       nvername = 1;
3167       filename = NULL;
3168     }
3169 
3170   GElf_Shdr glink_mem;
3171   GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
3172 				   &glink_mem);
3173   size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_HALF, 1, EV_CURRENT);
3174   if (glink == NULL)
3175     error_exit (0, _("invalid sh_link value in section %zu"),
3176 		elf_ndxscn (scn));
3177 
3178   /* Print the header.  */
3179   printf (ngettext ("\
3180 \nVersion symbols section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'",
3181 		    "\
3182 \nVersion symbols section [%2u] '%s' contains %d entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'",
3183 		    shdr->sh_size / sh_entsize),
3184 	  (unsigned int) elf_ndxscn (scn),
3185 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
3186 	  (int) (shdr->sh_size / sh_entsize),
3187 	  class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
3188 	  shdr->sh_offset,
3189 	  (unsigned int) shdr->sh_link,
3190 	  elf_strptr (ebl->elf, shstrndx, glink->sh_name));
3191 
3192   /* Now we can finally look at the actual contents of this section.  */
3193   for (unsigned int cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
3194     {
3195       if (cnt % 2 == 0)
3196 	printf ("\n %4d:", cnt);
3197 
3198       GElf_Versym symmem;
3199       GElf_Versym *sym = gelf_getversym (data, cnt, &symmem);
3200       if (sym == NULL)
3201 	break;
3202 
3203       switch (*sym)
3204 	{
3205 	  ssize_t n;
3206 	case 0:
3207 	  fputs_unlocked (_("   0 *local*                     "),
3208 			  stdout);
3209 	  break;
3210 
3211 	case 1:
3212 	  fputs_unlocked (_("   1 *global*                    "),
3213 			  stdout);
3214 	  break;
3215 
3216 	default:
3217 	  n = printf ("%4d%c%s",
3218 		      *sym & 0x7fff, *sym & 0x8000 ? 'h' : ' ',
3219 		      (vername != NULL
3220 		       && (unsigned int) (*sym & 0x7fff) < nvername)
3221 		      ? vername[*sym & 0x7fff] : "???");
3222 	  if ((unsigned int) (*sym & 0x7fff) < nvername
3223 	      && filename != NULL && filename[*sym & 0x7fff] != NULL)
3224 	    n += printf ("(%s)", filename[*sym & 0x7fff]);
3225 	  printf ("%*s", MAX (0, 33 - (int) n), " ");
3226 	  break;
3227 	}
3228     }
3229   putchar_unlocked ('\n');
3230 }
3231 
3232 
3233 static void
print_hash_info(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr,size_t shstrndx,uint_fast32_t maxlength,Elf32_Word nbucket,uint_fast32_t nsyms,uint32_t * lengths,const char * extrastr)3234 print_hash_info (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx,
3235 		 uint_fast32_t maxlength, Elf32_Word nbucket,
3236 		 uint_fast32_t nsyms, uint32_t *lengths, const char *extrastr)
3237 {
3238   uint32_t *counts = xcalloc (maxlength + 1, sizeof (uint32_t));
3239 
3240   for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
3241     ++counts[lengths[cnt]];
3242 
3243   GElf_Shdr glink_mem;
3244   GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf,
3245 					       shdr->sh_link),
3246 				   &glink_mem);
3247   if (glink == NULL)
3248     {
3249       error (0, 0, _("invalid sh_link value in section %zu"),
3250 	     elf_ndxscn (scn));
3251       free (counts);
3252       return;
3253     }
3254 
3255   printf (ngettext ("\
3256 \nHistogram for bucket list length in section [%2u] '%s' (total of %d bucket):\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
3257 		    "\
3258 \nHistogram for bucket list length in section [%2u] '%s' (total of %d buckets):\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
3259 		    nbucket),
3260 	  (unsigned int) elf_ndxscn (scn),
3261 	  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
3262 	  (int) nbucket,
3263 	  gelf_getclass (ebl->elf) == ELFCLASS32 ? 10 : 18,
3264 	  shdr->sh_addr,
3265 	  shdr->sh_offset,
3266 	  (unsigned int) shdr->sh_link,
3267 	  elf_strptr (ebl->elf, shstrndx, glink->sh_name));
3268 
3269   if (extrastr != NULL)
3270     fputs (extrastr, stdout);
3271 
3272   if (likely (nbucket > 0))
3273     {
3274       uint64_t success = 0;
3275 
3276       /* xgettext:no-c-format */
3277       fputs_unlocked (_("\
3278  Length  Number  % of total  Coverage\n"), stdout);
3279       printf (_("      0  %6" PRIu32 "      %5.1f%%\n"),
3280 	      counts[0], (counts[0] * 100.0) / nbucket);
3281 
3282       uint64_t nzero_counts = 0;
3283       for (Elf32_Word cnt = 1; cnt <= maxlength; ++cnt)
3284 	{
3285 	  nzero_counts += counts[cnt] * cnt;
3286 	  printf (_("\
3287 %7d  %6" PRIu32 "      %5.1f%%    %5.1f%%\n"),
3288 		  (int) cnt, counts[cnt], (counts[cnt] * 100.0) / nbucket,
3289 		  (nzero_counts * 100.0) / nsyms);
3290 	}
3291 
3292       Elf32_Word acc = 0;
3293       for (Elf32_Word cnt = 1; cnt <= maxlength; ++cnt)
3294 	{
3295 	  acc += cnt;
3296 	  success += counts[cnt] * acc;
3297 	}
3298 
3299       printf (_("\
3300  Average number of tests:   successful lookup: %f\n\
3301 			  unsuccessful lookup: %f\n"),
3302 	      (double) success / (double) nzero_counts,
3303 	      (double) nzero_counts / (double) nbucket);
3304     }
3305 
3306   free (counts);
3307 }
3308 
3309 
3310 /* This function handles the traditional System V-style hash table format.  */
3311 static void
handle_sysv_hash(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr,size_t shstrndx)3312 handle_sysv_hash (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
3313 {
3314   Elf_Data *data = elf_getdata (scn, NULL);
3315   if (unlikely (data == NULL))
3316     {
3317       error (0, 0, _("cannot get data for section %d: %s"),
3318 	     (int) elf_ndxscn (scn), elf_errmsg (-1));
3319       return;
3320     }
3321 
3322   if (unlikely (data->d_size < 2 * sizeof (Elf32_Word)))
3323     {
3324     invalid_data:
3325       error (0, 0, _("invalid data in sysv.hash section %d"),
3326 	     (int) elf_ndxscn (scn));
3327       return;
3328     }
3329 
3330   Elf32_Word nbucket = ((Elf32_Word *) data->d_buf)[0];
3331   Elf32_Word nchain = ((Elf32_Word *) data->d_buf)[1];
3332 
3333   uint64_t used_buf = (2ULL + nchain + nbucket) * sizeof (Elf32_Word);
3334   if (used_buf > data->d_size)
3335     goto invalid_data;
3336 
3337   Elf32_Word *bucket = &((Elf32_Word *) data->d_buf)[2];
3338   Elf32_Word *chain = &((Elf32_Word *) data->d_buf)[2 + nbucket];
3339 
3340   uint32_t *lengths = xcalloc (nbucket, sizeof (uint32_t));
3341 
3342   uint_fast32_t maxlength = 0;
3343   uint_fast32_t nsyms = 0;
3344   for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
3345     {
3346       Elf32_Word inner = bucket[cnt];
3347       Elf32_Word chain_len = 0;
3348       while (inner > 0 && inner < nchain)
3349 	{
3350 	  ++nsyms;
3351 	  ++chain_len;
3352 	  if (chain_len > nchain)
3353 	    {
3354 	      error (0, 0, _("invalid chain in sysv.hash section %d"),
3355 		     (int) elf_ndxscn (scn));
3356 	      free (lengths);
3357 	      return;
3358 	    }
3359 	  if (maxlength < ++lengths[cnt])
3360 	    ++maxlength;
3361 
3362 	  inner = chain[inner];
3363 	}
3364     }
3365 
3366   print_hash_info (ebl, scn, shdr, shstrndx, maxlength, nbucket, nsyms,
3367 		   lengths, NULL);
3368 
3369   free (lengths);
3370 }
3371 
3372 
3373 /* This function handles the incorrect, System V-style hash table
3374    format some 64-bit architectures use.  */
3375 static void
handle_sysv_hash64(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr,size_t shstrndx)3376 handle_sysv_hash64 (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
3377 {
3378   Elf_Data *data = elf_getdata (scn, NULL);
3379   if (unlikely (data == NULL))
3380     {
3381       error (0, 0, _("cannot get data for section %d: %s"),
3382 	     (int) elf_ndxscn (scn), elf_errmsg (-1));
3383       return;
3384     }
3385 
3386   if (unlikely (data->d_size < 2 * sizeof (Elf64_Xword)))
3387     {
3388     invalid_data:
3389       error (0, 0, _("invalid data in sysv.hash64 section %d"),
3390 	     (int) elf_ndxscn (scn));
3391       return;
3392     }
3393 
3394   Elf64_Xword nbucket = ((Elf64_Xword *) data->d_buf)[0];
3395   Elf64_Xword nchain = ((Elf64_Xword *) data->d_buf)[1];
3396 
3397   uint64_t maxwords = data->d_size / sizeof (Elf64_Xword);
3398   if (maxwords < 2
3399       || maxwords - 2 < nbucket
3400       || maxwords - 2 - nbucket < nchain)
3401     goto invalid_data;
3402 
3403   Elf64_Xword *bucket = &((Elf64_Xword *) data->d_buf)[2];
3404   Elf64_Xword *chain = &((Elf64_Xword *) data->d_buf)[2 + nbucket];
3405 
3406   uint32_t *lengths = xcalloc (nbucket, sizeof (uint32_t));
3407 
3408   uint_fast32_t maxlength = 0;
3409   uint_fast32_t nsyms = 0;
3410   for (Elf64_Xword cnt = 0; cnt < nbucket; ++cnt)
3411     {
3412       Elf64_Xword inner = bucket[cnt];
3413       Elf64_Xword chain_len = 0;
3414       while (inner > 0 && inner < nchain)
3415 	{
3416 	  ++nsyms;
3417 	  ++chain_len;
3418 	  if (chain_len > nchain)
3419 	    {
3420 	      error (0, 0, _("invalid chain in sysv.hash64 section %d"),
3421 		     (int) elf_ndxscn (scn));
3422 	      free (lengths);
3423 	      return;
3424 	    }
3425 	  if (maxlength < ++lengths[cnt])
3426 	    ++maxlength;
3427 
3428 	  inner = chain[inner];
3429 	}
3430     }
3431 
3432   print_hash_info (ebl, scn, shdr, shstrndx, maxlength, nbucket, nsyms,
3433 		   lengths, NULL);
3434 
3435   free (lengths);
3436 }
3437 
3438 
3439 /* This function handles the GNU-style hash table format.  */
3440 static void
handle_gnu_hash(Ebl * ebl,Elf_Scn * scn,GElf_Shdr * shdr,size_t shstrndx)3441 handle_gnu_hash (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
3442 {
3443   uint32_t *lengths = NULL;
3444   Elf_Data *data = elf_getdata (scn, NULL);
3445   if (unlikely (data == NULL))
3446     {
3447       error (0, 0, _("cannot get data for section %d: %s"),
3448 	     (int) elf_ndxscn (scn), elf_errmsg (-1));
3449       return;
3450     }
3451 
3452   if (unlikely (data->d_size < 4 * sizeof (Elf32_Word)))
3453     {
3454     invalid_data:
3455       free (lengths);
3456       error (0, 0, _("invalid data in gnu.hash section %d"),
3457 	     (int) elf_ndxscn (scn));
3458       return;
3459     }
3460 
3461   Elf32_Word nbucket = ((Elf32_Word *) data->d_buf)[0];
3462   Elf32_Word symbias = ((Elf32_Word *) data->d_buf)[1];
3463 
3464   /* Next comes the size of the bitmap.  It's measured in words for
3465      the architecture.  It's 32 bits for 32 bit archs, and 64 bits for
3466      64 bit archs.  There is always a bloom filter present, so zero is
3467      an invalid value.  */
3468   Elf32_Word bitmask_words = ((Elf32_Word *) data->d_buf)[2];
3469   if (gelf_getclass (ebl->elf) == ELFCLASS64)
3470     bitmask_words *= 2;
3471 
3472   if (bitmask_words == 0)
3473     goto invalid_data;
3474 
3475   Elf32_Word shift = ((Elf32_Word *) data->d_buf)[3];
3476 
3477   /* Is there still room for the sym chain?
3478      Use uint64_t calculation to prevent 32bit overflow.  */
3479   uint64_t used_buf = (4ULL + bitmask_words + nbucket) * sizeof (Elf32_Word);
3480   uint32_t max_nsyms = (data->d_size - used_buf) / sizeof (Elf32_Word);
3481   if (used_buf > data->d_size)
3482     goto invalid_data;
3483 
3484   lengths = xcalloc (nbucket, sizeof (uint32_t));
3485 
3486   Elf32_Word *bitmask = &((Elf32_Word *) data->d_buf)[4];
3487   Elf32_Word *bucket = &((Elf32_Word *) data->d_buf)[4 + bitmask_words];
3488   Elf32_Word *chain = &((Elf32_Word *) data->d_buf)[4 + bitmask_words
3489 						    + nbucket];
3490 
3491   /* Compute distribution of chain lengths.  */
3492   uint_fast32_t maxlength = 0;
3493   uint_fast32_t nsyms = 0;
3494   for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
3495     if (bucket[cnt] != 0)
3496       {
3497 	Elf32_Word inner = bucket[cnt] - symbias;
3498 	do
3499 	  {
3500 	    ++nsyms;
3501 	    if (maxlength < ++lengths[cnt])
3502 	      ++maxlength;
3503 	    if (inner >= max_nsyms)
3504 	      goto invalid_data;
3505 	  }
3506 	while ((chain[inner++] & 1) == 0);
3507       }
3508 
3509   /* Count bits in bitmask.  */
3510   uint_fast32_t nbits = 0;
3511   for (Elf32_Word cnt = 0; cnt < bitmask_words; ++cnt)
3512     {
3513       uint_fast32_t word = bitmask[cnt];
3514 
3515       word = (word & 0x55555555) + ((word >> 1) & 0x55555555);
3516       word = (word & 0x33333333) + ((word >> 2) & 0x33333333);
3517       word = (word & 0x0f0f0f0f) + ((word >> 4) & 0x0f0f0f0f);
3518       word = (word & 0x00ff00ff) + ((word >> 8) & 0x00ff00ff);
3519       nbits += (word & 0x0000ffff) + ((word >> 16) & 0x0000ffff);
3520     }
3521 
3522   char *str = xasprintf (_("\
3523  Symbol Bias: %u\n\
3524  Bitmask Size: %zu bytes  %" PRIuFAST32 "%% bits set  2nd hash shift: %u\n"),
3525 			 (unsigned int) symbias,
3526 			 bitmask_words * sizeof (Elf32_Word),
3527 			 ((nbits * 100 + 50)
3528 			  / (uint_fast32_t) (bitmask_words
3529 					      * sizeof (Elf32_Word) * 8)),
3530 			  (unsigned int) shift);
3531 
3532   print_hash_info (ebl, scn, shdr, shstrndx, maxlength, nbucket, nsyms,
3533 		   lengths, str);
3534 
3535   free (str);
3536   free (lengths);
3537 }
3538 
3539 
3540 /* Find the symbol table(s).  For this we have to search through the
3541    section table.  */
3542 static void
handle_hash(Ebl * ebl)3543 handle_hash (Ebl *ebl)
3544 {
3545   /* Get the section header string table index.  */
3546   size_t shstrndx;
3547   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
3548     error_exit (0, _("cannot get section header string table index"));
3549 
3550   Elf_Scn *scn = NULL;
3551   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
3552     {
3553       /* Handle the section if it is a symbol table.  */
3554       GElf_Shdr shdr_mem;
3555       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
3556 
3557       if (likely (shdr != NULL))
3558 	{
3559 	  if ((shdr->sh_type == SHT_HASH || shdr->sh_type == SHT_GNU_HASH)
3560 	      && (shdr->sh_flags & SHF_COMPRESSED) != 0)
3561 	    {
3562 	      if (elf_compress (scn, 0, 0) < 0)
3563 		printf ("WARNING: %s [%zd]\n",
3564 			_("Couldn't uncompress section"),
3565 			elf_ndxscn (scn));
3566 	      shdr = gelf_getshdr (scn, &shdr_mem);
3567 	      if (unlikely (shdr == NULL))
3568 		error_exit (0, _("cannot get section [%zd] header: %s"),
3569 			    elf_ndxscn (scn), elf_errmsg (-1));
3570 	    }
3571 
3572 	  if (shdr->sh_type == SHT_HASH)
3573 	    {
3574 	      if (ebl_sysvhash_entrysize (ebl) == sizeof (Elf64_Xword))
3575 		handle_sysv_hash64 (ebl, scn, shdr, shstrndx);
3576 	      else
3577 		handle_sysv_hash (ebl, scn, shdr, shstrndx);
3578 	    }
3579 	  else if (shdr->sh_type == SHT_GNU_HASH)
3580 	    handle_gnu_hash (ebl, scn, shdr, shstrndx);
3581 	}
3582     }
3583 }
3584 
3585 
3586 static void
print_liblist(Ebl * ebl)3587 print_liblist (Ebl *ebl)
3588 {
3589   /* Find the library list sections.  For this we have to search
3590      through the section table.  */
3591   Elf_Scn *scn = NULL;
3592 
3593   /* Get the section header string table index.  */
3594   size_t shstrndx;
3595   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
3596     error_exit (0, _("cannot get section header string table index"));
3597 
3598   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
3599     {
3600       GElf_Shdr shdr_mem;
3601       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
3602 
3603       if (shdr != NULL && shdr->sh_type == SHT_GNU_LIBLIST)
3604 	{
3605 	  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_LIB, 1, EV_CURRENT);
3606 	  int nentries = shdr->sh_size / sh_entsize;
3607 	  printf (ngettext ("\
3608 \nLibrary list section [%2zu] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
3609 			    "\
3610 \nLibrary list section [%2zu] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
3611 			    nentries),
3612 		  elf_ndxscn (scn),
3613 		  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
3614 		  shdr->sh_offset,
3615 		  nentries);
3616 
3617 	  Elf_Data *data = elf_getdata (scn, NULL);
3618 	  if (data == NULL)
3619 	    return;
3620 
3621 	  puts (_("\
3622        Library                       Time Stamp          Checksum Version Flags"));
3623 
3624 	  for (int cnt = 0; cnt < nentries; ++cnt)
3625 	    {
3626 	      GElf_Lib lib_mem;
3627 	      GElf_Lib *lib = gelf_getlib (data, cnt, &lib_mem);
3628 	      if (unlikely (lib == NULL))
3629 		continue;
3630 
3631 	      time_t t = (time_t) lib->l_time_stamp;
3632 	      struct tm *tm = gmtime (&t);
3633 	      if (unlikely (tm == NULL))
3634 		continue;
3635 
3636 	      printf ("  [%2d] %-29s %04u-%02u-%02uT%02u:%02u:%02u %08x %-7u %u\n",
3637 		      cnt, elf_strptr (ebl->elf, shdr->sh_link, lib->l_name),
3638 		      tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
3639 		      tm->tm_hour, tm->tm_min, tm->tm_sec,
3640 		      (unsigned int) lib->l_checksum,
3641 		      (unsigned int) lib->l_version,
3642 		      (unsigned int) lib->l_flags);
3643 	    }
3644 	}
3645     }
3646 }
3647 
3648 static inline size_t
left(Elf_Data * data,const unsigned char * p)3649 left (Elf_Data *data,
3650       const unsigned char *p)
3651 {
3652   return (const unsigned char *) data->d_buf + data->d_size - p;
3653 }
3654 
3655 static void
print_attributes(Ebl * ebl,const GElf_Ehdr * ehdr)3656 print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr)
3657 {
3658   /* Find the object attributes sections.  For this we have to search
3659      through the section table.  */
3660   Elf_Scn *scn = NULL;
3661 
3662   /* Get the section header string table index.  */
3663   size_t shstrndx;
3664   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
3665     error_exit (0, _("cannot get section header string table index"));
3666 
3667   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
3668     {
3669       GElf_Shdr shdr_mem;
3670       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
3671 
3672       if (shdr == NULL || (shdr->sh_type != SHT_GNU_ATTRIBUTES
3673 			   && (shdr->sh_type != SHT_ARM_ATTRIBUTES
3674 			       || ehdr->e_machine != EM_ARM)
3675 			   && (shdr->sh_type != SHT_CSKY_ATTRIBUTES
3676 			       || ehdr->e_machine != EM_CSKY)
3677 			   && (shdr->sh_type != SHT_RISCV_ATTRIBUTES
3678 			       || ehdr->e_machine != EM_RISCV)))
3679 	continue;
3680 
3681       printf (_("\
3682 \nObject attributes section [%2zu] '%s' of %" PRIu64
3683 		       " bytes at offset %#0" PRIx64 ":\n"),
3684 	      elf_ndxscn (scn),
3685 	      elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
3686 	      shdr->sh_size, shdr->sh_offset);
3687 
3688       Elf_Data *data = elf_rawdata (scn, NULL);
3689       if (unlikely (data == NULL || data->d_size == 0))
3690 	return;
3691 
3692       const unsigned char *p = data->d_buf;
3693 
3694       /* There is only one 'version', A.  */
3695       if (unlikely (*p++ != 'A'))
3696 	return;
3697 
3698       fputs_unlocked (_("  Owner          Size\n"), stdout);
3699 
3700       /* Loop over the sections.  */
3701       while (left (data, p) >= 4)
3702 	{
3703 	  /* Section length.  */
3704 	  uint32_t len;
3705 	  memcpy (&len, p, sizeof len);
3706 
3707 	  if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
3708 	    CONVERT (len);
3709 
3710 	  if (unlikely (len > left (data, p)))
3711 	    break;
3712 
3713 	  /* Section vendor name.  */
3714 	  const unsigned char *name = p + sizeof len;
3715 	  p += len;
3716 
3717 	  unsigned const char *q = memchr (name, '\0', len);
3718 	  if (unlikely (q == NULL))
3719 	    break;
3720 	  ++q;
3721 
3722 	  printf (_("  %-13s  %4" PRIu32 "\n"), name, len);
3723 
3724 	  bool gnu_vendor = (q - name == sizeof "gnu"
3725 			     && !memcmp (name, "gnu", sizeof "gnu"));
3726 
3727 	  /* Loop over subsections.  */
3728 	  if (shdr->sh_type != SHT_GNU_ATTRIBUTES
3729 	      || gnu_vendor)
3730 	    while (q < p)
3731 	      {
3732 		const unsigned char *const sub = q;
3733 
3734 		unsigned int subsection_tag;
3735 		get_uleb128 (subsection_tag, q, p);
3736 		if (unlikely (q >= p))
3737 		  break;
3738 
3739 		uint32_t subsection_len;
3740 		if (unlikely (p - sub < (ptrdiff_t) sizeof subsection_len))
3741 		  break;
3742 
3743 		memcpy (&subsection_len, q, sizeof subsection_len);
3744 
3745 		if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
3746 		  CONVERT (subsection_len);
3747 
3748 		/* Don't overflow, ptrdiff_t might be 32bits, but signed.  */
3749 		if (unlikely (subsection_len == 0
3750 			      || subsection_len >= (uint32_t) PTRDIFF_MAX
3751 			      || p - sub < (ptrdiff_t) subsection_len))
3752 		  break;
3753 
3754 		const unsigned char *r = q + sizeof subsection_len;
3755 		q = sub + subsection_len;
3756 
3757 		switch (subsection_tag)
3758 		  {
3759 		  default:
3760 		    /* Unknown subsection, print and skip.  */
3761 		    printf (_("    %-4u %12" PRIu32 "\n"),
3762 			    subsection_tag, subsection_len);
3763 		    break;
3764 
3765 		  case 1:	/* Tag_File */
3766 		    printf (_("    File: %11" PRIu32 "\n"),
3767 			    subsection_len);
3768 
3769 		    while (r < q)
3770 		      {
3771 			unsigned int tag;
3772 			get_uleb128 (tag, r, q);
3773 			if (unlikely (r >= q))
3774 			  break;
3775 
3776 			/* GNU style tags have either a uleb128 value,
3777 			   when lowest bit is not set, or a string
3778 			   when the lowest bit is set.
3779 			   "compatibility" (32) is special.  It has
3780 			   both a string and a uleb128 value.  For
3781 			   non-gnu we assume 6 till 31 only take ints.
3782 			   XXX see arm backend, do we need a separate
3783 			   hook?  */
3784 			uint64_t value = 0;
3785 			const char *string = NULL;
3786 			if (tag == 32 || (tag & 1) == 0
3787 			    || (! gnu_vendor && (tag > 5 && tag < 32)))
3788 			  {
3789 			    get_uleb128 (value, r, q);
3790 			    if (r > q)
3791 			      break;
3792 			  }
3793 			if (tag == 32
3794 			    || ((tag & 1) != 0
3795 				&& (gnu_vendor
3796 				    || (! gnu_vendor && tag > 32)))
3797 			    || (! gnu_vendor && tag > 3 && tag < 6))
3798 			  {
3799 			    string = (const char *) r;
3800 			    r = memchr (r, '\0', q - r);
3801 			    if (r == NULL)
3802 			      break;
3803 			    ++r;
3804 			  }
3805 
3806 			const char *tag_name = NULL;
3807 			const char *value_name = NULL;
3808 			ebl_check_object_attribute (ebl, (const char *) name,
3809 						    tag, value,
3810 						    &tag_name, &value_name);
3811 
3812 			if (tag_name != NULL)
3813 			  {
3814 			    if (tag == 32)
3815 			      printf (_("      %s: %" PRId64 ", %s\n"),
3816 				      tag_name, value, string);
3817 			    else if (string == NULL && value_name == NULL)
3818 			      printf (_("      %s: %" PRId64 "\n"),
3819 				      tag_name, value);
3820 			    else
3821 			      printf (_("      %s: %s\n"),
3822 				      tag_name, string ?: value_name);
3823 			  }
3824 			else
3825 			  {
3826 			    /* For "gnu" vendor 32 "compatibility" has
3827 			       already been handled above.  */
3828 			    assert (tag != 32
3829 				    || strcmp ((const char *) name, "gnu"));
3830 			    if (string == NULL)
3831 			      printf (_("      %u: %" PRId64 "\n"),
3832 				      tag, value);
3833 			    else
3834 			      printf (_("      %u: %s\n"),
3835 				      tag, string);
3836 			  }
3837 		      }
3838 		  }
3839 	      }
3840 	}
3841     }
3842 }
3843 
3844 
3845 void
print_dwarf_addr(Dwfl_Module * dwflmod,int address_size,Dwarf_Addr address,Dwarf_Addr raw)3846 print_dwarf_addr (Dwfl_Module *dwflmod,
3847 		  int address_size, Dwarf_Addr address, Dwarf_Addr raw)
3848 {
3849   /* See if there is a name we can give for this address.  */
3850   GElf_Sym sym;
3851   GElf_Off off = 0;
3852   const char *name = (print_address_names && ! print_unresolved_addresses)
3853     ? dwfl_module_addrinfo (dwflmod, address, &off, &sym, NULL, NULL, NULL)
3854     : NULL;
3855 
3856   const char *scn;
3857   if (print_unresolved_addresses)
3858     {
3859       address = raw;
3860       scn = NULL;
3861     }
3862   else
3863     {
3864       /* Relativize the address.  */
3865       int n = dwfl_module_relocations (dwflmod);
3866       int i = n < 1 ? -1 : dwfl_module_relocate_address (dwflmod, &address);
3867 
3868       /* In an ET_REL file there is a section name to refer to.  */
3869       scn = (i < 0 ? NULL
3870 	     : dwfl_module_relocation_info (dwflmod, i, NULL));
3871     }
3872 
3873   if ((name != NULL
3874        ? (off != 0
3875 	  ? (scn != NULL
3876 	     ? (address_size == 0
3877 		? printf ("%s+%#" PRIx64 " <%s+%#" PRIx64 ">",
3878 			  scn, address, name, off)
3879 		: printf ("%s+%#0*" PRIx64 " <%s+%#" PRIx64 ">",
3880 			  scn, 2 + address_size * 2, address,
3881 			  name, off))
3882 	     : (address_size == 0
3883 		? printf ("%#" PRIx64 " <%s+%#" PRIx64 ">",
3884 			  address, name, off)
3885 		: printf ("%#0*" PRIx64 " <%s+%#" PRIx64 ">",
3886 			  2 + address_size * 2, address,
3887 			  name, off)))
3888 	  : (scn != NULL
3889 	     ? (address_size == 0
3890 		? printf ("%s+%#" PRIx64 " <%s>", scn, address, name)
3891 		: printf ("%s+%#0*" PRIx64 " <%s>",
3892 			   scn, 2 + address_size * 2, address, name))
3893 	     : (address_size == 0
3894 		? printf ("%#" PRIx64 " <%s>", address, name)
3895 		: printf ("%#0*" PRIx64 " <%s>",
3896 			  2 + address_size * 2, address, name))))
3897        : (scn != NULL
3898 	  ? (address_size == 0
3899 	     ? printf ("%s+%#" PRIx64, scn, address)
3900 	     : printf ("%s+%#0*" PRIx64, scn, 2 + address_size * 2, address))
3901 	  : (address_size == 0
3902 	     ? printf ("%#" PRIx64, address)
3903 	     : printf ("%#0*" PRIx64, 2 + address_size * 2, address)))) < 0)
3904     error_exit (0, _("sprintf failure"));
3905 }
3906 
3907 
3908 static const char *
dwarf_tag_string(unsigned int tag)3909 dwarf_tag_string (unsigned int tag)
3910 {
3911   switch (tag)
3912     {
3913 #define DWARF_ONE_KNOWN_DW_TAG(NAME, CODE) case CODE: return #NAME;
3914       DWARF_ALL_KNOWN_DW_TAG
3915 #undef DWARF_ONE_KNOWN_DW_TAG
3916     default:
3917       return NULL;
3918     }
3919 }
3920 
3921 
3922 static const char *
dwarf_attr_string(unsigned int attrnum)3923 dwarf_attr_string (unsigned int attrnum)
3924 {
3925   switch (attrnum)
3926     {
3927 #define DWARF_ONE_KNOWN_DW_AT(NAME, CODE) case CODE: return #NAME;
3928       DWARF_ALL_KNOWN_DW_AT
3929 #undef DWARF_ONE_KNOWN_DW_AT
3930     default:
3931       return NULL;
3932     }
3933 }
3934 
3935 
3936 static const char *
dwarf_form_string(unsigned int form)3937 dwarf_form_string (unsigned int form)
3938 {
3939   switch (form)
3940     {
3941 #define DWARF_ONE_KNOWN_DW_FORM(NAME, CODE) case CODE: return #NAME;
3942       DWARF_ALL_KNOWN_DW_FORM
3943 #undef DWARF_ONE_KNOWN_DW_FORM
3944     default:
3945       return NULL;
3946     }
3947 }
3948 
3949 
3950 static const char *
dwarf_lang_string(unsigned int lang)3951 dwarf_lang_string (unsigned int lang)
3952 {
3953   switch (lang)
3954     {
3955 #define DWARF_ONE_KNOWN_DW_LANG(NAME, CODE) case CODE: return #NAME;
3956       DWARF_ALL_KNOWN_DW_LANG
3957 #undef DWARF_ONE_KNOWN_DW_LANG
3958     default:
3959       return NULL;
3960     }
3961 }
3962 
3963 
3964 static const char *
dwarf_inline_string(unsigned int code)3965 dwarf_inline_string (unsigned int code)
3966 {
3967   static const char *const known[] =
3968     {
3969 #define DWARF_ONE_KNOWN_DW_INL(NAME, CODE) [CODE] = #NAME,
3970       DWARF_ALL_KNOWN_DW_INL
3971 #undef DWARF_ONE_KNOWN_DW_INL
3972     };
3973 
3974   if (likely (code < sizeof (known) / sizeof (known[0])))
3975     return known[code];
3976 
3977   return NULL;
3978 }
3979 
3980 
3981 static const char *
dwarf_encoding_string(unsigned int code)3982 dwarf_encoding_string (unsigned int code)
3983 {
3984   static const char *const known[] =
3985     {
3986 #define DWARF_ONE_KNOWN_DW_ATE(NAME, CODE) [CODE] = #NAME,
3987       DWARF_ALL_KNOWN_DW_ATE
3988 #undef DWARF_ONE_KNOWN_DW_ATE
3989     };
3990 
3991   if (likely (code < sizeof (known) / sizeof (known[0])))
3992     return known[code];
3993 
3994   return NULL;
3995 }
3996 
3997 
3998 static const char *
dwarf_access_string(unsigned int code)3999 dwarf_access_string (unsigned int code)
4000 {
4001   static const char *const known[] =
4002     {
4003 #define DWARF_ONE_KNOWN_DW_ACCESS(NAME, CODE) [CODE] = #NAME,
4004       DWARF_ALL_KNOWN_DW_ACCESS
4005 #undef DWARF_ONE_KNOWN_DW_ACCESS
4006     };
4007 
4008   if (likely (code < sizeof (known) / sizeof (known[0])))
4009     return known[code];
4010 
4011   return NULL;
4012 }
4013 
4014 
4015 static const char *
dwarf_defaulted_string(unsigned int code)4016 dwarf_defaulted_string (unsigned int code)
4017 {
4018   static const char *const known[] =
4019     {
4020 #define DWARF_ONE_KNOWN_DW_DEFAULTED(NAME, CODE) [CODE] = #NAME,
4021       DWARF_ALL_KNOWN_DW_DEFAULTED
4022 #undef DWARF_ONE_KNOWN_DW_DEFAULTED
4023     };
4024 
4025   if (likely (code < sizeof (known) / sizeof (known[0])))
4026     return known[code];
4027 
4028   return NULL;
4029 }
4030 
4031 
4032 static const char *
dwarf_visibility_string(unsigned int code)4033 dwarf_visibility_string (unsigned int code)
4034 {
4035   static const char *const known[] =
4036     {
4037 #define DWARF_ONE_KNOWN_DW_VIS(NAME, CODE) [CODE] = #NAME,
4038       DWARF_ALL_KNOWN_DW_VIS
4039 #undef DWARF_ONE_KNOWN_DW_VIS
4040     };
4041 
4042   if (likely (code < sizeof (known) / sizeof (known[0])))
4043     return known[code];
4044 
4045   return NULL;
4046 }
4047 
4048 
4049 static const char *
dwarf_virtuality_string(unsigned int code)4050 dwarf_virtuality_string (unsigned int code)
4051 {
4052   static const char *const known[] =
4053     {
4054 #define DWARF_ONE_KNOWN_DW_VIRTUALITY(NAME, CODE) [CODE] = #NAME,
4055       DWARF_ALL_KNOWN_DW_VIRTUALITY
4056 #undef DWARF_ONE_KNOWN_DW_VIRTUALITY
4057     };
4058 
4059   if (likely (code < sizeof (known) / sizeof (known[0])))
4060     return known[code];
4061 
4062   return NULL;
4063 }
4064 
4065 
4066 static const char *
dwarf_identifier_case_string(unsigned int code)4067 dwarf_identifier_case_string (unsigned int code)
4068 {
4069   static const char *const known[] =
4070     {
4071 #define DWARF_ONE_KNOWN_DW_ID(NAME, CODE) [CODE] = #NAME,
4072       DWARF_ALL_KNOWN_DW_ID
4073 #undef DWARF_ONE_KNOWN_DW_ID
4074     };
4075 
4076   if (likely (code < sizeof (known) / sizeof (known[0])))
4077     return known[code];
4078 
4079   return NULL;
4080 }
4081 
4082 
4083 static const char *
dwarf_calling_convention_string(unsigned int code)4084 dwarf_calling_convention_string (unsigned int code)
4085 {
4086   static const char *const known[] =
4087     {
4088 #define DWARF_ONE_KNOWN_DW_CC(NAME, CODE) [CODE] = #NAME,
4089       DWARF_ALL_KNOWN_DW_CC
4090 #undef DWARF_ONE_KNOWN_DW_CC
4091     };
4092 
4093   if (likely (code < sizeof (known) / sizeof (known[0])))
4094     return known[code];
4095 
4096   return NULL;
4097 }
4098 
4099 
4100 static const char *
dwarf_ordering_string(unsigned int code)4101 dwarf_ordering_string (unsigned int code)
4102 {
4103   static const char *const known[] =
4104     {
4105 #define DWARF_ONE_KNOWN_DW_ORD(NAME, CODE) [CODE] = #NAME,
4106       DWARF_ALL_KNOWN_DW_ORD
4107 #undef DWARF_ONE_KNOWN_DW_ORD
4108     };
4109 
4110   if (likely (code < sizeof (known) / sizeof (known[0])))
4111     return known[code];
4112 
4113   return NULL;
4114 }
4115 
4116 
4117 static const char *
dwarf_discr_list_string(unsigned int code)4118 dwarf_discr_list_string (unsigned int code)
4119 {
4120   static const char *const known[] =
4121     {
4122 #define DWARF_ONE_KNOWN_DW_DSC(NAME, CODE) [CODE] = #NAME,
4123       DWARF_ALL_KNOWN_DW_DSC
4124 #undef DWARF_ONE_KNOWN_DW_DSC
4125     };
4126 
4127   if (likely (code < sizeof (known) / sizeof (known[0])))
4128     return known[code];
4129 
4130   return NULL;
4131 }
4132 
4133 
4134 static const char *
dwarf_locexpr_opcode_string(unsigned int code)4135 dwarf_locexpr_opcode_string (unsigned int code)
4136 {
4137   static const char *const known[] =
4138     {
4139       /* Normally we can't afford building huge table of 64K entries,
4140 	 most of them zero, just because there are a couple defined
4141 	 values at the far end.  In case of opcodes, it's OK.  */
4142 #define DWARF_ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME,
4143       DWARF_ALL_KNOWN_DW_OP
4144 #undef DWARF_ONE_KNOWN_DW_OP
4145     };
4146 
4147   if (likely (code < sizeof (known) / sizeof (known[0])))
4148     return known[code];
4149 
4150   return NULL;
4151 }
4152 
4153 
4154 static const char *
dwarf_unit_string(unsigned int type)4155 dwarf_unit_string (unsigned int type)
4156 {
4157   switch (type)
4158     {
4159 #define DWARF_ONE_KNOWN_DW_UT(NAME, CODE) case CODE: return #NAME;
4160       DWARF_ALL_KNOWN_DW_UT
4161 #undef DWARF_ONE_KNOWN_DW_UT
4162     default:
4163       return NULL;
4164     }
4165 }
4166 
4167 
4168 static const char *
dwarf_range_list_encoding_string(unsigned int kind)4169 dwarf_range_list_encoding_string (unsigned int kind)
4170 {
4171   switch (kind)
4172     {
4173 #define DWARF_ONE_KNOWN_DW_RLE(NAME, CODE) case CODE: return #NAME;
4174       DWARF_ALL_KNOWN_DW_RLE
4175 #undef DWARF_ONE_KNOWN_DW_RLE
4176     default:
4177       return NULL;
4178     }
4179 }
4180 
4181 
4182 static const char *
dwarf_loc_list_encoding_string(unsigned int kind)4183 dwarf_loc_list_encoding_string (unsigned int kind)
4184 {
4185   switch (kind)
4186     {
4187 #define DWARF_ONE_KNOWN_DW_LLE(NAME, CODE) case CODE: return #NAME;
4188       DWARF_ALL_KNOWN_DW_LLE
4189 #undef DWARF_ONE_KNOWN_DW_LLE
4190     /* DW_LLE_GNU_view_pair is special/incompatible with default codes.  */
4191     case DW_LLE_GNU_view_pair: return "GNU_view_pair";
4192     default:
4193       return NULL;
4194     }
4195 }
4196 
4197 
4198 static const char *
dwarf_line_content_description_string(unsigned int kind)4199 dwarf_line_content_description_string (unsigned int kind)
4200 {
4201   switch (kind)
4202     {
4203 #define DWARF_ONE_KNOWN_DW_LNCT(NAME, CODE) case CODE: return #NAME;
4204       DWARF_ALL_KNOWN_DW_LNCT
4205 #undef DWARF_ONE_KNOWN_DW_LNCT
4206     default:
4207       return NULL;
4208     }
4209 }
4210 
4211 
4212 /* Used by all dwarf_foo_name functions.  */
4213 static const char *
string_or_unknown(const char * known,unsigned int code,unsigned int lo_user,unsigned int hi_user,bool print_unknown_num)4214 string_or_unknown (const char *known, unsigned int code,
4215                    unsigned int lo_user, unsigned int hi_user,
4216 		   bool print_unknown_num)
4217 {
4218   static char unknown_buf[20];
4219 
4220   if (likely (known != NULL))
4221     return known;
4222 
4223   if (lo_user != 0 && code >= lo_user && code <= hi_user)
4224     {
4225       snprintf (unknown_buf, sizeof unknown_buf, "lo_user+%#x",
4226 		code - lo_user);
4227       return unknown_buf;
4228     }
4229 
4230   if (print_unknown_num)
4231     {
4232       snprintf (unknown_buf, sizeof unknown_buf, "??? (%#x)", code);
4233       return unknown_buf;
4234     }
4235 
4236   return "???";
4237 }
4238 
4239 
4240 static const char *
dwarf_tag_name(unsigned int tag)4241 dwarf_tag_name (unsigned int tag)
4242 {
4243   const char *ret = dwarf_tag_string (tag);
4244   return string_or_unknown (ret, tag, DW_TAG_lo_user, DW_TAG_hi_user, true);
4245 }
4246 
4247 static const char *
dwarf_attr_name(unsigned int attr)4248 dwarf_attr_name (unsigned int attr)
4249 {
4250   const char *ret = dwarf_attr_string (attr);
4251   return string_or_unknown (ret, attr, DW_AT_lo_user, DW_AT_hi_user, true);
4252 }
4253 
4254 
4255 static const char *
dwarf_form_name(unsigned int form)4256 dwarf_form_name (unsigned int form)
4257 {
4258   const char *ret = dwarf_form_string (form);
4259   return string_or_unknown (ret, form, 0, 0, true);
4260 }
4261 
4262 
4263 static const char *
dwarf_lang_name(unsigned int lang)4264 dwarf_lang_name (unsigned int lang)
4265 {
4266   const char *ret = dwarf_lang_string (lang);
4267   return string_or_unknown (ret, lang, DW_LANG_lo_user, DW_LANG_hi_user, false);
4268 }
4269 
4270 
4271 static const char *
dwarf_inline_name(unsigned int code)4272 dwarf_inline_name (unsigned int code)
4273 {
4274   const char *ret = dwarf_inline_string (code);
4275   return string_or_unknown (ret, code, 0, 0, false);
4276 }
4277 
4278 
4279 static const char *
dwarf_encoding_name(unsigned int code)4280 dwarf_encoding_name (unsigned int code)
4281 {
4282   const char *ret = dwarf_encoding_string (code);
4283   return string_or_unknown (ret, code, DW_ATE_lo_user, DW_ATE_hi_user, false);
4284 }
4285 
4286 
4287 static const char *
dwarf_access_name(unsigned int code)4288 dwarf_access_name (unsigned int code)
4289 {
4290   const char *ret = dwarf_access_string (code);
4291   return string_or_unknown (ret, code, 0, 0, false);
4292 }
4293 
4294 
4295 static const char *
dwarf_defaulted_name(unsigned int code)4296 dwarf_defaulted_name (unsigned int code)
4297 {
4298   const char *ret = dwarf_defaulted_string (code);
4299   return string_or_unknown (ret, code, 0, 0, false);
4300 }
4301 
4302 
4303 static const char *
dwarf_visibility_name(unsigned int code)4304 dwarf_visibility_name (unsigned int code)
4305 {
4306   const char *ret = dwarf_visibility_string (code);
4307   return string_or_unknown (ret, code, 0, 0, false);
4308 }
4309 
4310 
4311 static const char *
dwarf_virtuality_name(unsigned int code)4312 dwarf_virtuality_name (unsigned int code)
4313 {
4314   const char *ret = dwarf_virtuality_string (code);
4315   return string_or_unknown (ret, code, 0, 0, false);
4316 }
4317 
4318 
4319 static const char *
dwarf_identifier_case_name(unsigned int code)4320 dwarf_identifier_case_name (unsigned int code)
4321 {
4322   const char *ret = dwarf_identifier_case_string (code);
4323   return string_or_unknown (ret, code, 0, 0, false);
4324 }
4325 
4326 
4327 static const char *
dwarf_calling_convention_name(unsigned int code)4328 dwarf_calling_convention_name (unsigned int code)
4329 {
4330   const char *ret = dwarf_calling_convention_string (code);
4331   return string_or_unknown (ret, code, DW_CC_lo_user, DW_CC_hi_user, false);
4332 }
4333 
4334 
4335 static const char *
dwarf_ordering_name(unsigned int code)4336 dwarf_ordering_name (unsigned int code)
4337 {
4338   const char *ret = dwarf_ordering_string (code);
4339   return string_or_unknown (ret, code, 0, 0, false);
4340 }
4341 
4342 
4343 static const char *
dwarf_discr_list_name(unsigned int code)4344 dwarf_discr_list_name (unsigned int code)
4345 {
4346   const char *ret = dwarf_discr_list_string (code);
4347   return string_or_unknown (ret, code, 0, 0, false);
4348 }
4349 
4350 
4351 static const char *
dwarf_unit_name(unsigned int type)4352 dwarf_unit_name (unsigned int type)
4353 {
4354   const char *ret = dwarf_unit_string (type);
4355   return string_or_unknown (ret, type, DW_UT_lo_user, DW_UT_hi_user, true);
4356 }
4357 
4358 
4359 static const char *
dwarf_range_list_encoding_name(unsigned int kind)4360 dwarf_range_list_encoding_name (unsigned int kind)
4361 {
4362   const char *ret = dwarf_range_list_encoding_string (kind);
4363   return string_or_unknown (ret, kind, 0, 0, false);
4364 }
4365 
4366 
4367 static const char *
dwarf_loc_list_encoding_name(unsigned int kind)4368 dwarf_loc_list_encoding_name (unsigned int kind)
4369 {
4370   const char *ret = dwarf_loc_list_encoding_string (kind);
4371   return string_or_unknown (ret, kind, 0, 0, false);
4372 }
4373 
4374 
4375 static const char *
dwarf_line_content_description_name(unsigned int kind)4376 dwarf_line_content_description_name (unsigned int kind)
4377 {
4378   const char *ret = dwarf_line_content_description_string (kind);
4379   return string_or_unknown (ret, kind, DW_LNCT_lo_user, DW_LNCT_hi_user,
4380 			    false);
4381 }
4382 
4383 
4384 static void
print_block(size_t n,const void * block)4385 print_block (size_t n, const void *block)
4386 {
4387   if (n == 0)
4388     puts (_("empty block"));
4389   else
4390     {
4391       printf (_("%zu byte block:"), n);
4392       const unsigned char *data = block;
4393       do
4394 	printf (" %02x", *data++);
4395       while (--n > 0);
4396       putchar ('\n');
4397     }
4398 }
4399 
4400 static void
print_bytes(size_t n,const unsigned char * bytes)4401 print_bytes (size_t n, const unsigned char *bytes)
4402 {
4403   while (n-- > 0)
4404     {
4405       printf ("%02x", *bytes++);
4406       if (n > 0)
4407 	printf (" ");
4408     }
4409 }
4410 
4411 static int
get_indexed_addr(Dwarf_CU * cu,Dwarf_Word idx,Dwarf_Addr * addr)4412 get_indexed_addr (Dwarf_CU *cu, Dwarf_Word idx, Dwarf_Addr *addr)
4413 {
4414   if (cu == NULL)
4415     return -1;
4416 
4417   Elf_Data *debug_addr = cu->dbg->sectiondata[IDX_debug_addr];
4418   if (debug_addr == NULL)
4419     return -1;
4420 
4421   Dwarf_Off base = __libdw_cu_addr_base (cu);
4422   Dwarf_Word off = idx * cu->address_size;
4423   if (base > debug_addr->d_size
4424       || off > debug_addr->d_size - base
4425       || cu->address_size > debug_addr->d_size - base - off)
4426     return -1;
4427 
4428   const unsigned char *addrp = debug_addr->d_buf + base + off;
4429   if (cu->address_size == 4)
4430     *addr = read_4ubyte_unaligned (cu->dbg, addrp);
4431   else
4432     *addr = read_8ubyte_unaligned (cu->dbg, addrp);
4433 
4434   return 0;
4435 }
4436 
4437 static void
print_ops(Dwfl_Module * dwflmod,Dwarf * dbg,int indent,int indentrest,unsigned int vers,unsigned int addrsize,unsigned int offset_size,struct Dwarf_CU * cu,Dwarf_Word len,const unsigned char * data)4438 print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
4439 	   unsigned int vers, unsigned int addrsize, unsigned int offset_size,
4440 	   struct Dwarf_CU *cu, Dwarf_Word len, const unsigned char *data)
4441 {
4442   const unsigned int ref_size = vers < 3 ? addrsize : offset_size;
4443 
4444   if (len == 0)
4445     {
4446       printf ("%*s(empty)\n", indent, "");
4447       return;
4448     }
4449 
4450 #define NEED(n)		if (len < (Dwarf_Word) (n)) goto invalid
4451 #define CONSUME(n)	NEED (n); else len -= (n)
4452 
4453   Dwarf_Word offset = 0;
4454   while (len-- > 0)
4455     {
4456       uint_fast8_t op = *data++;
4457 
4458       const char *op_name = dwarf_locexpr_opcode_string (op);
4459       if (unlikely (op_name == NULL))
4460 	{
4461 	  static char buf[20];
4462 	  if (op >= DW_OP_lo_user)
4463 	    snprintf (buf, sizeof buf, "lo_user+%#x", op - DW_OP_lo_user);
4464 	  else
4465 	    snprintf (buf, sizeof buf, "??? (%#x)", op);
4466 	  op_name = buf;
4467 	}
4468 
4469       switch (op)
4470 	{
4471 	case DW_OP_addr:;
4472 	  /* Address operand.  */
4473 	  Dwarf_Word addr;
4474 	  NEED (addrsize);
4475 	  if (addrsize == 4)
4476 	    addr = read_4ubyte_unaligned (dbg, data);
4477 	  else if (addrsize == 8)
4478 	    addr = read_8ubyte_unaligned (dbg, data);
4479 	  else
4480 	    goto invalid;
4481 	  data += addrsize;
4482 	  CONSUME (addrsize);
4483 
4484 	  printf ("%*s[%2" PRIuMAX "] %s ",
4485 		  indent, "", (uintmax_t) offset, op_name);
4486 	  print_dwarf_addr (dwflmod, 0, addr, addr);
4487 	  printf ("\n");
4488 
4489 	  offset += 1 + addrsize;
4490 	  break;
4491 
4492 	case DW_OP_call_ref:
4493 	case DW_OP_GNU_variable_value:
4494 	  /* Offset operand.  */
4495 	  if (ref_size != 4 && ref_size != 8)
4496 	    goto invalid; /* Cannot be used in CFA.  */
4497 	  NEED (ref_size);
4498 	  if (ref_size == 4)
4499 	    addr = read_4ubyte_unaligned (dbg, data);
4500 	  else
4501 	    addr = read_8ubyte_unaligned (dbg, data);
4502 	  data += ref_size;
4503 	  CONSUME (ref_size);
4504 	  /* addr is a DIE offset, so format it as one.  */
4505 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n",
4506 		  indent, "", (uintmax_t) offset,
4507 		  op_name, (uintmax_t) addr);
4508 	  offset += 1 + ref_size;
4509 	  break;
4510 
4511 	case DW_OP_deref_size:
4512 	case DW_OP_xderef_size:
4513 	case DW_OP_pick:
4514 	case DW_OP_const1u:
4515 	  // XXX value might be modified by relocation
4516 	  NEED (1);
4517 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 "\n",
4518 		  indent, "", (uintmax_t) offset,
4519 		  op_name, *((uint8_t *) data));
4520 	  ++data;
4521 	  --len;
4522 	  offset += 2;
4523 	  break;
4524 
4525 	case DW_OP_const2u:
4526 	  NEED (2);
4527 	  // XXX value might be modified by relocation
4528 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n",
4529 		  indent, "", (uintmax_t) offset,
4530 		  op_name, read_2ubyte_unaligned (dbg, data));
4531 	  CONSUME (2);
4532 	  data += 2;
4533 	  offset += 3;
4534 	  break;
4535 
4536 	case DW_OP_const4u:
4537 	  NEED (4);
4538 	  // XXX value might be modified by relocation
4539 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n",
4540 		  indent, "", (uintmax_t) offset,
4541 		  op_name, read_4ubyte_unaligned (dbg, data));
4542 	  CONSUME (4);
4543 	  data += 4;
4544 	  offset += 5;
4545 	  break;
4546 
4547 	case DW_OP_const8u:
4548 	  NEED (8);
4549 	  // XXX value might be modified by relocation
4550 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n",
4551 		  indent, "", (uintmax_t) offset,
4552 		  op_name, (uint64_t) read_8ubyte_unaligned (dbg, data));
4553 	  CONSUME (8);
4554 	  data += 8;
4555 	  offset += 9;
4556 	  break;
4557 
4558 	case DW_OP_const1s:
4559 	  NEED (1);
4560 	  // XXX value might be modified by relocation
4561 	  printf ("%*s[%2" PRIuMAX "] %s %" PRId8 "\n",
4562 		  indent, "", (uintmax_t) offset,
4563 		  op_name, *((int8_t *) data));
4564 	  ++data;
4565 	  --len;
4566 	  offset += 2;
4567 	  break;
4568 
4569 	case DW_OP_const2s:
4570 	  NEED (2);
4571 	  // XXX value might be modified by relocation
4572 	  printf ("%*s[%2" PRIuMAX "] %s %" PRId16 "\n",
4573 		  indent, "", (uintmax_t) offset,
4574 		  op_name, read_2sbyte_unaligned (dbg, data));
4575 	  CONSUME (2);
4576 	  data += 2;
4577 	  offset += 3;
4578 	  break;
4579 
4580 	case DW_OP_const4s:
4581 	  NEED (4);
4582 	  // XXX value might be modified by relocation
4583 	  printf ("%*s[%2" PRIuMAX "] %s %" PRId32 "\n",
4584 		  indent, "", (uintmax_t) offset,
4585 		  op_name, read_4sbyte_unaligned (dbg, data));
4586 	  CONSUME (4);
4587 	  data += 4;
4588 	  offset += 5;
4589 	  break;
4590 
4591 	case DW_OP_const8s:
4592 	  NEED (8);
4593 	  // XXX value might be modified by relocation
4594 	  printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n",
4595 		  indent, "", (uintmax_t) offset,
4596 		  op_name, read_8sbyte_unaligned (dbg, data));
4597 	  CONSUME (8);
4598 	  data += 8;
4599 	  offset += 9;
4600 	  break;
4601 
4602 	case DW_OP_piece:
4603 	case DW_OP_regx:
4604 	case DW_OP_plus_uconst:
4605 	case DW_OP_constu:;
4606 	  const unsigned char *start = data;
4607 	  uint64_t uleb;
4608 	  NEED (1);
4609 	  get_uleb128 (uleb, data, data + len);
4610 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n",
4611 		  indent, "", (uintmax_t) offset, op_name, uleb);
4612 	  CONSUME (data - start);
4613 	  offset += 1 + (data - start);
4614 	  break;
4615 
4616 	case DW_OP_addrx:
4617 	case DW_OP_GNU_addr_index:
4618 	case DW_OP_constx:
4619 	case DW_OP_GNU_const_index:;
4620 	  start = data;
4621 	  NEED (1);
4622 	  get_uleb128 (uleb, data, data + len);
4623 	  printf ("%*s[%2" PRIuMAX "] %s [%" PRIu64 "] ",
4624 		  indent, "", (uintmax_t) offset, op_name, uleb);
4625 	  CONSUME (data - start);
4626 	  offset += 1 + (data - start);
4627 	  if (get_indexed_addr (cu, uleb, &addr) != 0)
4628 	    printf ("???\n");
4629 	  else
4630 	    {
4631 	      print_dwarf_addr (dwflmod, 0, addr, addr);
4632 	      printf ("\n");
4633 	    }
4634 	  break;
4635 
4636 	case DW_OP_bit_piece:
4637 	  start = data;
4638 	  uint64_t uleb2;
4639 	  NEED (1);
4640 	  get_uleb128 (uleb, data, data + len);
4641 	  NEED (1);
4642 	  get_uleb128 (uleb2, data, data + len);
4643 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n",
4644 		  indent, "", (uintmax_t) offset, op_name, uleb, uleb2);
4645 	  CONSUME (data - start);
4646 	  offset += 1 + (data - start);
4647 	  break;
4648 
4649 	case DW_OP_fbreg:
4650 	case DW_OP_breg0 ... DW_OP_breg31:
4651 	case DW_OP_consts:
4652 	  start = data;
4653 	  int64_t sleb;
4654 	  NEED (1);
4655 	  get_sleb128 (sleb, data, data + len);
4656 	  printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n",
4657 		  indent, "", (uintmax_t) offset, op_name, sleb);
4658 	  CONSUME (data - start);
4659 	  offset += 1 + (data - start);
4660 	  break;
4661 
4662 	case DW_OP_bregx:
4663 	  start = data;
4664 	  NEED (1);
4665 	  get_uleb128 (uleb, data, data + len);
4666 	  NEED (1);
4667 	  get_sleb128 (sleb, data, data + len);
4668 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n",
4669 		  indent, "", (uintmax_t) offset, op_name, uleb, sleb);
4670 	  CONSUME (data - start);
4671 	  offset += 1 + (data - start);
4672 	  break;
4673 
4674 	case DW_OP_call2:
4675 	  NEED (2);
4676 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIx16 "]\n",
4677 		  indent, "", (uintmax_t) offset, op_name,
4678 		  read_2ubyte_unaligned (dbg, data));
4679 	  CONSUME (2);
4680 	  data += 2;
4681 	  offset += 3;
4682 	  break;
4683 
4684 	case DW_OP_call4:
4685 	  NEED (4);
4686 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIx32 "]\n",
4687 		  indent, "", (uintmax_t) offset, op_name,
4688 		  read_4ubyte_unaligned (dbg, data));
4689 	  CONSUME (4);
4690 	  data += 4;
4691 	  offset += 5;
4692 	  break;
4693 
4694 	case DW_OP_skip:
4695 	case DW_OP_bra:
4696 	  NEED (2);
4697 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIuMAX "\n",
4698 		  indent, "", (uintmax_t) offset, op_name,
4699 		  (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data) + 3));
4700 	  CONSUME (2);
4701 	  data += 2;
4702 	  offset += 3;
4703 	  break;
4704 
4705 	case DW_OP_implicit_value:
4706 	  start = data;
4707 	  NEED (1);
4708 	  get_uleb128 (uleb, data, data + len);
4709 	  printf ("%*s[%2" PRIuMAX "] %s: ",
4710 		  indent, "", (uintmax_t) offset, op_name);
4711 	  NEED (uleb);
4712 	  print_block (uleb, data);
4713 	  data += uleb;
4714 	  CONSUME (data - start);
4715 	  offset += 1 + (data - start);
4716 	  break;
4717 
4718 	case DW_OP_implicit_pointer:
4719 	case DW_OP_GNU_implicit_pointer:
4720 	  /* DIE offset operand.  */
4721 	  start = data;
4722 	  NEED (ref_size);
4723 	  if (ref_size != 4 && ref_size != 8)
4724 	    goto invalid; /* Cannot be used in CFA.  */
4725 	  if (ref_size == 4)
4726 	    addr = read_4ubyte_unaligned (dbg, data);
4727 	  else
4728 	    addr = read_8ubyte_unaligned (dbg, data);
4729 	  data += ref_size;
4730 	  /* Byte offset operand.  */
4731 	  NEED (1);
4732 	  get_sleb128 (sleb, data, data + len);
4733 
4734 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n",
4735 		  indent, "", (intmax_t) offset,
4736 		  op_name, (uintmax_t) addr, sleb);
4737 	  CONSUME (data - start);
4738 	  offset += 1 + (data - start);
4739 	  break;
4740 
4741 	case DW_OP_entry_value:
4742 	case DW_OP_GNU_entry_value:
4743 	  /* Size plus expression block.  */
4744 	  start = data;
4745 	  NEED (1);
4746 	  get_uleb128 (uleb, data, data + len);
4747 	  printf ("%*s[%2" PRIuMAX "] %s:\n",
4748 		  indent, "", (uintmax_t) offset, op_name);
4749 	  NEED (uleb);
4750 	  print_ops (dwflmod, dbg, indent + 5, indent + 5, vers,
4751 		     addrsize, offset_size, cu, uleb, data);
4752 	  data += uleb;
4753 	  CONSUME (data - start);
4754 	  offset += 1 + (data - start);
4755 	  break;
4756 
4757 	case DW_OP_const_type:
4758 	case DW_OP_GNU_const_type:
4759 	  /* uleb128 CU relative DW_TAG_base_type DIE offset, 1-byte
4760 	     unsigned size plus block.  */
4761 	  start = data;
4762 	  NEED (1);
4763 	  get_uleb128 (uleb, data, data + len);
4764 	  if (! print_unresolved_addresses && cu != NULL)
4765 	    uleb += cu->start;
4766 	  NEED (1);
4767 	  uint8_t usize = *(uint8_t *) data++;
4768 	  NEED (usize);
4769 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] ",
4770 		  indent, "", (uintmax_t) offset, op_name, uleb);
4771 	  print_block (usize, data);
4772 	  data += usize;
4773 	  CONSUME (data - start);
4774 	  offset += 1 + (data - start);
4775 	  break;
4776 
4777 	case DW_OP_regval_type:
4778 	case DW_OP_GNU_regval_type:
4779 	  /* uleb128 register number, uleb128 CU relative
4780 	     DW_TAG_base_type DIE offset.  */
4781 	  start = data;
4782 	  NEED (1);
4783 	  get_uleb128 (uleb, data, data + len);
4784 	  NEED (1);
4785 	  get_uleb128 (uleb2, data, data + len);
4786 	  if (! print_unresolved_addresses && cu != NULL)
4787 	    uleb2 += cu->start;
4788 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n",
4789 		  indent, "", (uintmax_t) offset, op_name, uleb, uleb2);
4790 	  CONSUME (data - start);
4791 	  offset += 1 + (data - start);
4792 	  break;
4793 
4794 	case DW_OP_deref_type:
4795 	case DW_OP_GNU_deref_type:
4796 	  /* 1-byte unsigned size of value, uleb128 CU relative
4797 	     DW_TAG_base_type DIE offset.  */
4798 	  start = data;
4799 	  NEED (1);
4800 	  usize = *(uint8_t *) data++;
4801 	  NEED (1);
4802 	  get_uleb128 (uleb, data, data + len);
4803 	  if (! print_unresolved_addresses && cu != NULL)
4804 	    uleb += cu->start;
4805 	  printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n",
4806 		  indent, "", (uintmax_t) offset,
4807 		  op_name, usize, uleb);
4808 	  CONSUME (data - start);
4809 	  offset += 1 + (data - start);
4810 	  break;
4811 
4812 	case DW_OP_xderef_type:
4813 	  /* 1-byte unsigned size of value, uleb128 base_type DIE offset.  */
4814 	  start = data;
4815 	  NEED (1);
4816 	  usize = *(uint8_t *) data++;
4817 	  NEED (1);
4818 	  get_uleb128 (uleb, data, data + len);
4819 	  printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n",
4820 		  indent, "", (uintmax_t) offset,
4821 		  op_name, usize, uleb);
4822 	  CONSUME (data - start);
4823 	  offset += 1 + (data - start);
4824 	  break;
4825 
4826 	case DW_OP_convert:
4827 	case DW_OP_GNU_convert:
4828 	case DW_OP_reinterpret:
4829 	case DW_OP_GNU_reinterpret:
4830 	  /* uleb128 CU relative offset to DW_TAG_base_type, or zero
4831 	     for conversion to untyped.  */
4832 	  start = data;
4833 	  NEED (1);
4834 	  get_uleb128 (uleb, data, data + len);
4835 	  if (uleb != 0 && ! print_unresolved_addresses && cu != NULL)
4836 	    uleb += cu->start;
4837 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n",
4838 		  indent, "", (uintmax_t) offset, op_name, uleb);
4839 	  CONSUME (data - start);
4840 	  offset += 1 + (data - start);
4841 	  break;
4842 
4843 	case DW_OP_GNU_parameter_ref:
4844 	  /* 4 byte CU relative reference to the abstract optimized away
4845 	     DW_TAG_formal_parameter.  */
4846 	  NEED (4);
4847 	  uintmax_t param_off = (uintmax_t) read_4ubyte_unaligned (dbg, data);
4848 	  if (! print_unresolved_addresses && cu != NULL)
4849 	    param_off += cu->start;
4850 	  printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n",
4851 		  indent, "", (uintmax_t) offset, op_name, param_off);
4852 	  CONSUME (4);
4853 	  data += 4;
4854 	  offset += 5;
4855 	  break;
4856 
4857 	default:
4858 	  /* No Operand.  */
4859 	  printf ("%*s[%2" PRIuMAX "] %s\n",
4860 		  indent, "", (uintmax_t) offset, op_name);
4861 	  ++offset;
4862 	  break;
4863 	}
4864 
4865       indent = indentrest;
4866       continue;
4867 
4868     invalid:
4869       printf (_("%*s[%2" PRIuMAX "] %s  <TRUNCATED>\n"),
4870 	      indent, "", (uintmax_t) offset, op_name);
4871       break;
4872     }
4873 }
4874 
4875 
4876 /* Turn the addresses into file offsets by using the phdrs.  */
4877 static void
find_offsets(Elf * elf,GElf_Addr main_bias,size_t n,GElf_Addr addrs[n],GElf_Off offs[n])4878 find_offsets(Elf *elf, GElf_Addr main_bias, size_t n,
4879                   GElf_Addr addrs[n], GElf_Off offs[n])
4880 {
4881   size_t unsolved = n;
4882   for (size_t i = 0; i < phnum; ++i) {
4883     GElf_Phdr phdr_mem;
4884     GElf_Phdr *phdr = gelf_getphdr(elf, i, &phdr_mem);
4885     if (phdr != NULL && phdr->p_type == PT_LOAD && phdr->p_memsz > 0)
4886       for (size_t j = 0; j < n; ++j)
4887         if (offs[j] == 0 && addrs[j] >= phdr->p_vaddr + main_bias &&
4888             addrs[j] - (phdr->p_vaddr + main_bias) < phdr->p_filesz) {
4889           offs[j] = addrs[j] - (phdr->p_vaddr + main_bias) + phdr->p_offset;
4890           if (--unsolved == 0)
4891             break;
4892         }
4893   }
4894 }
4895 
4896 /* The dynamic segment (type PT_DYNAMIC), contains the .dynamic section.
4897    And .dynamic section contains an array of the dynamic structures.
4898    We use the array to get:
4899     DT_STRTAB: the address of the string table
4900     DT_SYMTAB: the address of the symbol table
4901     DT_STRSZ: the size, in bytes, of the string table
4902     ...  */
4903 static void
get_dynscn_addrs(Elf * elf,GElf_Phdr * phdr,GElf_Addr addrs[i_max])4904 get_dynscn_addrs(Elf *elf, GElf_Phdr *phdr, GElf_Addr addrs[i_max])
4905 {
4906   Elf_Data *data = elf_getdata_rawchunk(
4907     elf, phdr->p_offset, phdr->p_filesz, ELF_T_DYN);
4908 
4909   int dyn_idx = 0;
4910   for (;; ++dyn_idx) {
4911     GElf_Dyn dyn_mem;
4912     GElf_Dyn *dyn = gelf_getdyn(data, dyn_idx, &dyn_mem);
4913     /* DT_NULL Marks end of dynamic section.  */
4914     if (dyn->d_tag == DT_NULL)
4915       break;
4916 
4917     switch (dyn->d_tag) {
4918     case DT_SYMTAB:
4919       addrs[i_symtab] = dyn->d_un.d_ptr;
4920       break;
4921 
4922     case DT_HASH:
4923       addrs[i_hash] = dyn->d_un.d_ptr;
4924       break;
4925 
4926     case DT_GNU_HASH:
4927       addrs[i_gnu_hash] = dyn->d_un.d_ptr;
4928       break;
4929 
4930     case DT_STRTAB:
4931       addrs[i_strtab] = dyn->d_un.d_ptr;
4932       break;
4933 
4934     case DT_VERSYM:
4935       addrs[i_versym] = dyn->d_un.d_ptr;
4936       break;
4937 
4938     case DT_VERDEF:
4939       addrs[i_verdef] = dyn->d_un.d_ptr;
4940       break;
4941 
4942     case DT_VERNEED:
4943       addrs[i_verneed] = dyn->d_un.d_ptr;
4944       break;
4945 
4946     case DT_STRSZ:
4947       addrs[i_strsz] = dyn->d_un.d_val;
4948       break;
4949     }
4950   }
4951 }
4952 
4953 
4954 /* Use dynamic segment to get data for the string table section.  */
4955 static Elf_Data *
get_dynscn_strtab(Elf * elf,GElf_Phdr * phdr)4956 get_dynscn_strtab(Elf *elf, GElf_Phdr *phdr)
4957 {
4958   Elf_Data *strtab_data;
4959   GElf_Addr addrs[i_max] = {0,};
4960   GElf_Off offs[i_max] = {0,};
4961   get_dynscn_addrs(elf, phdr, addrs);
4962   find_offsets(elf, 0, i_max, addrs, offs);
4963   strtab_data = elf_getdata_rawchunk(
4964           elf, offs[i_strtab], addrs[i_strsz], ELF_T_BYTE);
4965   return strtab_data;
4966 }
4967 
4968 
4969 struct listptr
4970 {
4971   Dwarf_Off offset:(64 - 3);
4972   bool addr64:1;
4973   bool dwarf64:1;
4974   bool warned:1;
4975   struct Dwarf_CU *cu;
4976   unsigned int attr;
4977 };
4978 
4979 #define listptr_offset_size(p)	((p)->dwarf64 ? 8 : 4)
4980 #define listptr_address_size(p)	((p)->addr64 ? 8 : 4)
4981 
4982 static Dwarf_Addr
cudie_base(Dwarf_Die * cudie)4983 cudie_base (Dwarf_Die *cudie)
4984 {
4985   Dwarf_Addr base;
4986   /* Find the base address of the compilation unit.  It will normally
4987      be specified by DW_AT_low_pc.  In DWARF-3 draft 4, the base
4988      address could be overridden by DW_AT_entry_pc.  It's been
4989      removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc for
4990      compilation units with discontinuous ranges.  */
4991   if (unlikely (dwarf_lowpc (cudie, &base) != 0))
4992     {
4993       Dwarf_Attribute attr_mem;
4994       if (dwarf_formaddr (dwarf_attr (cudie, DW_AT_entry_pc, &attr_mem),
4995 			  &base) != 0)
4996 	base = 0;
4997     }
4998   return base;
4999 }
5000 
5001 static Dwarf_Addr
listptr_base(struct listptr * p)5002 listptr_base (struct listptr *p)
5003 {
5004   Dwarf_Die cu = CUDIE (p->cu);
5005   return cudie_base (&cu);
5006 }
5007 
5008 /* To store the name used in compare_listptr */
5009 static const char *sort_listptr_name;
5010 
5011 static int
compare_listptr(const void * a,const void * b)5012 compare_listptr (const void *a, const void *b)
5013 {
5014   const char *name = sort_listptr_name;
5015   struct listptr *p1 = (void *) a;
5016   struct listptr *p2 = (void *) b;
5017 
5018   if (p1->offset < p2->offset)
5019     return -1;
5020   if (p1->offset > p2->offset)
5021     return 1;
5022 
5023   if (!p1->warned && !p2->warned)
5024     {
5025       if (p1->addr64 != p2->addr64)
5026 	{
5027 	  p1->warned = p2->warned = true;
5028 	  error (0, 0,
5029 		 _("%s %#" PRIx64 " used with different address sizes"),
5030 		 name, (uint64_t) p1->offset);
5031 	}
5032       if (p1->dwarf64 != p2->dwarf64)
5033 	{
5034 	  p1->warned = p2->warned = true;
5035 	  error (0, 0,
5036 		 _("%s %#" PRIx64 " used with different offset sizes"),
5037 		 name, (uint64_t) p1->offset);
5038 	}
5039       if (listptr_base (p1) != listptr_base (p2))
5040 	{
5041 	  p1->warned = p2->warned = true;
5042 	  error (0, 0,
5043 		 _("%s %#" PRIx64 " used with different base addresses"),
5044 		 name, (uint64_t) p1->offset);
5045 	}
5046       if (p1->attr != p2 ->attr)
5047 	{
5048 	  p1->warned = p2->warned = true;
5049 	  error (0, 0,
5050 		 _("%s %#" PRIx64
5051 			  " used with different attribute %s and %s"),
5052 		 name, (uint64_t) p1->offset, dwarf_attr_name (p1->attr),
5053 		 dwarf_attr_name (p2->attr));
5054 	}
5055     }
5056 
5057   return 0;
5058 }
5059 
5060 struct listptr_table
5061 {
5062   size_t n;
5063   size_t alloc;
5064   struct listptr *table;
5065 };
5066 
5067 static struct listptr_table known_locsptr;
5068 static struct listptr_table known_loclistsptr;
5069 static struct listptr_table known_rangelistptr;
5070 static struct listptr_table known_rnglistptr;
5071 static struct listptr_table known_addrbases;
5072 static struct listptr_table known_stroffbases;
5073 
5074 static void
reset_listptr(struct listptr_table * table)5075 reset_listptr (struct listptr_table *table)
5076 {
5077   free (table->table);
5078   table->table = NULL;
5079   table->n = table->alloc = 0;
5080 }
5081 
5082 /* Returns false if offset doesn't fit.  See struct listptr.  */
5083 static bool
notice_listptr(enum section_e section,struct listptr_table * table,uint_fast8_t address_size,uint_fast8_t offset_size,struct Dwarf_CU * cu,Dwarf_Off offset,unsigned int attr)5084 notice_listptr (enum section_e section, struct listptr_table *table,
5085 		uint_fast8_t address_size, uint_fast8_t offset_size,
5086 		struct Dwarf_CU *cu, Dwarf_Off offset, unsigned int attr)
5087 {
5088   if (print_debug_sections & section)
5089     {
5090       if (table->n == table->alloc)
5091 	{
5092 	  if (table->alloc == 0)
5093 	    table->alloc = 128;
5094 	  else
5095 	    table->alloc *= 2;
5096 	  table->table = xrealloc (table->table,
5097 				   table->alloc * sizeof table->table[0]);
5098 	}
5099 
5100       struct listptr *p = &table->table[table->n++];
5101 
5102       *p = (struct listptr)
5103 	{
5104 	  .addr64 = address_size == 8,
5105 	  .dwarf64 = offset_size == 8,
5106 	  .offset = offset,
5107 	  .cu = cu,
5108 	  .attr = attr
5109 	};
5110 
5111       if (p->offset != offset)
5112 	{
5113 	  table->n--;
5114 	  return false;
5115 	}
5116     }
5117   return true;
5118 }
5119 
5120 static void
sort_listptr(struct listptr_table * table,const char * name)5121 sort_listptr (struct listptr_table *table, const char *name)
5122 {
5123   if (table->n > 0)
5124     {
5125       sort_listptr_name = name;
5126       qsort (table->table, table->n, sizeof table->table[0],
5127 	     &compare_listptr);
5128     }
5129 }
5130 
5131 static bool
skip_listptr_hole(struct listptr_table * table,size_t * idxp,uint_fast8_t * address_sizep,uint_fast8_t * offset_sizep,Dwarf_Addr * base,struct Dwarf_CU ** cu,ptrdiff_t offset,unsigned char ** readp,unsigned char * endp,unsigned int * attr)5132 skip_listptr_hole (struct listptr_table *table, size_t *idxp,
5133 		   uint_fast8_t *address_sizep, uint_fast8_t *offset_sizep,
5134 		   Dwarf_Addr *base, struct Dwarf_CU **cu, ptrdiff_t offset,
5135 		   unsigned char **readp, unsigned char *endp,
5136 		   unsigned int *attr)
5137 {
5138   if (table->n == 0)
5139     return false;
5140 
5141   while (*idxp < table->n && table->table[*idxp].offset < (Dwarf_Off) offset)
5142     ++*idxp;
5143 
5144   struct listptr *p = &table->table[*idxp];
5145 
5146   if (*idxp == table->n
5147       || p->offset >= (Dwarf_Off) (endp - *readp + offset))
5148     {
5149       *readp = endp;
5150       printf (_(" [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"),
5151 	      offset);
5152       return true;
5153     }
5154 
5155   if (p->offset != (Dwarf_Off) offset)
5156     {
5157       *readp += p->offset - offset;
5158       printf (_(" [%6tx]  <UNUSED GARBAGE> ... %" PRIu64 " bytes ...\n"),
5159 	      offset, (Dwarf_Off) p->offset - offset);
5160       return true;
5161     }
5162 
5163   if (address_sizep != NULL)
5164     *address_sizep = listptr_address_size (p);
5165   if (offset_sizep != NULL)
5166     *offset_sizep = listptr_offset_size (p);
5167   if (base != NULL)
5168     *base = listptr_base (p);
5169   if (cu != NULL)
5170     *cu = p->cu;
5171   if (attr != NULL)
5172     *attr = p->attr;
5173 
5174   return false;
5175 }
5176 
5177 static Dwarf_Off
next_listptr_offset(struct listptr_table * table,size_t * idxp,Dwarf_Off off)5178 next_listptr_offset (struct listptr_table *table, size_t *idxp, Dwarf_Off off)
5179 {
5180   /* Note that multiple attributes could in theory point to the same loclist
5181      offset, so make sure we pick one that is bigger than the current one.
5182      The table is sorted on offset.  */
5183   if (*idxp < table->n)
5184     {
5185       while (++*idxp < table->n)
5186 	{
5187 	  Dwarf_Off next = table->table[*idxp].offset;
5188 	  if (next > off)
5189 	    return next;
5190 	}
5191     }
5192   return 0;
5193 }
5194 
5195 /* Returns the listptr associated with the given index, or NULL.  */
5196 static struct listptr *
get_listptr(struct listptr_table * table,size_t idx)5197 get_listptr (struct listptr_table *table, size_t idx)
5198 {
5199   if (idx >= table->n)
5200     return NULL;
5201   return &table->table[idx];
5202 }
5203 
5204 /* Returns the next index, base address and CU associated with the
5205    list unit offsets.  If there is none false is returned, otherwise
5206    true.  Assumes the table has been sorted.  */
5207 static bool
listptr_cu(struct listptr_table * table,size_t * idxp,Dwarf_Off start,Dwarf_Off end,Dwarf_Addr * base,struct Dwarf_CU ** cu)5208 listptr_cu (struct listptr_table *table, size_t *idxp,
5209 	    Dwarf_Off start, Dwarf_Off end,
5210 	    Dwarf_Addr *base, struct Dwarf_CU **cu)
5211 {
5212   while (*idxp < table->n
5213 	 && table->table[*idxp].offset < start)
5214     ++*idxp;
5215 
5216   if (*idxp < table->n
5217       && table->table[*idxp].offset >= start
5218       && table->table[*idxp].offset < end)
5219     {
5220       struct listptr *p = &table->table[*idxp];
5221       *base = listptr_base (p);
5222       *cu = p->cu;
5223       return true;
5224     }
5225 
5226   return false;
5227 }
5228 
5229 /* Returns the next index with the current CU for the given attribute.
5230    If there is none false is returned, otherwise true.  Assumes the
5231    table has been sorted.  */
5232 static bool
listptr_attr(struct listptr_table * table,size_t idxp,Dwarf_Off offset,unsigned int attr)5233 listptr_attr (struct listptr_table *table, size_t idxp,
5234 	      Dwarf_Off offset, unsigned int attr)
5235 {
5236   struct listptr *listptr;
5237   do
5238     {
5239       listptr = get_listptr (table, idxp);
5240       if (listptr == NULL)
5241 	return false;
5242 
5243       if (listptr->offset == offset && listptr->attr == attr)
5244 	return true;
5245 
5246       idxp++;
5247     }
5248   while (listptr->offset <= offset);
5249 
5250   return false;
5251 }
5252 
5253 static void
print_debug_abbrev_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)5254 print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
5255 			    Ebl *ebl, GElf_Ehdr *ehdr __attribute__ ((unused)),
5256 			    Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
5257 {
5258   const size_t sh_size = (dbg->sectiondata[IDX_debug_abbrev] ?
5259 			  dbg->sectiondata[IDX_debug_abbrev]->d_size : 0);
5260 
5261   printf (_("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"
5262 		   " [ Code]\n"),
5263 	  elf_ndxscn (scn), section_name (ebl, shdr),
5264 	  (uint64_t) shdr->sh_offset);
5265 
5266   Dwarf_Off offset = 0;
5267   while (offset < sh_size)
5268     {
5269       printf (_("\nAbbreviation section at offset %" PRIu64 ":\n"),
5270 	      offset);
5271 
5272       while (1)
5273 	{
5274 	  size_t length;
5275 	  Dwarf_Abbrev abbrev;
5276 
5277 	  int res = dwarf_offabbrev (dbg, offset, &length, &abbrev);
5278 	  if (res != 0)
5279 	    {
5280 	      if (unlikely (res < 0))
5281 		{
5282 		  printf (_("\
5283  *** error while reading abbreviation: %s\n"),
5284 			  dwarf_errmsg (-1));
5285 		  return;
5286 		}
5287 
5288 	      /* This is the NUL byte at the end of the section.  */
5289 	      ++offset;
5290 	      break;
5291 	    }
5292 
5293 	  /* We know these calls can never fail.  */
5294 	  unsigned int code = dwarf_getabbrevcode (&abbrev);
5295 	  unsigned int tag = dwarf_getabbrevtag (&abbrev);
5296 	  int has_children = dwarf_abbrevhaschildren (&abbrev);
5297 
5298 	  printf (_(" [%5u] offset: %" PRId64
5299 			   ", children: %s, tag: %s\n"),
5300 		  code, (int64_t) offset,
5301 		  has_children ? yes_str : no_str,
5302 		  dwarf_tag_name (tag));
5303 
5304 	  size_t cnt = 0;
5305 	  unsigned int name;
5306 	  unsigned int form;
5307 	  Dwarf_Sword data;
5308 	  Dwarf_Off enoffset;
5309 	  while (dwarf_getabbrevattr_data (&abbrev, cnt, &name, &form,
5310 					   &data, &enoffset) == 0)
5311 	    {
5312 	      printf ("          attr: %s, form: %s",
5313 		      dwarf_attr_name (name), dwarf_form_name (form));
5314 	      if (form == DW_FORM_implicit_const)
5315 		printf (" (%" PRId64 ")", data);
5316 	      printf (", offset: %#" PRIx64 "\n", (uint64_t) enoffset);
5317 	      ++cnt;
5318 	    }
5319 
5320 	  offset += length;
5321 	}
5322     }
5323 }
5324 
5325 
5326 static void
print_debug_addr_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)5327 print_debug_addr_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
5328 			  Ebl *ebl, GElf_Ehdr *ehdr,
5329 			  Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
5330 {
5331   printf (_("\
5332 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
5333 	  elf_ndxscn (scn), section_name (ebl, shdr),
5334 	  (uint64_t) shdr->sh_offset);
5335 
5336   if (shdr->sh_size == 0)
5337     return;
5338 
5339   /* We like to get the section from libdw to make sure they are relocated.  */
5340   Elf_Data *data = (dbg->sectiondata[IDX_debug_addr]
5341 		    ?: elf_rawdata (scn, NULL));
5342   if (unlikely (data == NULL))
5343     {
5344       error (0, 0, _("cannot get .debug_addr section data: %s"),
5345 	     elf_errmsg (-1));
5346       return;
5347     }
5348 
5349   size_t idx = 0;
5350   sort_listptr (&known_addrbases, "addr_base");
5351 
5352   const unsigned char *start = (const unsigned char *) data->d_buf;
5353   const unsigned char *readp = start;
5354   const unsigned char *readendp = ((const unsigned char *) data->d_buf
5355 				   + data->d_size);
5356 
5357   while (readp < readendp)
5358     {
5359       /* We cannot really know whether or not there is an header.  The
5360 	 DebugFission extension to DWARF4 doesn't add one.  The DWARF5
5361 	 .debug_addr variant does.  Whether or not we have an header,
5362 	 DW_AT_[GNU_]addr_base points at "index 0".  So if the current
5363 	 offset equals the CU addr_base then we can just start
5364 	 printing addresses.  If there is no CU with an exact match
5365 	 then we'll try to parse the header first.  */
5366       Dwarf_Off off = (Dwarf_Off) (readp
5367 				   - (const unsigned char *) data->d_buf);
5368 
5369       printf ("Table at offset %" PRIx64 " ", off);
5370 
5371       struct listptr *listptr = get_listptr (&known_addrbases, idx++);
5372       const unsigned char *next_unitp;
5373 
5374       uint64_t unit_length;
5375       uint16_t version;
5376       uint8_t address_size;
5377       uint8_t segment_size;
5378       if (listptr == NULL)
5379 	{
5380 	  error (0, 0, "Warning: No CU references .debug_addr after %" PRIx64,
5381 		 off);
5382 
5383 	  /* We will have to assume it is just addresses to the end... */
5384 	  address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
5385 	  next_unitp = readendp;
5386 	  printf ("Unknown CU:\n");
5387 	}
5388       else
5389 	{
5390 	  Dwarf_Die cudie;
5391 	  if (dwarf_cu_die (listptr->cu, &cudie,
5392 			    NULL, NULL, NULL, NULL,
5393 			    NULL, NULL) == NULL)
5394 	    printf ("Unknown CU (%s):\n", dwarf_errmsg (-1));
5395 	  else
5396 	    printf ("for CU [%6" PRIx64 "]:\n", dwarf_dieoffset (&cudie));
5397 
5398 	  if (listptr->offset == off)
5399 	    {
5400 	      address_size = listptr_address_size (listptr);
5401 	      segment_size = 0;
5402 	      version = 4;
5403 
5404 	      /* The addresses start here, but where do they end?  */
5405 	      listptr = get_listptr (&known_addrbases, idx);
5406 	      if (listptr == NULL)
5407 		next_unitp = readendp;
5408 	      else if (listptr->cu->version < 5)
5409 		{
5410 		  next_unitp = start + listptr->offset;
5411 		  if (listptr->offset < off || listptr->offset > data->d_size)
5412 		    {
5413 		      error (0, 0,
5414 			     "Warning: Bad address base for next unit at %"
5415 			     PRIx64, off);
5416 		      next_unitp = readendp;
5417 		    }
5418 		}
5419 	      else
5420 		{
5421 		  /* Tricky, we don't have a header for this unit, but
5422 		     there is one for the next.  We will have to
5423 		     "guess" how big it is and subtract it from the
5424 		     offset (because that points after the header).  */
5425 		  unsigned int offset_size = listptr_offset_size (listptr);
5426 		  Dwarf_Off next_off = (listptr->offset
5427 					- (offset_size == 4 ? 4 : 12) /* len */
5428 					- 2 /* version */
5429 					- 1 /* address size */
5430 					- 1); /* segment selector size */
5431 		  next_unitp = start + next_off;
5432 		  if (next_off < off || next_off > data->d_size)
5433 		    {
5434 		      error (0, 0,
5435 			     "Warning: Couldn't calculate .debug_addr "
5436 			     " unit length at %" PRIx64, off);
5437 		      next_unitp = readendp;
5438 		    }
5439 		}
5440 	      unit_length = (uint64_t) (next_unitp - readp);
5441 
5442 	      /* Pretend we have a header.  */
5443 	      printf ("\n");
5444 	      printf (_(" Length:         %8" PRIu64 "\n"),
5445 		      unit_length);
5446 	      printf (_(" DWARF version:  %8" PRIu16 "\n"), version);
5447 	      printf (_(" Address size:   %8" PRIu64 "\n"),
5448 		      (uint64_t) address_size);
5449 	      printf (_(" Segment size:   %8" PRIu64 "\n"),
5450 		      (uint64_t) segment_size);
5451 	      printf ("\n");
5452 	    }
5453 	  else
5454 	    {
5455 	      /* OK, we have to parse an header first.  */
5456 	      unit_length = read_4ubyte_unaligned_inc (dbg, readp);
5457 	      if (unlikely (unit_length == 0xffffffff))
5458 		{
5459 		  if (unlikely (readp > readendp - 8))
5460 		    {
5461 		    invalid_data:
5462 		      error (0, 0, "Invalid data");
5463 		      return;
5464 		    }
5465 		  unit_length = read_8ubyte_unaligned_inc (dbg, readp);
5466 		}
5467 	      printf ("\n");
5468 	      printf (_(" Length:         %8" PRIu64 "\n"),
5469 		      unit_length);
5470 
5471 	      /* We need at least 2-bytes (version) + 1-byte
5472 		 (addr_size) + 1-byte (segment_size) = 4 bytes to
5473 		 complete the header.  And this unit cannot go beyond
5474 		 the section data.  */
5475 	      if (readp > readendp - 4
5476 		  || unit_length < 4
5477 		  || unit_length > (uint64_t) (readendp - readp))
5478 		goto invalid_data;
5479 
5480 	      next_unitp = readp + unit_length;
5481 
5482 	      version = read_2ubyte_unaligned_inc (dbg, readp);
5483 	      printf (_(" DWARF version:  %8" PRIu16 "\n"), version);
5484 
5485 	      if (version != 5)
5486 		{
5487 		  error (0, 0, _("Unknown version"));
5488 		  goto next_unit;
5489 		}
5490 
5491 	      address_size = *readp++;
5492 	      printf (_(" Address size:   %8" PRIu64 "\n"),
5493 		      (uint64_t) address_size);
5494 
5495 	      if (address_size != 4 && address_size != 8)
5496 		{
5497 		  error (0, 0, _("unsupported address size"));
5498 		  goto next_unit;
5499 		}
5500 
5501 	      segment_size = *readp++;
5502 	      printf (_(" Segment size:   %8" PRIu64 "\n"),
5503 		      (uint64_t) segment_size);
5504 	      printf ("\n");
5505 
5506 	      if (segment_size != 0)
5507 		{
5508 		  error (0, 0, _("unsupported segment size"));
5509 		  goto next_unit;
5510 		}
5511 
5512 	      if (listptr->offset != (Dwarf_Off) (readp - start))
5513 		{
5514 		  error (0, 0, "Address index doesn't start after header");
5515 		  goto next_unit;
5516 		}
5517 	    }
5518 	}
5519 
5520       int digits = 1;
5521       size_t addresses = (next_unitp - readp) / address_size;
5522       while (addresses >= 10)
5523 	{
5524 	  ++digits;
5525 	  addresses /= 10;
5526 	}
5527 
5528       unsigned int uidx = 0;
5529       size_t index_offset =  readp - (const unsigned char *) data->d_buf;
5530       printf (" Addresses start at offset 0x%zx:\n", index_offset);
5531       while (readp <= next_unitp - address_size)
5532 	{
5533 	  Dwarf_Addr addr = read_addr_unaligned_inc (address_size, dbg,
5534 						     readp);
5535 	  printf (" [%*u] ", digits, uidx++);
5536 	  print_dwarf_addr (dwflmod, address_size, addr, addr);
5537 	  printf ("\n");
5538 	}
5539       printf ("\n");
5540 
5541       if (readp != next_unitp)
5542 	error (0, 0, "extra %zd bytes at end of unit",
5543 	       (size_t) (next_unitp - readp));
5544 
5545     next_unit:
5546       readp = next_unitp;
5547     }
5548 }
5549 
5550 /* Print content of DWARF .debug_aranges section.  We fortunately do
5551    not have to know a bit about the structure of the section, libdwarf
5552    takes care of it.  */
5553 static void
print_decoded_aranges_section(Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)5554 print_decoded_aranges_section (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
5555 			       GElf_Shdr *shdr, Dwarf *dbg)
5556 {
5557   Dwarf_Aranges *aranges;
5558   size_t cnt;
5559   if (unlikely (dwarf_getaranges (dbg, &aranges, &cnt) != 0))
5560     {
5561       error (0, 0, _("cannot get .debug_aranges content: %s"),
5562 	     dwarf_errmsg (-1));
5563       return;
5564     }
5565 
5566   GElf_Shdr glink_mem;
5567   GElf_Shdr *glink;
5568   glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
5569   if (glink == NULL)
5570     {
5571       error (0, 0, _("invalid sh_link value in section %zu"),
5572 	     elf_ndxscn (scn));
5573       return;
5574     }
5575 
5576   printf (ngettext ("\
5577 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entry:\n",
5578 		    "\
5579 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entries:\n",
5580 		    cnt),
5581 	  elf_ndxscn (scn), section_name (ebl, shdr),
5582 	  (uint64_t) shdr->sh_offset, cnt);
5583 
5584   /* Compute floor(log16(cnt)).  */
5585   size_t tmp = cnt;
5586   int digits = 1;
5587   while (tmp >= 16)
5588     {
5589       ++digits;
5590       tmp >>= 4;
5591     }
5592 
5593   for (size_t n = 0; n < cnt; ++n)
5594     {
5595       Dwarf_Arange *runp = dwarf_onearange (aranges, n);
5596       if (unlikely (runp == NULL))
5597 	{
5598 	  printf ("cannot get arange %zu: %s\n", n, dwarf_errmsg (-1));
5599 	  return;
5600 	}
5601 
5602       Dwarf_Addr start;
5603       Dwarf_Word length;
5604       Dwarf_Off offset;
5605 
5606       if (unlikely (dwarf_getarangeinfo (runp, &start, &length, &offset) != 0))
5607 	printf (_(" [%*zu] ???\n"), digits, n);
5608       else
5609 	printf (_(" [%*zu] start: %0#*" PRIx64
5610 			 ", length: %5" PRIu64 ", CU DIE offset: %6"
5611 			 PRId64 "\n"),
5612 		digits, n, ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 10 : 18,
5613 		(uint64_t) start, (uint64_t) length, (int64_t) offset);
5614     }
5615 }
5616 
5617 
5618 /* Print content of DWARF .debug_aranges section.  */
5619 static void
print_debug_aranges_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)5620 print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
5621 			     Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
5622 			     GElf_Shdr *shdr, Dwarf *dbg)
5623 {
5624   if (decodedaranges)
5625     {
5626       print_decoded_aranges_section (ebl, ehdr, scn, shdr, dbg);
5627       return;
5628     }
5629 
5630   Elf_Data *data = (dbg->sectiondata[IDX_debug_aranges]
5631 		    ?: elf_rawdata (scn, NULL));
5632 
5633   if (unlikely (data == NULL))
5634     {
5635       error (0, 0, _("cannot get .debug_aranges content: %s"),
5636 	     elf_errmsg (-1));
5637       return;
5638     }
5639 
5640   printf (_("\
5641 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
5642 	  elf_ndxscn (scn), section_name (ebl, shdr),
5643 	  (uint64_t) shdr->sh_offset);
5644 
5645   const unsigned char *readp = data->d_buf;
5646   const unsigned char *readendp = readp + data->d_size;
5647 
5648   while (readp < readendp)
5649     {
5650       const unsigned char *hdrstart = readp;
5651       size_t start_offset = hdrstart - (const unsigned char *) data->d_buf;
5652 
5653       printf (_("\nTable at offset %zu:\n"), start_offset);
5654       if (readp + 4 > readendp)
5655 	{
5656 	invalid_data:
5657 	  error (0, 0, _("invalid data in section [%zu] '%s'"),
5658 		 elf_ndxscn (scn), section_name (ebl, shdr));
5659 	  return;
5660 	}
5661 
5662       Dwarf_Word length = read_4ubyte_unaligned_inc (dbg, readp);
5663       unsigned int length_bytes = 4;
5664       if (length == DWARF3_LENGTH_64_BIT)
5665 	{
5666 	  if (readp + 8 > readendp)
5667 	    goto invalid_data;
5668 	  length = read_8ubyte_unaligned_inc (dbg, readp);
5669 	  length_bytes = 8;
5670 	}
5671 
5672       const unsigned char *nexthdr = readp + length;
5673       printf (_("\n Length:        %6" PRIu64 "\n"),
5674 	      (uint64_t) length);
5675 
5676       if (unlikely (length > (size_t) (readendp - readp)))
5677 	goto invalid_data;
5678 
5679       if (length == 0)
5680 	continue;
5681 
5682       if (readp + 2 > readendp)
5683 	goto invalid_data;
5684       uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, readp);
5685       printf (_(" DWARF version: %6" PRIuFAST16 "\n"),
5686 	      version);
5687       if (version != 2)
5688 	{
5689 	  error (0, 0, _("unsupported aranges version"));
5690 	  goto next_table;
5691 	}
5692 
5693       Dwarf_Word offset;
5694       if (readp + length_bytes > readendp)
5695 	goto invalid_data;
5696       if (length_bytes == 8)
5697 	offset = read_8ubyte_unaligned_inc (dbg, readp);
5698       else
5699 	offset = read_4ubyte_unaligned_inc (dbg, readp);
5700       printf (_(" CU offset:     %6" PRIx64 "\n"),
5701 	      (uint64_t) offset);
5702 
5703       if (readp + 1 > readendp)
5704 	goto invalid_data;
5705       unsigned int address_size = *readp++;
5706       printf (_(" Address size:  %6" PRIu64 "\n"),
5707 	      (uint64_t) address_size);
5708       if (address_size != 4 && address_size != 8)
5709 	{
5710 	  error (0, 0, _("unsupported address size"));
5711 	  goto next_table;
5712 	}
5713 
5714       if (readp + 1 > readendp)
5715 	goto invalid_data;
5716       unsigned int segment_size = *readp++;
5717       printf (_(" Segment size:  %6" PRIu64 "\n\n"),
5718 	      (uint64_t) segment_size);
5719       if (segment_size != 0 && segment_size != 4 && segment_size != 8)
5720 	{
5721 	  error (0, 0, _("unsupported segment size"));
5722 	  goto next_table;
5723 	}
5724 
5725       /* Round the address to the next multiple of 2*address_size.  */
5726       readp += ((2 * address_size - ((readp - hdrstart) % (2 * address_size)))
5727 		% (2 * address_size));
5728 
5729       while (readp < nexthdr)
5730 	{
5731 	  Dwarf_Word range_address;
5732 	  Dwarf_Word range_length;
5733 	  Dwarf_Word segment = 0;
5734 	  if (readp + 2 * address_size + segment_size > readendp)
5735 	    goto invalid_data;
5736 	  if (address_size == 4)
5737 	    {
5738 	      range_address = read_4ubyte_unaligned_inc (dbg, readp);
5739 	      range_length = read_4ubyte_unaligned_inc (dbg, readp);
5740 	    }
5741 	  else
5742 	    {
5743 	      range_address = read_8ubyte_unaligned_inc (dbg, readp);
5744 	      range_length = read_8ubyte_unaligned_inc (dbg, readp);
5745 	    }
5746 
5747 	  if (segment_size == 4)
5748 	    segment = read_4ubyte_unaligned_inc (dbg, readp);
5749 	  else if (segment_size == 8)
5750 	    segment = read_8ubyte_unaligned_inc (dbg, readp);
5751 
5752 	  if (range_address == 0 && range_length == 0 && segment == 0)
5753 	    break;
5754 
5755 	  printf ("   ");
5756 	  print_dwarf_addr (dwflmod, address_size, range_address,
5757 			    range_address);
5758 	  printf ("..");
5759 	  print_dwarf_addr (dwflmod, address_size,
5760 			    range_address + range_length - 1,
5761 			    range_length);
5762 	  if (segment_size != 0)
5763 	    printf (" (%" PRIx64 ")\n", (uint64_t) segment);
5764 	  else
5765 	    printf ("\n");
5766 	}
5767 
5768     next_table:
5769       if (readp != nexthdr)
5770 	{
5771 	  size_t padding = nexthdr - readp;
5772 	  printf (_("   %zu padding bytes\n"), padding);
5773 	  readp = nexthdr;
5774 	}
5775     }
5776 }
5777 
5778 
5779 static bool is_split_dwarf (Dwarf *dbg, uint64_t *id, Dwarf_CU **split_cu);
5780 
5781 /* Returns true and sets cu and cu_base if the given Dwarf is a split
5782    DWARF (.dwo) file.  */
5783 static bool
split_dwarf_cu_base(Dwarf * dbg,Dwarf_CU ** cu,Dwarf_Addr * cu_base)5784 split_dwarf_cu_base (Dwarf *dbg, Dwarf_CU **cu, Dwarf_Addr *cu_base)
5785 {
5786   uint64_t id;
5787   if (is_split_dwarf (dbg, &id, cu))
5788     {
5789       Dwarf_Die cudie;
5790       if (dwarf_cu_info (*cu, NULL, NULL, &cudie, NULL, NULL, NULL, NULL) == 0)
5791 	{
5792 	  *cu_base = cudie_base (&cudie);
5793 	  return true;
5794 	}
5795     }
5796   return false;
5797 }
5798 
5799 /* Print content of DWARF .debug_rnglists section.  */
5800 static void
print_debug_rnglists_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)5801 print_debug_rnglists_section (Dwfl_Module *dwflmod,
5802 			      Ebl *ebl,
5803 			      GElf_Ehdr *ehdr __attribute__ ((unused)),
5804 			      Elf_Scn *scn, GElf_Shdr *shdr,
5805 			      Dwarf *dbg __attribute__((unused)))
5806 {
5807   printf (_("\
5808 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
5809 	  elf_ndxscn (scn), section_name (ebl, shdr),
5810 	  (uint64_t) shdr->sh_offset);
5811 
5812   Elf_Data *data =(dbg->sectiondata[IDX_debug_rnglists]
5813 		   ?: elf_rawdata (scn, NULL));
5814   if (unlikely (data == NULL))
5815     {
5816       error (0, 0, _("cannot get .debug_rnglists content: %s"),
5817 	     elf_errmsg (-1));
5818       return;
5819     }
5820 
5821   /* For the listptr to get the base address/CU.  */
5822   sort_listptr (&known_rnglistptr, "rnglistptr");
5823   size_t listptr_idx = 0;
5824 
5825   const unsigned char *readp = data->d_buf;
5826   const unsigned char *const dataend = ((unsigned char *) data->d_buf
5827 					+ data->d_size);
5828   while (readp < dataend)
5829     {
5830       if (unlikely (readp > dataend - 4))
5831 	{
5832 	invalid_data:
5833 	  error (0, 0, _("invalid data in section [%zu] '%s'"),
5834 		 elf_ndxscn (scn), section_name (ebl, shdr));
5835 	  return;
5836 	}
5837 
5838       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
5839       printf (_("Table at Offset 0x%" PRIx64 ":\n\n"),
5840 	      (uint64_t) offset);
5841 
5842       uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
5843       unsigned int offset_size = 4;
5844       if (unlikely (unit_length == 0xffffffff))
5845 	{
5846 	  if (unlikely (readp > dataend - 8))
5847 	    goto invalid_data;
5848 
5849 	  unit_length = read_8ubyte_unaligned_inc (dbg, readp);
5850 	  offset_size = 8;
5851 	}
5852       printf (_(" Length:         %8" PRIu64 "\n"), unit_length);
5853 
5854       /* We need at least 2-bytes + 1-byte + 1-byte + 4-bytes = 8
5855 	 bytes to complete the header.  And this unit cannot go beyond
5856 	 the section data.  */
5857       if (readp > dataend - 8
5858 	  || unit_length < 8
5859 	  || unit_length > (uint64_t) (dataend - readp))
5860 	goto invalid_data;
5861 
5862       const unsigned char *nexthdr = readp + unit_length;
5863 
5864       uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
5865       printf (_(" DWARF version:  %8" PRIu16 "\n"), version);
5866 
5867       if (version != 5)
5868 	{
5869 	  error (0, 0, _("Unknown version"));
5870 	  goto next_table;
5871 	}
5872 
5873       uint8_t address_size = *readp++;
5874       printf (_(" Address size:   %8" PRIu64 "\n"),
5875 	      (uint64_t) address_size);
5876 
5877       if (address_size != 4 && address_size != 8)
5878 	{
5879 	  error (0, 0, _("unsupported address size"));
5880 	  goto next_table;
5881 	}
5882 
5883       uint8_t segment_size = *readp++;
5884       printf (_(" Segment size:   %8" PRIu64 "\n"),
5885 	      (uint64_t) segment_size);
5886 
5887       if (segment_size != 0 && segment_size != 4 && segment_size != 8)
5888         {
5889           error (0, 0, _("unsupported segment size"));
5890           goto next_table;
5891         }
5892 
5893       uint32_t offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
5894       printf (_(" Offset entries: %8" PRIu64 "\n"),
5895 	      (uint64_t) offset_entry_count);
5896 
5897       /* We need the CU that uses this unit to get the initial base address. */
5898       Dwarf_Addr cu_base = 0;
5899       struct Dwarf_CU *cu = NULL;
5900       if (listptr_cu (&known_rnglistptr, &listptr_idx,
5901 		      (Dwarf_Off) offset,
5902 		      (Dwarf_Off) (nexthdr - (unsigned char *) data->d_buf),
5903 		      &cu_base, &cu)
5904 	  || split_dwarf_cu_base (dbg, &cu, &cu_base))
5905 	{
5906 	  Dwarf_Die cudie;
5907 	  if (dwarf_cu_die (cu, &cudie,
5908 			    NULL, NULL, NULL, NULL,
5909 			    NULL, NULL) == NULL)
5910 	    printf (_(" Unknown CU base: "));
5911 	  else
5912 	    printf (_(" CU [%6" PRIx64 "] base: "),
5913 		    dwarf_dieoffset (&cudie));
5914 	  print_dwarf_addr (dwflmod, address_size, cu_base, cu_base);
5915 	  printf ("\n");
5916 	}
5917       else
5918 	printf (_(" Not associated with a CU.\n"));
5919 
5920       printf ("\n");
5921 
5922       const unsigned char *offset_array_start = readp;
5923       if (offset_entry_count > 0)
5924 	{
5925 	  uint64_t max_entries = (unit_length - 8) / offset_size;
5926 	  if (offset_entry_count > max_entries)
5927 	    {
5928 	      error (0, 0,
5929 		     _("too many offset entries for unit length"));
5930 	      offset_entry_count = max_entries;
5931 	    }
5932 
5933 	  printf (_("  Offsets starting at 0x%" PRIx64 ":\n"),
5934 		  (uint64_t) (offset_array_start
5935 			      - (unsigned char *) data->d_buf));
5936 	  for (uint32_t idx = 0; idx < offset_entry_count; idx++)
5937 	    {
5938 	      printf ("   [%6" PRIu32 "] ", idx);
5939 	      if (offset_size == 4)
5940 		{
5941 		  uint32_t off = read_4ubyte_unaligned_inc (dbg, readp);
5942 		  printf ("0x%" PRIx32 "\n", off);
5943 		}
5944 	      else
5945 		{
5946 		  uint64_t off = read_8ubyte_unaligned_inc (dbg, readp);
5947 		  printf ("0x%" PRIx64 "\n", off);
5948 		}
5949 	    }
5950 	  printf ("\n");
5951 	}
5952 
5953       Dwarf_Addr base = cu_base;
5954       bool start_of_list = true;
5955       while (readp < nexthdr)
5956 	{
5957 	  uint8_t kind = *readp++;
5958 	  uint64_t op1, op2;
5959 
5960 	  /* Skip padding.  */
5961 	  if (start_of_list && kind == DW_RLE_end_of_list)
5962 	    continue;
5963 
5964 	  if (start_of_list)
5965 	    {
5966 	      base = cu_base;
5967 	      printf ("  Offset: %" PRIx64 ", Index: %" PRIx64 "\n",
5968 		      (uint64_t) (readp - (unsigned char *) data->d_buf - 1),
5969 		      (uint64_t) (readp - offset_array_start - 1));
5970 	      start_of_list = false;
5971 	    }
5972 
5973 	  printf ("    %s", dwarf_range_list_encoding_name (kind));
5974 	  switch (kind)
5975 	    {
5976 	    case DW_RLE_end_of_list:
5977 	      start_of_list = true;
5978 	      printf ("\n\n");
5979 	      break;
5980 
5981 	    case DW_RLE_base_addressx:
5982 	      if ((uint64_t) (nexthdr - readp) < 1)
5983 		{
5984 		invalid_range:
5985 		  error (0, 0, _("invalid range list data"));
5986 		  goto next_table;
5987 		}
5988 	      get_uleb128 (op1, readp, nexthdr);
5989 	      printf (" %" PRIx64 "\n", op1);
5990 	      if (! print_unresolved_addresses)
5991 		{
5992 		  Dwarf_Addr addr;
5993 		  if (get_indexed_addr (cu, op1, &addr) != 0)
5994 		    printf ("      ???\n");
5995 		  else
5996 		    {
5997 		      printf ("      ");
5998 		      print_dwarf_addr (dwflmod, address_size, addr, addr);
5999 		      printf ("\n");
6000 		    }
6001 		}
6002 	      break;
6003 
6004 	    case DW_RLE_startx_endx:
6005 	      if ((uint64_t) (nexthdr - readp) < 1)
6006 		goto invalid_range;
6007 	      get_uleb128 (op1, readp, nexthdr);
6008 	      if ((uint64_t) (nexthdr - readp) < 1)
6009 		goto invalid_range;
6010 	      get_uleb128 (op2, readp, nexthdr);
6011 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
6012 	      if (! print_unresolved_addresses)
6013 		{
6014 		  Dwarf_Addr addr1;
6015 		  Dwarf_Addr addr2;
6016 		  if (get_indexed_addr (cu, op1, &addr1) != 0
6017 		      || get_indexed_addr (cu, op2, &addr2) != 0)
6018 		    {
6019 		      printf ("      ???..\n");
6020 		      printf ("      ???\n");
6021 		    }
6022 		  else
6023 		    {
6024 		      printf ("      ");
6025 		      print_dwarf_addr (dwflmod, address_size, addr1, addr1);
6026 		      printf ("..\n      ");
6027 		      print_dwarf_addr (dwflmod, address_size,
6028 					addr2 - 1, addr2);
6029 		      printf ("\n");
6030 		    }
6031 		}
6032 	      break;
6033 
6034 	    case DW_RLE_startx_length:
6035 	      if ((uint64_t) (nexthdr - readp) < 1)
6036 		goto invalid_range;
6037 	      get_uleb128 (op1, readp, nexthdr);
6038 	      if ((uint64_t) (nexthdr - readp) < 1)
6039 		goto invalid_range;
6040 	      get_uleb128 (op2, readp, nexthdr);
6041 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
6042 	      if (! print_unresolved_addresses)
6043 		{
6044 		  Dwarf_Addr addr1;
6045 		  Dwarf_Addr addr2;
6046 		  if (get_indexed_addr (cu, op1, &addr1) != 0)
6047 		    {
6048 		      printf ("      ???..\n");
6049 		      printf ("      ???\n");
6050 		    }
6051 		  else
6052 		    {
6053 		      addr2 = addr1 + op2;
6054 		      printf ("      ");
6055 		      print_dwarf_addr (dwflmod, address_size, addr1, addr1);
6056 		      printf ("..\n      ");
6057 		      print_dwarf_addr (dwflmod, address_size,
6058 					addr2 - 1, addr2);
6059 		      printf ("\n");
6060 		    }
6061 		}
6062 	      break;
6063 
6064 	    case DW_RLE_offset_pair:
6065 	      if ((uint64_t) (nexthdr - readp) < 1)
6066 		goto invalid_range;
6067 	      get_uleb128 (op1, readp, nexthdr);
6068 	      if ((uint64_t) (nexthdr - readp) < 1)
6069 		goto invalid_range;
6070 	      get_uleb128 (op2, readp, nexthdr);
6071 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
6072 	      if (! print_unresolved_addresses)
6073 		{
6074 		  op1 += base;
6075 		  op2 += base;
6076 		  printf ("      ");
6077 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
6078 		  printf ("..\n      ");
6079 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
6080 		  printf ("\n");
6081 		}
6082 	      break;
6083 
6084 	    case DW_RLE_base_address:
6085 	      if (address_size == 4)
6086 		{
6087 		  if ((uint64_t) (nexthdr - readp) < 4)
6088 		    goto invalid_range;
6089 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
6090 		}
6091 	      else
6092 		{
6093 		  if ((uint64_t) (nexthdr - readp) < 8)
6094 		    goto invalid_range;
6095 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
6096 		}
6097 	      base = op1;
6098 	      printf (" 0x%" PRIx64 "\n", base);
6099 	      if (! print_unresolved_addresses)
6100 		{
6101 		  printf ("      ");
6102 		  print_dwarf_addr (dwflmod, address_size, base, base);
6103 		  printf ("\n");
6104 		}
6105 	      break;
6106 
6107 	    case DW_RLE_start_end:
6108 	      if (address_size == 4)
6109 		{
6110 		  if ((uint64_t) (nexthdr - readp) < 8)
6111 		    goto invalid_range;
6112 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
6113 		  op2 = read_4ubyte_unaligned_inc (dbg, readp);
6114 		}
6115 	      else
6116 		{
6117 		  if ((uint64_t) (nexthdr - readp) < 16)
6118 		    goto invalid_range;
6119 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
6120 		  op2 = read_8ubyte_unaligned_inc (dbg, readp);
6121 		}
6122 	      printf (" 0x%" PRIx64 "..0x%" PRIx64 "\n", op1, op2);
6123 	      if (! print_unresolved_addresses)
6124 		{
6125 		  printf ("      ");
6126 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
6127 		  printf ("..\n      ");
6128 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
6129 		  printf ("\n");
6130 		}
6131 	      break;
6132 
6133 	    case DW_RLE_start_length:
6134 	      if (address_size == 4)
6135 		{
6136 		  if ((uint64_t) (nexthdr - readp) < 4)
6137 		    goto invalid_range;
6138 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
6139 		}
6140 	      else
6141 		{
6142 		  if ((uint64_t) (nexthdr - readp) < 8)
6143 		    goto invalid_range;
6144 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
6145 		}
6146 	      if ((uint64_t) (nexthdr - readp) < 1)
6147 		goto invalid_range;
6148 	      get_uleb128 (op2, readp, nexthdr);
6149 	      printf (" 0x%" PRIx64 ", %" PRIx64 "\n", op1, op2);
6150 	      if (! print_unresolved_addresses)
6151 		{
6152 		  op2 = op1 + op2;
6153 		  printf ("      ");
6154 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
6155 		  printf ("..\n      ");
6156 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
6157 		  printf ("\n");
6158 		}
6159 	      break;
6160 
6161 	    default:
6162 	      goto invalid_range;
6163 	    }
6164 	}
6165 
6166     next_table:
6167       if (readp != nexthdr)
6168 	{
6169           size_t padding = nexthdr - readp;
6170           printf (_("   %zu padding bytes\n\n"), padding);
6171 	  readp = nexthdr;
6172 	}
6173     }
6174 }
6175 
6176 /* Print content of DWARF .debug_ranges section.  */
6177 static void
print_debug_ranges_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)6178 print_debug_ranges_section (Dwfl_Module *dwflmod,
6179 			    Ebl *ebl, GElf_Ehdr *ehdr,
6180 			    Elf_Scn *scn, GElf_Shdr *shdr,
6181 			    Dwarf *dbg)
6182 {
6183   Elf_Data *data = (dbg->sectiondata[IDX_debug_ranges]
6184 		    ?: elf_rawdata (scn, NULL));
6185   if (unlikely (data == NULL))
6186     {
6187       error (0, 0, _("cannot get .debug_ranges content: %s"),
6188 	     elf_errmsg (-1));
6189       return;
6190     }
6191 
6192   printf (_("\
6193 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
6194 	  elf_ndxscn (scn), section_name (ebl, shdr),
6195 	  (uint64_t) shdr->sh_offset);
6196 
6197   sort_listptr (&known_rangelistptr, "rangelistptr");
6198   size_t listptr_idx = 0;
6199 
6200   uint_fast8_t address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
6201 
6202   bool first = true;
6203   Dwarf_Addr base = 0;
6204   unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size;
6205   unsigned char *readp = data->d_buf;
6206   Dwarf_CU *last_cu = NULL;
6207   while (readp < endp)
6208     {
6209       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
6210       Dwarf_CU *cu = last_cu;
6211 
6212       if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx,
6213 				      &address_size, NULL, &base, &cu,
6214 				      offset, &readp, endp, NULL))
6215 	continue;
6216 
6217       if (last_cu != cu)
6218 	{
6219 	  Dwarf_Die cudie;
6220 	  if (dwarf_cu_die (cu, &cudie,
6221 			    NULL, NULL, NULL, NULL,
6222 			    NULL, NULL) == NULL)
6223 	    printf (_("\n Unknown CU base: "));
6224 	  else
6225 	    printf (_("\n CU [%6" PRIx64 "] base: "),
6226 		    dwarf_dieoffset (&cudie));
6227 	  print_dwarf_addr (dwflmod, address_size, base, base);
6228 	  printf ("\n");
6229 	}
6230       last_cu = cu;
6231 
6232       if (unlikely (data->d_size - offset < (size_t) address_size * 2))
6233 	{
6234 	  printf (_(" [%6tx]  <INVALID DATA>\n"), offset);
6235 	  break;
6236 	}
6237 
6238       Dwarf_Addr begin;
6239       Dwarf_Addr end;
6240       if (address_size == 8)
6241 	{
6242 	  begin = read_8ubyte_unaligned_inc (dbg, readp);
6243 	  end = read_8ubyte_unaligned_inc (dbg, readp);
6244 	}
6245       else
6246 	{
6247 	  begin = read_4ubyte_unaligned_inc (dbg, readp);
6248 	  end = read_4ubyte_unaligned_inc (dbg, readp);
6249 	  if (begin == (Dwarf_Addr) (uint32_t) -1)
6250 	    begin = (Dwarf_Addr) -1l;
6251 	}
6252 
6253       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
6254 	{
6255 	  if (first)
6256 	    printf (" [%6tx] ", offset);
6257 	  else
6258 	    printf ("          ");
6259 	  puts (_("base address"));
6260 	  printf ("          ");
6261 	  print_dwarf_addr (dwflmod, address_size, end, end);
6262 	  printf ("\n");
6263 	  base = end;
6264 	  first = false;
6265 	}
6266       else if (begin == 0 && end == 0) /* End of list entry.  */
6267 	{
6268 	  if (first)
6269 	    printf (_(" [%6tx] empty list\n"), offset);
6270 	  first = true;
6271 	}
6272       else
6273 	{
6274 	  /* We have an address range entry.  */
6275 	  if (first)		/* First address range entry in a list.  */
6276 	    printf (" [%6tx] ", offset);
6277 	  else
6278 	    printf ("          ");
6279 
6280 	  printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end);
6281 	  if (! print_unresolved_addresses)
6282 	    {
6283 	      printf ("          ");
6284 	      print_dwarf_addr (dwflmod, address_size, base + begin,
6285 			        base + begin);
6286 	      printf ("..\n          ");
6287 	      print_dwarf_addr (dwflmod, address_size,
6288 				base + end - 1, base + end);
6289 	      printf ("\n");
6290 	    }
6291 
6292 	  first = false;
6293 	}
6294     }
6295 }
6296 
6297 #define REGNAMESZ 16
6298 static const char *
register_info(Ebl * ebl,unsigned int regno,const Ebl_Register_Location * loc,char name[REGNAMESZ],int * bits,int * type)6299 register_info (Ebl *ebl, unsigned int regno, const Ebl_Register_Location *loc,
6300 	       char name[REGNAMESZ], int *bits, int *type)
6301 {
6302   const char *set;
6303   const char *pfx;
6304   int ignore;
6305   ssize_t n = ebl_register_info (ebl, regno, name, REGNAMESZ, &pfx, &set,
6306 				 bits ?: &ignore, type ?: &ignore);
6307   if (n <= 0)
6308     {
6309       if (loc != NULL)
6310 	snprintf (name, REGNAMESZ, "reg%u", loc->regno);
6311       else
6312 	snprintf (name, REGNAMESZ, "??? 0x%x", regno);
6313       if (bits != NULL)
6314 	*bits = loc != NULL ? loc->bits : 0;
6315       if (type != NULL)
6316 	*type = DW_ATE_unsigned;
6317       set = "??? unrecognized";
6318     }
6319   else
6320     {
6321       if (bits != NULL && *bits <= 0)
6322 	*bits = loc != NULL ? loc->bits : 0;
6323       if (type != NULL && *type == DW_ATE_void)
6324 	*type = DW_ATE_unsigned;
6325 
6326     }
6327   return set;
6328 }
6329 
6330 static const unsigned char *
read_encoded(unsigned int encoding,const unsigned char * readp,const unsigned char * const endp,uint64_t * res,Dwarf * dbg)6331 read_encoded (unsigned int encoding, const unsigned char *readp,
6332 	      const unsigned char *const endp, uint64_t *res, Dwarf *dbg)
6333 {
6334   if ((encoding & 0xf) == DW_EH_PE_absptr)
6335     encoding = gelf_getclass (dbg->elf) == ELFCLASS32
6336       ? DW_EH_PE_udata4 : DW_EH_PE_udata8;
6337 
6338   switch (encoding & 0xf)
6339     {
6340     case DW_EH_PE_uleb128:
6341       get_uleb128 (*res, readp, endp);
6342       break;
6343     case DW_EH_PE_sleb128:
6344       get_sleb128 (*res, readp, endp);
6345       break;
6346     case DW_EH_PE_udata2:
6347       if (readp + 2 > endp)
6348 	goto invalid;
6349       *res = read_2ubyte_unaligned_inc (dbg, readp);
6350       break;
6351     case DW_EH_PE_udata4:
6352       if (readp + 4 > endp)
6353 	goto invalid;
6354       *res = read_4ubyte_unaligned_inc (dbg, readp);
6355       break;
6356     case DW_EH_PE_udata8:
6357       if (readp + 8 > endp)
6358 	goto invalid;
6359       *res = read_8ubyte_unaligned_inc (dbg, readp);
6360       break;
6361     case DW_EH_PE_sdata2:
6362       if (readp + 2 > endp)
6363 	goto invalid;
6364       *res = read_2sbyte_unaligned_inc (dbg, readp);
6365       break;
6366     case DW_EH_PE_sdata4:
6367       if (readp + 4 > endp)
6368 	goto invalid;
6369       *res = read_4sbyte_unaligned_inc (dbg, readp);
6370       break;
6371     case DW_EH_PE_sdata8:
6372       if (readp + 8 > endp)
6373 	goto invalid;
6374       *res = read_8sbyte_unaligned_inc (dbg, readp);
6375       break;
6376     default:
6377     invalid:
6378       error (1, 0,
6379 	     _("invalid encoding"));
6380     }
6381 
6382   return readp;
6383 }
6384 
6385 static const char *
regname(Ebl * ebl,unsigned int regno,char * regnamebuf)6386 regname (Ebl *ebl, unsigned int regno, char *regnamebuf)
6387 {
6388   register_info (ebl, regno, NULL, regnamebuf, NULL, NULL);
6389 
6390   return regnamebuf;
6391 }
6392 
6393 static void
print_cfa_program(const unsigned char * readp,const unsigned char * const endp,Dwarf_Word vma_base,unsigned int code_align,int data_align,unsigned int version,unsigned int ptr_size,unsigned int encoding,Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Dwarf * dbg)6394 print_cfa_program (const unsigned char *readp, const unsigned char *const endp,
6395 		   Dwarf_Word vma_base, unsigned int code_align,
6396 		   int data_align,
6397 		   unsigned int version, unsigned int ptr_size,
6398 		   unsigned int encoding,
6399 		   Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, Dwarf *dbg)
6400 {
6401   char regnamebuf[REGNAMESZ];
6402 
6403   puts ("\n   Program:");
6404   Dwarf_Word pc = vma_base;
6405   while (readp < endp)
6406     {
6407       unsigned int opcode = *readp++;
6408 
6409       if (opcode < DW_CFA_advance_loc)
6410 	/* Extended opcode.  */
6411 	switch (opcode)
6412 	  {
6413 	    uint64_t op1;
6414 	    int64_t sop1;
6415 	    uint64_t op2;
6416 	    int64_t sop2;
6417 
6418 	  case DW_CFA_nop:
6419 	    puts ("     nop");
6420 	    break;
6421 	  case DW_CFA_set_loc:
6422 	    if ((uint64_t) (endp - readp) < 1)
6423 	      goto invalid;
6424 	    readp = read_encoded (encoding, readp, endp, &op1, dbg);
6425 	    printf ("     set_loc %#" PRIx64 " to %#" PRIx64 "\n",
6426 		    op1, pc = vma_base + op1);
6427 	    break;
6428 	  case DW_CFA_advance_loc1:
6429 	    if ((uint64_t) (endp - readp) < 1)
6430 	      goto invalid;
6431 	    printf ("     advance_loc1 %u to %#" PRIx64 "\n",
6432 		    *readp, pc += *readp * code_align);
6433 	    ++readp;
6434 	    break;
6435 	  case DW_CFA_advance_loc2:
6436 	    if ((uint64_t) (endp - readp) < 2)
6437 	      goto invalid;
6438 	    op1 = read_2ubyte_unaligned_inc (dbg, readp);
6439 	    printf ("     advance_loc2 %" PRIu64 " to %#" PRIx64 "\n",
6440 		    op1, pc += op1 * code_align);
6441 	    break;
6442 	  case DW_CFA_advance_loc4:
6443 	    if ((uint64_t) (endp - readp) < 4)
6444 	      goto invalid;
6445 	    op1 = read_4ubyte_unaligned_inc (dbg, readp);
6446 	    printf ("     advance_loc4 %" PRIu64 " to %#" PRIx64 "\n",
6447 		    op1, pc += op1 * code_align);
6448 	    break;
6449 	  case DW_CFA_offset_extended:
6450 	    if ((uint64_t) (endp - readp) < 1)
6451 	      goto invalid;
6452 	    get_uleb128 (op1, readp, endp);
6453 	    if ((uint64_t) (endp - readp) < 1)
6454 	      goto invalid;
6455 	    get_uleb128 (op2, readp, endp);
6456 	    printf ("     offset_extended r%" PRIu64 " (%s) at cfa%+" PRId64
6457 		    "\n",
6458 		    op1, regname (ebl, op1, regnamebuf), op2 * data_align);
6459 	    break;
6460 	  case DW_CFA_restore_extended:
6461 	    if ((uint64_t) (endp - readp) < 1)
6462 	      goto invalid;
6463 	    get_uleb128 (op1, readp, endp);
6464 	    printf ("     restore_extended r%" PRIu64 " (%s)\n",
6465 		    op1, regname (ebl, op1, regnamebuf));
6466 	    break;
6467 	  case DW_CFA_undefined:
6468 	    if ((uint64_t) (endp - readp) < 1)
6469 	      goto invalid;
6470 	    get_uleb128 (op1, readp, endp);
6471 	    printf ("     undefined r%" PRIu64 " (%s)\n", op1,
6472 		    regname (ebl, op1, regnamebuf));
6473 	    break;
6474 	  case DW_CFA_same_value:
6475 	    if ((uint64_t) (endp - readp) < 1)
6476 	      goto invalid;
6477 	    get_uleb128 (op1, readp, endp);
6478 	    printf ("     same_value r%" PRIu64 " (%s)\n", op1,
6479 		    regname (ebl, op1, regnamebuf));
6480 	    break;
6481 	  case DW_CFA_register:
6482 	    if ((uint64_t) (endp - readp) < 1)
6483 	      goto invalid;
6484 	    get_uleb128 (op1, readp, endp);
6485 	    if ((uint64_t) (endp - readp) < 1)
6486 	      goto invalid;
6487 	    get_uleb128 (op2, readp, endp);
6488 	    printf ("     register r%" PRIu64 " (%s) in r%" PRIu64 " (%s)\n",
6489 		    op1, regname (ebl, op1, regnamebuf), op2,
6490 		    regname (ebl, op2, regnamebuf));
6491 	    break;
6492 	  case DW_CFA_remember_state:
6493 	    puts ("     remember_state");
6494 	    break;
6495 	  case DW_CFA_restore_state:
6496 	    puts ("     restore_state");
6497 	    break;
6498 	  case DW_CFA_def_cfa:
6499 	    if ((uint64_t) (endp - readp) < 1)
6500 	      goto invalid;
6501 	    get_uleb128 (op1, readp, endp);
6502 	    if ((uint64_t) (endp - readp) < 1)
6503 	      goto invalid;
6504 	    get_uleb128 (op2, readp, endp);
6505 	    printf ("     def_cfa r%" PRIu64 " (%s) at offset %" PRIu64 "\n",
6506 		    op1, regname (ebl, op1, regnamebuf), op2);
6507 	    break;
6508 	  case DW_CFA_def_cfa_register:
6509 	    if ((uint64_t) (endp - readp) < 1)
6510 	      goto invalid;
6511 	    get_uleb128 (op1, readp, endp);
6512 	    printf ("     def_cfa_register r%" PRIu64 " (%s)\n",
6513 		    op1, regname (ebl, op1, regnamebuf));
6514 	    break;
6515 	  case DW_CFA_def_cfa_offset:
6516 	    if ((uint64_t) (endp - readp) < 1)
6517 	      goto invalid;
6518 	    get_uleb128 (op1, readp, endp);
6519 	    printf ("     def_cfa_offset %" PRIu64 "\n", op1);
6520 	    break;
6521 	  case DW_CFA_def_cfa_expression:
6522 	    if ((uint64_t) (endp - readp) < 1)
6523 	      goto invalid;
6524 	    get_uleb128 (op1, readp, endp);	/* Length of DW_FORM_block.  */
6525 	    printf ("     def_cfa_expression %" PRIu64 "\n", op1);
6526 	    if ((uint64_t) (endp - readp) < op1)
6527 	      {
6528 	    invalid:
6529 	        fputs (_("         <INVALID DATA>\n"), stdout);
6530 		return;
6531 	      }
6532 	    print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, NULL,
6533 		       op1, readp);
6534 	    readp += op1;
6535 	    break;
6536 	  case DW_CFA_expression:
6537 	    if ((uint64_t) (endp - readp) < 1)
6538 	      goto invalid;
6539 	    get_uleb128 (op1, readp, endp);
6540 	    if ((uint64_t) (endp - readp) < 1)
6541 	      goto invalid;
6542 	    get_uleb128 (op2, readp, endp);	/* Length of DW_FORM_block.  */
6543 	    printf ("     expression r%" PRIu64 " (%s) \n",
6544 		    op1, regname (ebl, op1, regnamebuf));
6545 	    if ((uint64_t) (endp - readp) < op2)
6546 	      goto invalid;
6547 	    print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, NULL,
6548 		       op2, readp);
6549 	    readp += op2;
6550 	    break;
6551 	  case DW_CFA_offset_extended_sf:
6552 	    if ((uint64_t) (endp - readp) < 1)
6553 	      goto invalid;
6554 	    get_uleb128 (op1, readp, endp);
6555 	    if ((uint64_t) (endp - readp) < 1)
6556 	      goto invalid;
6557 	    get_sleb128 (sop2, readp, endp);
6558 	    printf ("     offset_extended_sf r%" PRIu64 " (%s) at cfa%+"
6559 		    PRId64 "\n",
6560 		    op1, regname (ebl, op1, regnamebuf), sop2 * data_align);
6561 	    break;
6562 	  case DW_CFA_def_cfa_sf:
6563 	    if ((uint64_t) (endp - readp) < 1)
6564 	      goto invalid;
6565 	    get_uleb128 (op1, readp, endp);
6566 	    if ((uint64_t) (endp - readp) < 1)
6567 	      goto invalid;
6568 	    get_sleb128 (sop2, readp, endp);
6569 	    printf ("     def_cfa_sf r%" PRIu64 " (%s) at offset %" PRId64 "\n",
6570 		    op1, regname (ebl, op1, regnamebuf), sop2 * data_align);
6571 	    break;
6572 	  case DW_CFA_def_cfa_offset_sf:
6573 	    if ((uint64_t) (endp - readp) < 1)
6574 	      goto invalid;
6575 	    get_sleb128 (sop1, readp, endp);
6576 	    printf ("     def_cfa_offset_sf %" PRId64 "\n", sop1 * data_align);
6577 	    break;
6578 	  case DW_CFA_val_offset:
6579 	    if ((uint64_t) (endp - readp) < 1)
6580 	      goto invalid;
6581 	    get_uleb128 (op1, readp, endp);
6582 	    if ((uint64_t) (endp - readp) < 1)
6583 	      goto invalid;
6584 	    get_uleb128 (op2, readp, endp);
6585 	    printf ("     val_offset %" PRIu64 " at offset %" PRIu64 "\n",
6586 		    op1, op2 * data_align);
6587 	    break;
6588 	  case DW_CFA_val_offset_sf:
6589 	    if ((uint64_t) (endp - readp) < 1)
6590 	      goto invalid;
6591 	    get_uleb128 (op1, readp, endp);
6592 	    if ((uint64_t) (endp - readp) < 1)
6593 	      goto invalid;
6594 	    get_sleb128 (sop2, readp, endp);
6595 	    printf ("     val_offset_sf %" PRIu64 " at offset %" PRId64 "\n",
6596 		    op1, sop2 * data_align);
6597 	    break;
6598 	  case DW_CFA_val_expression:
6599 	    if ((uint64_t) (endp - readp) < 1)
6600 	      goto invalid;
6601 	    get_uleb128 (op1, readp, endp);
6602 	    if ((uint64_t) (endp - readp) < 1)
6603 	      goto invalid;
6604 	    get_uleb128 (op2, readp, endp);	/* Length of DW_FORM_block.  */
6605 	    printf ("     val_expression r%" PRIu64 " (%s)\n",
6606 		    op1, regname (ebl, op1, regnamebuf));
6607 	    if ((uint64_t) (endp - readp) < op2)
6608 	      goto invalid;
6609 	    print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0,
6610 		       NULL, op2, readp);
6611 	    readp += op2;
6612 	    break;
6613 	  case DW_CFA_MIPS_advance_loc8:
6614 	    if ((uint64_t) (endp - readp) < 8)
6615 	      goto invalid;
6616 	    op1 = read_8ubyte_unaligned_inc (dbg, readp);
6617 	    printf ("     MIPS_advance_loc8 %" PRIu64 " to %#" PRIx64 "\n",
6618 		    op1, pc += op1 * code_align);
6619 	    break;
6620 	  case DW_CFA_GNU_window_save:  /* DW_CFA_AARCH64_negate_ra_state  */
6621 	    if (ehdr->e_machine == EM_AARCH64)
6622 	      puts ("     AARCH64_negate_ra_state");
6623 	    else
6624 	      puts ("     GNU_window_save");
6625 	    break;
6626 	  case DW_CFA_GNU_args_size:
6627 	    if ((uint64_t) (endp - readp) < 1)
6628 	      goto invalid;
6629 	    get_uleb128 (op1, readp, endp);
6630 	    printf ("     args_size %" PRIu64 "\n", op1);
6631 	    break;
6632 	  default:
6633 	    printf ("     ??? (%u)\n", opcode);
6634 	    break;
6635 	  }
6636       else if (opcode < DW_CFA_offset)
6637 	printf ("     advance_loc %u to %#" PRIx64 "\n",
6638 		opcode & 0x3f, pc += (opcode & 0x3f) * code_align);
6639       else if (opcode < DW_CFA_restore)
6640 	{
6641 	  uint64_t offset;
6642 	  if ((uint64_t) (endp - readp) < 1)
6643 	    goto invalid;
6644 	  get_uleb128 (offset, readp, endp);
6645 	  printf ("     offset r%u (%s) at cfa%+" PRId64 "\n",
6646 		  opcode & 0x3f, regname (ebl, opcode & 0x3f, regnamebuf),
6647 		  offset * data_align);
6648 	}
6649       else
6650 	printf ("     restore r%u (%s)\n",
6651 		opcode & 0x3f, regname (ebl, opcode & 0x3f, regnamebuf));
6652     }
6653 }
6654 
6655 
6656 static unsigned int
encoded_ptr_size(int encoding,unsigned int ptr_size)6657 encoded_ptr_size (int encoding, unsigned int ptr_size)
6658 {
6659   switch (encoding & 7)
6660     {
6661     case DW_EH_PE_udata4:
6662       return 4;
6663     case DW_EH_PE_udata8:
6664       return 8;
6665     case 0:
6666       return ptr_size;
6667     }
6668 
6669   fprintf (stderr, "Unsupported pointer encoding: %#x, "
6670 	   "assuming pointer size of %d.\n", encoding, ptr_size);
6671   return ptr_size;
6672 }
6673 
6674 
6675 static unsigned int
print_encoding(unsigned int val)6676 print_encoding (unsigned int val)
6677 {
6678   switch (val & 0xf)
6679     {
6680     case DW_EH_PE_absptr:
6681       fputs ("absptr", stdout);
6682       break;
6683     case DW_EH_PE_uleb128:
6684       fputs ("uleb128", stdout);
6685       break;
6686     case DW_EH_PE_udata2:
6687       fputs ("udata2", stdout);
6688       break;
6689     case DW_EH_PE_udata4:
6690       fputs ("udata4", stdout);
6691       break;
6692     case DW_EH_PE_udata8:
6693       fputs ("udata8", stdout);
6694       break;
6695     case DW_EH_PE_sleb128:
6696       fputs ("sleb128", stdout);
6697       break;
6698     case DW_EH_PE_sdata2:
6699       fputs ("sdata2", stdout);
6700       break;
6701     case DW_EH_PE_sdata4:
6702       fputs ("sdata4", stdout);
6703       break;
6704     case DW_EH_PE_sdata8:
6705       fputs ("sdata8", stdout);
6706       break;
6707     default:
6708       /* We did not use any of the bits after all.  */
6709       return val;
6710     }
6711 
6712   return val & ~0xf;
6713 }
6714 
6715 
6716 static unsigned int
print_relinfo(unsigned int val)6717 print_relinfo (unsigned int val)
6718 {
6719   switch (val & 0x70)
6720     {
6721     case DW_EH_PE_pcrel:
6722       fputs ("pcrel", stdout);
6723       break;
6724     case DW_EH_PE_textrel:
6725       fputs ("textrel", stdout);
6726       break;
6727     case DW_EH_PE_datarel:
6728       fputs ("datarel", stdout);
6729       break;
6730     case DW_EH_PE_funcrel:
6731       fputs ("funcrel", stdout);
6732       break;
6733     case DW_EH_PE_aligned:
6734       fputs ("aligned", stdout);
6735       break;
6736     default:
6737       return val;
6738     }
6739 
6740   return val & ~0x70;
6741 }
6742 
6743 
6744 static void
print_encoding_base(const char * pfx,unsigned int fde_encoding)6745 print_encoding_base (const char *pfx, unsigned int fde_encoding)
6746 {
6747   printf ("(%s", pfx);
6748 
6749   if (fde_encoding == DW_EH_PE_omit)
6750     puts ("omit)");
6751   else
6752     {
6753       unsigned int w = fde_encoding;
6754 
6755       w = print_encoding (w);
6756 
6757       if (w & 0x70)
6758 	{
6759 	  if (w != fde_encoding)
6760 	    fputc_unlocked (' ', stdout);
6761 
6762 	  w = print_relinfo (w);
6763 	}
6764 
6765       if (w != 0)
6766 	printf ("%s%x", w != fde_encoding ? " " : "", w);
6767 
6768       puts (")");
6769     }
6770 }
6771 
6772 
6773 static void
print_debug_frame_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)6774 print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
6775 			   Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
6776 {
6777   size_t shstrndx;
6778   /* We know this call will succeed since it did in the caller.  */
6779   (void) elf_getshdrstrndx (ebl->elf, &shstrndx);
6780   const char *scnname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
6781 
6782   /* Needed if we find PC-relative addresses.  */
6783   GElf_Addr bias;
6784   if (dwfl_module_getelf (dwflmod, &bias) == NULL)
6785     {
6786       error (0, 0, _("cannot get ELF: %s"), dwfl_errmsg (-1));
6787       return;
6788     }
6789 
6790   bool is_eh_frame = strcmp (scnname, ".eh_frame") == 0;
6791   Elf_Data *data = (is_eh_frame
6792 		    ? elf_rawdata (scn, NULL)
6793 		    : (dbg->sectiondata[IDX_debug_frame]
6794 		       ?: elf_rawdata (scn, NULL)));
6795 
6796   if (unlikely (data == NULL))
6797     {
6798       error (0, 0, _("cannot get %s content: %s"),
6799 	     scnname, elf_errmsg (-1));
6800       return;
6801     }
6802 
6803   if (is_eh_frame)
6804     printf (_("\
6805 \nCall frame information section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
6806 	    elf_ndxscn (scn), scnname, (uint64_t) shdr->sh_offset);
6807   else
6808     printf (_("\
6809 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
6810 	    elf_ndxscn (scn), scnname, (uint64_t) shdr->sh_offset);
6811 
6812   struct cieinfo
6813   {
6814     ptrdiff_t cie_offset;
6815     const char *augmentation;
6816     unsigned int code_alignment_factor;
6817     unsigned int data_alignment_factor;
6818     uint8_t address_size;
6819     uint8_t fde_encoding;
6820     uint8_t lsda_encoding;
6821     struct cieinfo *next;
6822   } *cies = NULL;
6823 
6824   const unsigned char *readp = data->d_buf;
6825   const unsigned char *const dataend = ((unsigned char *) data->d_buf
6826 					+ data->d_size);
6827   while (readp < dataend)
6828     {
6829       if (unlikely (readp + 4 > dataend))
6830 	{
6831 	invalid_data:
6832 	  error (0, 0, _("invalid data in section [%zu] '%s'"),
6833 		     elf_ndxscn (scn), scnname);
6834 	      return;
6835 	}
6836 
6837       /* At the beginning there must be a CIE.  There can be multiple,
6838 	 hence we test tis in a loop.  */
6839       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
6840 
6841       Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, readp);
6842       unsigned int length = 4;
6843       if (unlikely (unit_length == 0xffffffff))
6844 	{
6845 	  if (unlikely (readp + 8 > dataend))
6846 	    goto invalid_data;
6847 
6848 	  unit_length = read_8ubyte_unaligned_inc (dbg, readp);
6849 	  length = 8;
6850 	}
6851 
6852       if (unlikely (unit_length == 0))
6853 	{
6854 	  printf (_("\n [%6tx] Zero terminator\n"), offset);
6855 	  continue;
6856 	}
6857 
6858       Dwarf_Word maxsize = dataend - readp;
6859       if (unlikely (unit_length > maxsize))
6860 	goto invalid_data;
6861 
6862       unsigned int ptr_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
6863 
6864       ptrdiff_t start = readp - (unsigned char *) data->d_buf;
6865       const unsigned char *const cieend = readp + unit_length;
6866       if (unlikely (cieend > dataend))
6867 	goto invalid_data;
6868 
6869       Dwarf_Off cie_id;
6870       if (length == 4)
6871 	{
6872 	  if (unlikely (cieend - readp < 4))
6873 	    goto invalid_data;
6874 	  cie_id = read_4ubyte_unaligned_inc (dbg, readp);
6875 	  if (!is_eh_frame && cie_id == DW_CIE_ID_32)
6876 	    cie_id = DW_CIE_ID_64;
6877 	}
6878       else
6879 	{
6880 	  if (unlikely (cieend - readp < 8))
6881 	    goto invalid_data;
6882 	  cie_id = read_8ubyte_unaligned_inc (dbg, readp);
6883 	}
6884 
6885       uint_fast8_t version = 2;
6886       unsigned int code_alignment_factor;
6887       int data_alignment_factor;
6888       unsigned int fde_encoding = 0;
6889       unsigned int lsda_encoding = 0;
6890       Dwarf_Word initial_location = 0;
6891       Dwarf_Word vma_base = 0;
6892 
6893       if (cie_id == (is_eh_frame ? 0 : DW_CIE_ID_64))
6894 	{
6895 	  if (unlikely (cieend - readp < 2))
6896 	    goto invalid_data;
6897 	  version = *readp++;
6898 	  const char *const augmentation = (const char *) readp;
6899 	  readp = memchr (readp, '\0', cieend - readp);
6900 	  if (unlikely (readp == NULL))
6901 	    goto invalid_data;
6902 	  ++readp;
6903 
6904 	  uint_fast8_t segment_size = 0;
6905 	  if (version >= 4)
6906 	    {
6907 	      if (cieend - readp < 5)
6908 		goto invalid_data;
6909 	      ptr_size = *readp++;
6910 	      segment_size = *readp++;
6911 	    }
6912 
6913 	  if (cieend - readp < 1)
6914 	    goto invalid_data;
6915 	  get_uleb128 (code_alignment_factor, readp, cieend);
6916 	  if (cieend - readp < 1)
6917 	    goto invalid_data;
6918 	  get_sleb128 (data_alignment_factor, readp, cieend);
6919 
6920 	  /* In some variant for unwind data there is another field.  */
6921 	  if (strcmp (augmentation, "eh") == 0)
6922 	    readp += ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
6923 
6924 	  unsigned int return_address_register;
6925 	  if (cieend - readp < 1)
6926 	    goto invalid_data;
6927 	  if (unlikely (version == 1))
6928 	    return_address_register = *readp++;
6929 	  else
6930 	    get_uleb128 (return_address_register, readp, cieend);
6931 
6932 	  printf ("\n [%6tx] CIE length=%" PRIu64 "\n"
6933 		  "   CIE_id:                   %" PRIu64 "\n"
6934 		  "   version:                  %u\n"
6935 		  "   augmentation:             \"%s\"\n",
6936 		  offset, (uint64_t) unit_length, (uint64_t) cie_id,
6937 		  version, augmentation);
6938 	  if (version >= 4)
6939 	    printf ("   address_size:             %u\n"
6940 		    "   segment_size:             %u\n",
6941 		    ptr_size, segment_size);
6942 	  printf ("   code_alignment_factor:    %u\n"
6943 		  "   data_alignment_factor:    %d\n"
6944 		  "   return_address_register:  %u\n",
6945 		  code_alignment_factor,
6946 		  data_alignment_factor, return_address_register);
6947 
6948 	  if (augmentation[0] == 'z')
6949 	    {
6950 	      unsigned int augmentationlen;
6951 	      get_uleb128 (augmentationlen, readp, cieend);
6952 
6953 	      if (augmentationlen > (size_t) (cieend - readp))
6954 		{
6955 		  error (0, 0, _("invalid augmentation length"));
6956 		  readp = cieend;
6957 		  continue;
6958 		}
6959 
6960 	      const char *hdr = "Augmentation data:";
6961 	      const char *cp = augmentation + 1;
6962 	      while (*cp != '\0' && cp < augmentation + augmentationlen + 1)
6963 		{
6964 		  printf ("   %-26s%#x ", hdr, *readp);
6965 		  hdr = "";
6966 
6967 		  if (*cp == 'R')
6968 		    {
6969 		      fde_encoding = *readp++;
6970 		      print_encoding_base (_("FDE address encoding: "),
6971 					   fde_encoding);
6972 		    }
6973 		  else if (*cp == 'L')
6974 		    {
6975 		      lsda_encoding = *readp++;
6976 		      print_encoding_base (_("LSDA pointer encoding: "),
6977 					   lsda_encoding);
6978 		    }
6979 		  else if (*cp == 'P')
6980 		    {
6981 		      /* Personality.  This field usually has a relocation
6982 			 attached pointing to __gcc_personality_v0.  */
6983 		      const unsigned char *startp = readp;
6984 		      unsigned int encoding = *readp++;
6985 		      uint64_t val = 0;
6986 		      readp = read_encoded (encoding, readp,
6987 					    readp - 1 + augmentationlen,
6988 					    &val, dbg);
6989 
6990 		      while (++startp < readp)
6991 			printf ("%#x ", *startp);
6992 
6993 		      putchar ('(');
6994 		      print_encoding (encoding);
6995 		      putchar (' ');
6996 		      switch (encoding & 0xf)
6997 			{
6998 			case DW_EH_PE_sleb128:
6999 			case DW_EH_PE_sdata2:
7000 			case DW_EH_PE_sdata4:
7001 			  printf ("%" PRId64 ")\n", val);
7002 			  break;
7003 			default:
7004 			  printf ("%#" PRIx64 ")\n", val);
7005 			  break;
7006 			}
7007 		    }
7008 		  else
7009 		    printf ("(%x)\n", *readp++);
7010 
7011 		  ++cp;
7012 		}
7013 	    }
7014 
7015 	  if (likely (ptr_size == 4 || ptr_size == 8))
7016 	    {
7017 	      struct cieinfo *newp = alloca (sizeof (*newp));
7018 	      newp->cie_offset = offset;
7019 	      newp->augmentation = augmentation;
7020 	      newp->fde_encoding = fde_encoding;
7021 	      newp->lsda_encoding = lsda_encoding;
7022 	      newp->address_size = ptr_size;
7023 	      newp->code_alignment_factor = code_alignment_factor;
7024 	      newp->data_alignment_factor = data_alignment_factor;
7025 	      newp->next = cies;
7026 	      cies = newp;
7027 	    }
7028 	}
7029       else
7030 	{
7031 	  struct cieinfo *cie = cies;
7032 	  while (cie != NULL)
7033 	    if (is_eh_frame
7034 		? ((Dwarf_Off) start - cie_id) == (Dwarf_Off) cie->cie_offset
7035 		: cie_id == (Dwarf_Off) cie->cie_offset)
7036 	      break;
7037 	    else
7038 	      cie = cie->next;
7039 	  if (unlikely (cie == NULL))
7040 	    {
7041 	      puts ("invalid CIE reference in FDE");
7042 	      return;
7043 	    }
7044 
7045 	  /* Initialize from CIE data.  */
7046 	  fde_encoding = cie->fde_encoding;
7047 	  lsda_encoding = cie->lsda_encoding;
7048 	  ptr_size = encoded_ptr_size (fde_encoding, cie->address_size);
7049 	  code_alignment_factor = cie->code_alignment_factor;
7050 	  data_alignment_factor = cie->data_alignment_factor;
7051 
7052 	  const unsigned char *base = readp;
7053 	  // XXX There are sometimes relocations for this value
7054 	  initial_location = read_addr_unaligned_inc (ptr_size, dbg, readp);
7055 	  Dwarf_Word address_range
7056 	    = read_addr_unaligned_inc (ptr_size, dbg, readp);
7057 
7058 	  /* pcrel for an FDE address is relative to the runtime
7059 	     address of the start_address field itself.  Sign extend
7060 	     if necessary to make sure the calculation is done on the
7061 	     full 64 bit address even when initial_location only holds
7062 	     the lower 32 bits.  */
7063 	  Dwarf_Addr pc_start = initial_location;
7064 	  if (ptr_size == 4)
7065 	    pc_start = (uint64_t) (int32_t) pc_start;
7066 	  if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
7067 	    pc_start += ((uint64_t) shdr->sh_addr
7068 			 + (base - (const unsigned char *) data->d_buf)
7069 			 - bias);
7070 
7071 	  printf ("\n [%6tx] FDE length=%" PRIu64 " cie=[%6tx]\n"
7072 		  "   CIE_pointer:              %" PRIu64 "\n"
7073 		  "   initial_location:         ",
7074 		  offset, (uint64_t) unit_length,
7075 		  cie->cie_offset, (uint64_t) cie_id);
7076 	  print_dwarf_addr (dwflmod, cie->address_size,
7077 			    pc_start, initial_location);
7078 	  if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
7079 	    {
7080 	      vma_base = (((uint64_t) shdr->sh_offset
7081 			   + (base - (const unsigned char *) data->d_buf)
7082 			   + (uint64_t) initial_location)
7083 			  & (ptr_size == 4
7084 			     ? UINT64_C (0xffffffff)
7085 			     : UINT64_C (0xffffffffffffffff)));
7086 	      printf (_(" (offset: %#" PRIx64 ")"),
7087 		      (uint64_t) vma_base);
7088 	    }
7089 
7090 	  printf ("\n   address_range:            %#" PRIx64,
7091 		  (uint64_t) address_range);
7092 	  if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
7093 	    printf (_(" (end offset: %#" PRIx64 ")"),
7094 		    ((uint64_t) vma_base + (uint64_t) address_range)
7095 		    & (ptr_size == 4
7096 		       ? UINT64_C (0xffffffff)
7097 		       : UINT64_C (0xffffffffffffffff)));
7098 	  putchar ('\n');
7099 
7100 	  if (cie->augmentation[0] == 'z')
7101 	    {
7102 	      unsigned int augmentationlen;
7103 	      if (cieend - readp < 1)
7104 		goto invalid_data;
7105 	      get_uleb128 (augmentationlen, readp, cieend);
7106 
7107 	      if (augmentationlen > (size_t) (cieend - readp))
7108 		{
7109 		  error (0, 0, _("invalid augmentation length"));
7110 		  readp = cieend;
7111 		  continue;
7112 		}
7113 
7114 	      if (augmentationlen > 0)
7115 		{
7116 		  const char *hdr = "Augmentation data:";
7117 		  const char *cp = cie->augmentation + 1;
7118 		  unsigned int u = 0;
7119 		  while (*cp != '\0'
7120 			 && cp < cie->augmentation + augmentationlen + 1)
7121 		    {
7122 		      if (*cp == 'L')
7123 			{
7124 			  uint64_t lsda_pointer;
7125 			  const unsigned char *p
7126 			    = read_encoded (lsda_encoding, &readp[u],
7127 					    &readp[augmentationlen],
7128 					    &lsda_pointer, dbg);
7129 			  u = p - readp;
7130 			  printf (_("\
7131    %-26sLSDA pointer: %#" PRIx64 "\n"),
7132 				  hdr, lsda_pointer);
7133 			  hdr = "";
7134 			}
7135 		      ++cp;
7136 		    }
7137 
7138 		  while (u < augmentationlen)
7139 		    {
7140 		      printf ("   %-26s%#x\n", hdr, readp[u++]);
7141 		      hdr = "";
7142 		    }
7143 		}
7144 
7145 	      readp += augmentationlen;
7146 	    }
7147 	}
7148 
7149       /* Handle the initialization instructions.  */
7150       if (ptr_size != 4 && ptr_size !=8)
7151 	printf ("invalid CIE pointer size (%u), must be 4 or 8.\n", ptr_size);
7152       else
7153 	print_cfa_program (readp, cieend, vma_base, code_alignment_factor,
7154 			   data_alignment_factor, version, ptr_size,
7155 			   fde_encoding, dwflmod, ebl, ehdr, dbg);
7156       readp = cieend;
7157     }
7158 }
7159 
7160 
7161 /* Returns the signedness (or false if it cannot be determined) and
7162    the byte size (or zero if it cannot be gotten) of the given DIE
7163    DW_AT_type attribute.  Uses dwarf_peel_type and dwarf_aggregate_size.  */
7164 static void
die_type_sign_bytes(Dwarf_Die * die,bool * is_signed,int * bytes)7165 die_type_sign_bytes (Dwarf_Die *die, bool *is_signed, int *bytes)
7166 {
7167   Dwarf_Attribute attr;
7168   Dwarf_Die type;
7169 
7170   *bytes = 0;
7171   *is_signed = false;
7172 
7173   if (dwarf_peel_type (dwarf_formref_die (dwarf_attr_integrate (die,
7174 								DW_AT_type,
7175 								&attr), &type),
7176 		       &type) == 0)
7177     {
7178       Dwarf_Word val;
7179       *is_signed = (dwarf_formudata (dwarf_attr (&type, DW_AT_encoding,
7180 						 &attr), &val) == 0
7181 		    && (val == DW_ATE_signed || val == DW_ATE_signed_char));
7182 
7183       if (dwarf_aggregate_size (&type, &val) == 0)
7184 	*bytes = val;
7185     }
7186 }
7187 
7188 struct attrcb_args
7189 {
7190   Dwfl_Module *dwflmod;
7191   Dwarf *dbg;
7192   Dwarf_Die *dies;
7193   int level;
7194   bool silent;
7195   bool is_split;
7196   unsigned int version;
7197   unsigned int addrsize;
7198   unsigned int offset_size;
7199   struct Dwarf_CU *cu;
7200 };
7201 
7202 
7203 static int
attr_callback(Dwarf_Attribute * attrp,void * arg)7204 attr_callback (Dwarf_Attribute *attrp, void *arg)
7205 {
7206   struct attrcb_args *cbargs = (struct attrcb_args *) arg;
7207   const int level = cbargs->level;
7208   Dwarf_Die *die = &cbargs->dies[level];
7209   bool is_split = cbargs->is_split;
7210 
7211   unsigned int attr = dwarf_whatattr (attrp);
7212   if (unlikely (attr == 0))
7213     {
7214       if (!cbargs->silent)
7215 	error (0, 0, _("DIE [%" PRIx64 "] "
7216 			      "cannot get attribute code: %s"),
7217 	       dwarf_dieoffset (die), dwarf_errmsg (-1));
7218       return DWARF_CB_ABORT;
7219     }
7220 
7221   unsigned int form = dwarf_whatform (attrp);
7222   if (unlikely (form == 0))
7223     {
7224       if (!cbargs->silent)
7225 	error (0, 0, _("DIE [%" PRIx64 "] "
7226 			      "cannot get attribute form: %s"),
7227 	       dwarf_dieoffset (die), dwarf_errmsg (-1));
7228       return DWARF_CB_ABORT;
7229     }
7230 
7231   switch (form)
7232     {
7233     case DW_FORM_addr:
7234     case DW_FORM_addrx:
7235     case DW_FORM_addrx1:
7236     case DW_FORM_addrx2:
7237     case DW_FORM_addrx3:
7238     case DW_FORM_addrx4:
7239     case DW_FORM_GNU_addr_index:
7240       if (!cbargs->silent)
7241 	{
7242 	  Dwarf_Addr addr;
7243 	  if (unlikely (dwarf_formaddr (attrp, &addr) != 0))
7244 	    {
7245 	    attrval_out:
7246 	      if (!cbargs->silent)
7247 		error (0, 0, _("DIE [%" PRIx64 "] "
7248 				      "cannot get attribute '%s' (%s) value: "
7249 				      "%s"),
7250 		       dwarf_dieoffset (die),
7251 		       dwarf_attr_name (attr),
7252 		       dwarf_form_name (form),
7253 		       dwarf_errmsg (-1));
7254 	      /* Don't ABORT, it might be other attributes can be resolved.  */
7255 	      return DWARF_CB_OK;
7256 	    }
7257 	  if (form != DW_FORM_addr )
7258 	    {
7259 	      Dwarf_Word word;
7260 	      if (dwarf_formudata (attrp, &word) != 0)
7261 		goto attrval_out;
7262 	      printf ("           %*s%-20s (%s) [%" PRIx64 "] ",
7263 		      (int) (level * 2), "", dwarf_attr_name (attr),
7264 		      dwarf_form_name (form), word);
7265 	    }
7266 	  else
7267 	    printf ("           %*s%-20s (%s) ",
7268 		    (int) (level * 2), "", dwarf_attr_name (attr),
7269 		    dwarf_form_name (form));
7270 	  print_dwarf_addr (cbargs->dwflmod, cbargs->addrsize, addr, addr);
7271 	  printf ("\n");
7272 	}
7273       break;
7274 
7275     case DW_FORM_indirect:
7276     case DW_FORM_strp:
7277     case DW_FORM_line_strp:
7278     case DW_FORM_strx:
7279     case DW_FORM_strx1:
7280     case DW_FORM_strx2:
7281     case DW_FORM_strx3:
7282     case DW_FORM_strx4:
7283     case DW_FORM_string:
7284     case DW_FORM_GNU_strp_alt:
7285     case DW_FORM_GNU_str_index:
7286       if (cbargs->silent)
7287 	break;
7288       const char *str = dwarf_formstring (attrp);
7289       if (unlikely (str == NULL))
7290 	goto attrval_out;
7291       printf ("           %*s%-20s (%s) \"%s\"\n",
7292 	      (int) (level * 2), "", dwarf_attr_name (attr),
7293 	      dwarf_form_name (form), str);
7294       break;
7295 
7296     case DW_FORM_ref_addr:
7297     case DW_FORM_ref_udata:
7298     case DW_FORM_ref8:
7299     case DW_FORM_ref4:
7300     case DW_FORM_ref2:
7301     case DW_FORM_ref1:
7302     case DW_FORM_GNU_ref_alt:
7303     case DW_FORM_ref_sup4:
7304     case DW_FORM_ref_sup8:
7305       if (cbargs->silent)
7306 	break;
7307       Dwarf_Die ref;
7308       if (unlikely (dwarf_formref_die (attrp, &ref) == NULL))
7309 	goto attrval_out;
7310 
7311       printf ("           %*s%-20s (%s) ",
7312 	      (int) (level * 2), "", dwarf_attr_name (attr),
7313 	      dwarf_form_name (form));
7314       if (is_split)
7315 	printf ("{%6" PRIxMAX "}\n", (uintmax_t) dwarf_dieoffset (&ref));
7316       else
7317 	printf ("[%6" PRIxMAX "]\n", (uintmax_t) dwarf_dieoffset (&ref));
7318       break;
7319 
7320     case DW_FORM_ref_sig8:
7321       if (cbargs->silent)
7322 	break;
7323       printf ("           %*s%-20s (%s) {%6" PRIx64 "}\n",
7324 	      (int) (level * 2), "", dwarf_attr_name (attr),
7325 	      dwarf_form_name (form),
7326 	      (uint64_t) read_8ubyte_unaligned (attrp->cu->dbg, attrp->valp));
7327       break;
7328 
7329     case DW_FORM_sec_offset:
7330     case DW_FORM_rnglistx:
7331     case DW_FORM_loclistx:
7332     case DW_FORM_implicit_const:
7333     case DW_FORM_udata:
7334     case DW_FORM_sdata:
7335     case DW_FORM_data8: /* Note no data16 here, we see that as block. */
7336     case DW_FORM_data4:
7337     case DW_FORM_data2:
7338     case DW_FORM_data1:;
7339       Dwarf_Word num;
7340       if (unlikely (dwarf_formudata (attrp, &num) != 0))
7341 	goto attrval_out;
7342 
7343       const char *valuestr = NULL;
7344       bool as_hex_id = false;
7345       switch (attr)
7346 	{
7347 	  /* This case can take either a constant or a loclistptr.  */
7348 	case DW_AT_data_member_location:
7349 	  if (form != DW_FORM_sec_offset
7350 	      && (cbargs->version >= 4
7351 		  || (form != DW_FORM_data4 && form != DW_FORM_data8)))
7352 	    {
7353 	      if (!cbargs->silent)
7354 		printf ("           %*s%-20s (%s) %" PRIuMAX "\n",
7355 			(int) (level * 2), "", dwarf_attr_name (attr),
7356 			dwarf_form_name (form), (uintmax_t) num);
7357 	      return DWARF_CB_OK;
7358 	    }
7359 	  FALLTHROUGH;
7360 
7361 	/* These cases always take a loclist[ptr] and no constant. */
7362 	case DW_AT_location:
7363 	case DW_AT_data_location:
7364 	case DW_AT_vtable_elem_location:
7365 	case DW_AT_string_length:
7366 	case DW_AT_use_location:
7367 	case DW_AT_frame_base:
7368 	case DW_AT_return_addr:
7369 	case DW_AT_static_link:
7370 	case DW_AT_segment:
7371 	case DW_AT_GNU_call_site_value:
7372 	case DW_AT_GNU_call_site_data_value:
7373 	case DW_AT_GNU_call_site_target:
7374 	case DW_AT_GNU_call_site_target_clobbered:
7375 	case DW_AT_GNU_locviews:
7376 	  {
7377 	    bool nlpt;
7378 	    if (cbargs->cu->version < 5)
7379 	      {
7380 		if (! cbargs->is_split)
7381 		  {
7382 		    nlpt = notice_listptr (section_loc, &known_locsptr,
7383 					   cbargs->addrsize,
7384 					   cbargs->offset_size,
7385 					   cbargs->cu, num, attr);
7386 		  }
7387 		else
7388 		  nlpt = true;
7389 	      }
7390 	    else
7391 	      {
7392 		/* Only register for a real section offset.  Otherwise
7393 		   it is a DW_FORM_loclistx which is just an index
7394 		   number and we should already have registered the
7395 		   section offset for the index when we saw the
7396 		   DW_AT_loclists_base CU attribute.  */
7397 		if (form == DW_FORM_sec_offset)
7398 		  nlpt = notice_listptr (section_loc, &known_loclistsptr,
7399 					 cbargs->addrsize, cbargs->offset_size,
7400 					 cbargs->cu, num, attr);
7401 		else
7402 		  nlpt = true;
7403 
7404 	      }
7405 
7406 	    if (!cbargs->silent)
7407 	      {
7408 		if (cbargs->cu->version < 5 || form == DW_FORM_sec_offset)
7409 		  printf ("           %*s%-20s (%s) location list [%6"
7410 			  PRIxMAX "]%s\n",
7411 			  (int) (level * 2), "", dwarf_attr_name (attr),
7412 			  dwarf_form_name (form), (uintmax_t) num,
7413 			  nlpt ? "" : " <WARNING offset too big>");
7414 		else
7415 		  printf ("           %*s%-20s (%s) location index [%6"
7416 			  PRIxMAX "]\n",
7417 			  (int) (level * 2), "", dwarf_attr_name (attr),
7418 			  dwarf_form_name (form), (uintmax_t) num);
7419 	      }
7420 	  }
7421 	  return DWARF_CB_OK;
7422 
7423 	case DW_AT_loclists_base:
7424 	  {
7425 	    bool nlpt = notice_listptr (section_loc, &known_loclistsptr,
7426                                         cbargs->addrsize, cbargs->offset_size,
7427                                         cbargs->cu, num, attr);
7428 
7429 	    if (!cbargs->silent)
7430 	      printf ("           %*s%-20s (%s) location list [%6" PRIxMAX "]%s\n",
7431 		      (int) (level * 2), "", dwarf_attr_name (attr),
7432 		      dwarf_form_name (form), (uintmax_t) num,
7433 		      nlpt ? "" : " <WARNING offset too big>");
7434 	  }
7435 	  return DWARF_CB_OK;
7436 
7437 	case DW_AT_ranges:
7438 	case DW_AT_start_scope:
7439 	  {
7440 	    bool nlpt;
7441 	    if (cbargs->cu->version < 5)
7442 	      nlpt = notice_listptr (section_ranges, &known_rangelistptr,
7443 				     cbargs->addrsize, cbargs->offset_size,
7444 				     cbargs->cu, num, attr);
7445 	    else
7446 	      {
7447 		/* Only register for a real section offset.  Otherwise
7448 		   it is a DW_FORM_rangelistx which is just an index
7449 		   number and we should already have registered the
7450 		   section offset for the index when we saw the
7451 		   DW_AT_rnglists_base CU attribute.  */
7452 		if (form == DW_FORM_sec_offset)
7453 		  nlpt = notice_listptr (section_ranges, &known_rnglistptr,
7454 					 cbargs->addrsize, cbargs->offset_size,
7455 					 cbargs->cu, num, attr);
7456 		else
7457 		  nlpt = true;
7458 	      }
7459 
7460 	    if (!cbargs->silent)
7461 	      {
7462 		if (cbargs->cu->version < 5 || form == DW_FORM_sec_offset)
7463 		  printf ("           %*s%-20s (%s) range list [%6"
7464 			  PRIxMAX "]%s\n",
7465 			  (int) (level * 2), "", dwarf_attr_name (attr),
7466 			  dwarf_form_name (form), (uintmax_t) num,
7467 			  nlpt ? "" : " <WARNING offset too big>");
7468 		else
7469 		  printf ("           %*s%-20s (%s) range index [%6"
7470 			  PRIxMAX "]\n",
7471 			  (int) (level * 2), "", dwarf_attr_name (attr),
7472 			  dwarf_form_name (form), (uintmax_t) num);
7473 	      }
7474 	  }
7475 	  return DWARF_CB_OK;
7476 
7477 	case DW_AT_rnglists_base:
7478 	  {
7479 	    bool nlpt = notice_listptr (section_ranges, &known_rnglistptr,
7480 					cbargs->addrsize, cbargs->offset_size,
7481 					cbargs->cu, num, attr);
7482 	    if (!cbargs->silent)
7483 	      printf ("           %*s%-20s (%s) range list [%6"
7484 		      PRIxMAX "]%s\n",
7485 		      (int) (level * 2), "", dwarf_attr_name (attr),
7486 		      dwarf_form_name (form), (uintmax_t) num,
7487 		      nlpt ? "" : " <WARNING offset too big>");
7488 	  }
7489 	  return DWARF_CB_OK;
7490 
7491 	case DW_AT_addr_base:
7492 	case DW_AT_GNU_addr_base:
7493 	  {
7494 	    bool addrbase = notice_listptr (section_addr, &known_addrbases,
7495 					    cbargs->addrsize,
7496 					    cbargs->offset_size,
7497 					    cbargs->cu, num, attr);
7498 	    if (!cbargs->silent)
7499 	      printf ("           %*s%-20s (%s) address base [%6"
7500 		      PRIxMAX "]%s\n",
7501 		      (int) (level * 2), "", dwarf_attr_name (attr),
7502 		      dwarf_form_name (form), (uintmax_t) num,
7503 		      addrbase ? "" : " <WARNING offset too big>");
7504 	  }
7505 	  return DWARF_CB_OK;
7506 
7507 	case DW_AT_str_offsets_base:
7508 	  {
7509 	    bool stroffbase = notice_listptr (section_str, &known_stroffbases,
7510 					      cbargs->addrsize,
7511 					      cbargs->offset_size,
7512 					      cbargs->cu, num, attr);
7513 	    if (!cbargs->silent)
7514 	      printf ("           %*s%-20s (%s) str offsets base [%6"
7515 		      PRIxMAX "]%s\n",
7516 		      (int) (level * 2), "", dwarf_attr_name (attr),
7517 		      dwarf_form_name (form), (uintmax_t) num,
7518 		      stroffbase ? "" : " <WARNING offset too big>");
7519 	  }
7520 	  return DWARF_CB_OK;
7521 
7522 	case DW_AT_language:
7523 	  valuestr = dwarf_lang_name (num);
7524 	  break;
7525 	case DW_AT_encoding:
7526 	  valuestr = dwarf_encoding_name (num);
7527 	  break;
7528 	case DW_AT_accessibility:
7529 	  valuestr = dwarf_access_name (num);
7530 	  break;
7531 	case DW_AT_defaulted:
7532 	  valuestr = dwarf_defaulted_name (num);
7533 	  break;
7534 	case DW_AT_visibility:
7535 	  valuestr = dwarf_visibility_name (num);
7536 	  break;
7537 	case DW_AT_virtuality:
7538 	  valuestr = dwarf_virtuality_name (num);
7539 	  break;
7540 	case DW_AT_identifier_case:
7541 	  valuestr = dwarf_identifier_case_name (num);
7542 	  break;
7543 	case DW_AT_calling_convention:
7544 	  valuestr = dwarf_calling_convention_name (num);
7545 	  break;
7546 	case DW_AT_inline:
7547 	  valuestr = dwarf_inline_name (num);
7548 	  break;
7549 	case DW_AT_ordering:
7550 	  valuestr = dwarf_ordering_name (num);
7551 	  break;
7552 	case DW_AT_decl_file:
7553 	case DW_AT_call_file:
7554 	  {
7555 	    if (cbargs->silent)
7556 	      break;
7557 
7558 	    /* Try to get the actual file, the current interface only
7559 	       gives us full paths, but we only want to show the file
7560 	       name for now.  */
7561 	    Dwarf_Die cudie;
7562 	    if (dwarf_cu_die (cbargs->cu, &cudie,
7563 			      NULL, NULL, NULL, NULL, NULL, NULL) != NULL)
7564 	      {
7565 		Dwarf_Files *files;
7566 		size_t nfiles;
7567 		if (dwarf_getsrcfiles (&cudie, &files, &nfiles) == 0)
7568 		  {
7569 		    valuestr = dwarf_filesrc (files, num, NULL, NULL);
7570 		    if (valuestr != NULL)
7571 		      {
7572 			char *filename = strrchr (valuestr, '/');
7573 			if (filename != NULL)
7574 			  valuestr = filename + 1;
7575 		      }
7576 		    else
7577 		      error (0, 0, _("invalid file (%" PRId64 "): %s"),
7578 			     num, dwarf_errmsg (-1));
7579 		  }
7580 		else
7581 		  error (0, 0, _("no srcfiles for CU [%" PRIx64 "]"),
7582 			 dwarf_dieoffset (&cudie));
7583 	      }
7584 	    else
7585 	     error (0, 0, _("couldn't get DWARF CU: %s"),
7586 		    dwarf_errmsg (-1));
7587 	    if (valuestr == NULL)
7588 	      valuestr = "???";
7589 	  }
7590 	  break;
7591 	case DW_AT_GNU_dwo_id:
7592 	  as_hex_id = true;
7593 	  break;
7594 
7595 	default:
7596 	  /* Nothing.  */
7597 	  break;
7598 	}
7599 
7600       if (cbargs->silent)
7601 	break;
7602 
7603       /* When highpc is in constant form it is relative to lowpc.
7604 	 In that case also show the address.  */
7605       Dwarf_Addr highpc;
7606       if (attr == DW_AT_high_pc && dwarf_highpc (die, &highpc) == 0)
7607 	{
7608 	  printf ("           %*s%-20s (%s) %" PRIuMAX " (",
7609 		  (int) (level * 2), "", dwarf_attr_name (attr),
7610 		  dwarf_form_name (form), (uintmax_t) num);
7611 	  print_dwarf_addr (cbargs->dwflmod, cbargs->addrsize, highpc, highpc);
7612 	  printf (")\n");
7613 	}
7614       else
7615 	{
7616 	  if (as_hex_id)
7617 	    {
7618 	      printf ("           %*s%-20s (%s) 0x%.16" PRIx64 "\n",
7619 		      (int) (level * 2), "", dwarf_attr_name (attr),
7620 		      dwarf_form_name (form), num);
7621 	    }
7622 	  else
7623 	    {
7624 	      Dwarf_Sword snum = 0;
7625 	      bool is_signed;
7626 	      int bytes = 0;
7627 	      if (attr == DW_AT_const_value)
7628 		die_type_sign_bytes (die, &is_signed, &bytes);
7629 	      else
7630 		is_signed = (form == DW_FORM_sdata
7631 			     || form == DW_FORM_implicit_const);
7632 
7633 	      if (is_signed)
7634 		if (unlikely (dwarf_formsdata (attrp, &snum) != 0))
7635 		  goto attrval_out;
7636 
7637 	      if (valuestr == NULL)
7638 		{
7639 		  printf ("           %*s%-20s (%s) ",
7640 			  (int) (level * 2), "", dwarf_attr_name (attr),
7641 			  dwarf_form_name (form));
7642 		}
7643 	      else
7644 		{
7645 		  printf ("           %*s%-20s (%s) %s (",
7646 			  (int) (level * 2), "", dwarf_attr_name (attr),
7647 			  dwarf_form_name (form), valuestr);
7648 		}
7649 
7650 	      switch (bytes)
7651 		{
7652 		case 1:
7653 		  if (is_signed)
7654 		    printf ("%" PRId8, (int8_t) snum);
7655 		  else
7656 		    printf ("%" PRIu8, (uint8_t) num);
7657 		  break;
7658 
7659 		case 2:
7660 		  if (is_signed)
7661 		    printf ("%" PRId16, (int16_t) snum);
7662 		  else
7663 		    printf ("%" PRIu16, (uint16_t) num);
7664 		  break;
7665 
7666 		case 4:
7667 		  if (is_signed)
7668 		    printf ("%" PRId32, (int32_t) snum);
7669 		  else
7670 		    printf ("%" PRIu32, (uint32_t) num);
7671 		  break;
7672 
7673 		case 8:
7674 		  if (is_signed)
7675 		    printf ("%" PRId64, (int64_t) snum);
7676 		  else
7677 		    printf ("%" PRIu64, (uint64_t) num);
7678 		  break;
7679 
7680 		default:
7681 		  if (is_signed)
7682 		    printf ("%" PRIdMAX, (intmax_t) snum);
7683 		  else
7684 		    printf ("%" PRIuMAX, (uintmax_t) num);
7685 		  break;
7686 		}
7687 
7688 	      /* Make clear if we switched from a signed encoding to
7689 		 an unsigned value.  */
7690 	      if (attr == DW_AT_const_value
7691 		  && (form == DW_FORM_sdata || form == DW_FORM_implicit_const)
7692 		  && !is_signed)
7693 		printf (" (%" PRIdMAX ")", (intmax_t) num);
7694 
7695 	      if (valuestr == NULL)
7696 		printf ("\n");
7697 	      else
7698 		printf (")\n");
7699 	    }
7700 	}
7701       break;
7702 
7703     case DW_FORM_flag:
7704       if (cbargs->silent)
7705 	break;
7706       bool flag;
7707       if (unlikely (dwarf_formflag (attrp, &flag) != 0))
7708 	goto attrval_out;
7709 
7710       printf ("           %*s%-20s (%s) %s\n",
7711 	      (int) (level * 2), "", dwarf_attr_name (attr),
7712 	      dwarf_form_name (form), flag ? yes_str : no_str);
7713       break;
7714 
7715     case DW_FORM_flag_present:
7716       if (cbargs->silent)
7717 	break;
7718       printf ("           %*s%-20s (%s) %s\n",
7719 	      (int) (level * 2), "", dwarf_attr_name (attr),
7720 	      dwarf_form_name (form), yes_str);
7721       break;
7722 
7723     case DW_FORM_exprloc:
7724     case DW_FORM_block4:
7725     case DW_FORM_block2:
7726     case DW_FORM_block1:
7727     case DW_FORM_block:
7728     case DW_FORM_data16: /* DWARF5 calls this a constant class.  */
7729       if (cbargs->silent)
7730 	break;
7731       Dwarf_Block block;
7732       if (unlikely (dwarf_formblock (attrp, &block) != 0))
7733 	goto attrval_out;
7734 
7735       printf ("           %*s%-20s (%s) ",
7736 	      (int) (level * 2), "", dwarf_attr_name (attr),
7737 	      dwarf_form_name (form));
7738 
7739       switch (attr)
7740 	{
7741 	default:
7742 	  if (form != DW_FORM_exprloc)
7743 	    {
7744 	      print_block (block.length, block.data);
7745 	      break;
7746 	    }
7747 	  FALLTHROUGH;
7748 
7749 	case DW_AT_location:
7750 	case DW_AT_data_location:
7751 	case DW_AT_data_member_location:
7752 	case DW_AT_vtable_elem_location:
7753 	case DW_AT_string_length:
7754 	case DW_AT_use_location:
7755 	case DW_AT_frame_base:
7756 	case DW_AT_return_addr:
7757 	case DW_AT_static_link:
7758 	case DW_AT_allocated:
7759 	case DW_AT_associated:
7760 	case DW_AT_bit_size:
7761 	case DW_AT_bit_offset:
7762 	case DW_AT_bit_stride:
7763 	case DW_AT_byte_size:
7764 	case DW_AT_byte_stride:
7765 	case DW_AT_count:
7766 	case DW_AT_lower_bound:
7767 	case DW_AT_upper_bound:
7768 	case DW_AT_GNU_call_site_value:
7769 	case DW_AT_GNU_call_site_data_value:
7770 	case DW_AT_GNU_call_site_target:
7771 	case DW_AT_GNU_call_site_target_clobbered:
7772 	  if (form == DW_FORM_exprloc
7773 	      || (form != DW_FORM_data16
7774 		  && attrp->cu->version < 4)) /* blocks were expressions.  */
7775 	    {
7776 	      putchar ('\n');
7777 	      print_ops (cbargs->dwflmod, cbargs->dbg,
7778 			 12 + level * 2, 12 + level * 2,
7779 			 cbargs->version, cbargs->addrsize, cbargs->offset_size,
7780 			 attrp->cu, block.length, block.data);
7781 	    }
7782 	  else
7783 	    print_block (block.length, block.data);
7784 	  break;
7785 
7786 	case DW_AT_discr_list:
7787 	  if (block.length == 0)
7788 	    puts ("<default>");
7789 	  else if (form != DW_FORM_data16)
7790 	    {
7791 	      const unsigned char *readp = block.data;
7792 	      const unsigned char *readendp = readp + block.length;
7793 
7794 	      /* See if we are dealing with a signed or unsigned
7795 		 values.  If the parent of this variant DIE is a
7796 		 variant_part then it will either have a discriminant
7797 		 which points to the member which type is the
7798 		 discriminant type.  Or the variant_part itself has a
7799 		 type representing the discriminant.  */
7800 	      bool is_signed = false;
7801 	      if (level > 0)
7802 		{
7803 		  Dwarf_Die *parent = &cbargs->dies[level - 1];
7804 		  if (dwarf_tag (die) == DW_TAG_variant
7805 		      && dwarf_tag (parent) == DW_TAG_variant_part)
7806 		    {
7807 		      Dwarf_Die member;
7808 		      Dwarf_Attribute discr_attr;
7809 		      int bytes;
7810 		      if (dwarf_formref_die (dwarf_attr (parent,
7811 							 DW_AT_discr,
7812 							 &discr_attr),
7813 					     &member) != NULL)
7814 			die_type_sign_bytes (&member, &is_signed, &bytes);
7815 		      else
7816 			die_type_sign_bytes (parent, &is_signed, &bytes);
7817 		    }
7818 		}
7819 	      while (readp < readendp)
7820 		{
7821 		  int d = (int) *readp++;
7822 		  printf ("%s ", dwarf_discr_list_name (d));
7823 		  if (readp >= readendp)
7824 		    goto attrval_out;
7825 
7826 		  Dwarf_Word val;
7827 		  Dwarf_Sword sval;
7828 		  if (d == DW_DSC_label)
7829 		    {
7830 		      if (is_signed)
7831 			{
7832 			  get_sleb128 (sval, readp, readendp);
7833 			  printf ("%" PRId64 "", sval);
7834 			}
7835 		      else
7836 			{
7837 			  get_uleb128 (val, readp, readendp);
7838 			  printf ("%" PRIu64 "", val);
7839 			}
7840 		    }
7841 		  else if (d == DW_DSC_range)
7842 		    {
7843 		      if (is_signed)
7844 			{
7845 			  get_sleb128 (sval, readp, readendp);
7846 			  printf ("%" PRId64 "..", sval);
7847 			  if (readp >= readendp)
7848 			    goto attrval_out;
7849 			  get_sleb128 (sval, readp, readendp);
7850 			  printf ("%" PRId64 "", sval);
7851 			}
7852 		      else
7853 			{
7854 			  get_uleb128 (val, readp, readendp);
7855 			  printf ("%" PRIu64 "..", val);
7856 			  if (readp >= readendp)
7857 			    goto attrval_out;
7858 			  get_uleb128 (val, readp, readendp);
7859 			  printf ("%" PRIu64 "", val);
7860 			}
7861 		    }
7862 		  else
7863 		    {
7864 		      print_block (readendp - readp, readp);
7865 		      break;
7866 		    }
7867 		  if (readp < readendp)
7868 		    printf (", ");
7869 		}
7870 	      putchar ('\n');
7871 	    }
7872 	  else
7873 	    print_block (block.length, block.data);
7874 	  break;
7875 	}
7876       break;
7877 
7878     default:
7879       if (cbargs->silent)
7880 	break;
7881       printf ("           %*s%-20s (%s) ???\n",
7882 	      (int) (level * 2), "", dwarf_attr_name (attr),
7883 	      dwarf_form_name (form));
7884       break;
7885     }
7886 
7887   return DWARF_CB_OK;
7888 }
7889 
7890 static void
print_debug_units(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg,bool debug_types)7891 print_debug_units (Dwfl_Module *dwflmod,
7892 		   Ebl *ebl, GElf_Ehdr *ehdr __attribute__ ((unused)),
7893 		   Elf_Scn *scn, GElf_Shdr *shdr,
7894 		   Dwarf *dbg, bool debug_types)
7895 {
7896   const bool silent = !(print_debug_sections & section_info) && !debug_types;
7897   const char *secname = section_name (ebl, shdr);
7898 
7899   if (!silent)
7900     printf (_("\
7901 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n [Offset]\n"),
7902 	    elf_ndxscn (scn), secname, (uint64_t) shdr->sh_offset);
7903 
7904   /* If the section is empty we don't have to do anything.  */
7905   if (!silent && shdr->sh_size == 0)
7906     return;
7907 
7908   int maxdies = 20;
7909   Dwarf_Die *dies = xmalloc (maxdies * sizeof (Dwarf_Die));
7910 
7911   /* New compilation unit.  */
7912   Dwarf_Half version;
7913 
7914   Dwarf_Die result;
7915   Dwarf_Off abbroffset;
7916   uint8_t addrsize;
7917   uint8_t offsize;
7918   uint64_t unit_id;
7919   Dwarf_Off subdie_off;
7920 
7921   int unit_res;
7922   Dwarf_CU *cu;
7923   Dwarf_CU cu_mem;
7924   uint8_t unit_type;
7925   Dwarf_Die cudie;
7926 
7927   /* We cheat a little because we want to see only the CUs from .debug_info
7928      or .debug_types.  We know the Dwarf_CU struct layout.  Set it up at
7929      the end of .debug_info if we want .debug_types only.  Check the returned
7930      Dwarf_CU is still in the expected section.  */
7931   if (debug_types)
7932     {
7933       cu_mem.dbg = dbg;
7934       cu_mem.end = dbg->sectiondata[IDX_debug_info]->d_size;
7935       cu_mem.sec_idx = IDX_debug_info;
7936       cu = &cu_mem;
7937     }
7938   else
7939     cu = NULL;
7940 
7941  next_cu:
7942   unit_res = dwarf_get_units (dbg, cu, &cu, &version, &unit_type,
7943 			      &cudie, NULL);
7944   if (unit_res == 1)
7945     goto do_return;
7946 
7947   if (unit_res == -1)
7948     {
7949       if (!silent)
7950 	error (0, 0, _("cannot get next unit: %s"), dwarf_errmsg (-1));
7951       goto do_return;
7952     }
7953 
7954   if (cu->sec_idx != (size_t) (debug_types ? IDX_debug_types : IDX_debug_info))
7955     goto do_return;
7956 
7957   dwarf_cu_die (cu, &result, NULL, &abbroffset, &addrsize, &offsize,
7958 		&unit_id, &subdie_off);
7959 
7960   if (!silent)
7961     {
7962       Dwarf_Off offset = cu->start;
7963       if (debug_types && version < 5)
7964 	{
7965 	  Dwarf_Die typedie;
7966 	  Dwarf_Off dieoffset;
7967 	  dieoffset = dwarf_dieoffset (dwarf_offdie_types (dbg, cu->start
7968 							   + subdie_off,
7969 							   &typedie));
7970 	  printf (_(" Type unit at offset %" PRIu64 ":\n"
7971 			   " Version: %" PRIu16
7972 			   ", Abbreviation section offset: %" PRIu64
7973 			   ", Address size: %" PRIu8
7974 			   ", Offset size: %" PRIu8
7975 			   "\n Type signature: %#" PRIx64
7976 			   ", Type offset: %#" PRIx64 " [%" PRIx64 "]\n"),
7977 		  (uint64_t) offset, version, abbroffset, addrsize, offsize,
7978 		  unit_id, (uint64_t) subdie_off, dieoffset);
7979 	}
7980       else
7981 	{
7982 	  printf (_(" Compilation unit at offset %" PRIu64 ":\n"
7983 			   " Version: %" PRIu16
7984 			   ", Abbreviation section offset: %" PRIu64
7985 			   ", Address size: %" PRIu8
7986 			   ", Offset size: %" PRIu8 "\n"),
7987 		  (uint64_t) offset, version, abbroffset, addrsize, offsize);
7988 
7989 	  if (version >= 5 || (unit_type != DW_UT_compile
7990 			       && unit_type != DW_UT_partial))
7991 	    {
7992 	      printf (_(" Unit type: %s (%" PRIu8 ")"),
7993 			       dwarf_unit_name (unit_type), unit_type);
7994 	      if (unit_type == DW_UT_type
7995 		  || unit_type == DW_UT_skeleton
7996 		  || unit_type == DW_UT_split_compile
7997 		  || unit_type == DW_UT_split_type)
7998 		printf (", Unit id: 0x%.16" PRIx64 "", unit_id);
7999 	      if (unit_type == DW_UT_type
8000 		  || unit_type == DW_UT_split_type)
8001 		{
8002 		  Dwarf_Die typedie;
8003 		  Dwarf_Off dieoffset;
8004 		  dwarf_cu_info (cu, NULL, NULL, NULL, &typedie,
8005 				 NULL, NULL, NULL);
8006 		  dieoffset = dwarf_dieoffset (&typedie);
8007 		  printf (", Unit DIE off: %#" PRIx64 " [%" PRIx64 "]",
8008 			  subdie_off, dieoffset);
8009 		}
8010 	      printf ("\n");
8011 	    }
8012 	}
8013     }
8014 
8015   if (version < 2 || version > 5
8016       || unit_type < DW_UT_compile || unit_type > DW_UT_split_type)
8017     {
8018       if (!silent)
8019 	error (0, 0, _("unknown version (%d) or unit type (%d)"),
8020 	       version, unit_type);
8021       goto next_cu;
8022     }
8023 
8024   struct attrcb_args args =
8025     {
8026       .dwflmod = dwflmod,
8027       .silent = silent,
8028       .version = version,
8029       .addrsize = addrsize,
8030       .offset_size = offsize
8031     };
8032 
8033   bool is_split = false;
8034   int level = 0;
8035   dies[0] = cudie;
8036   args.cu = dies[0].cu;
8037   args.dbg = dbg;
8038   args.is_split = is_split;
8039 
8040   /* We might return here again for the split CU subdie.  */
8041   do_cu:
8042   do
8043     {
8044       Dwarf_Off offset = dwarf_dieoffset (&dies[level]);
8045       if (unlikely (offset == (Dwarf_Off) -1))
8046 	{
8047 	  if (!silent)
8048 	    error (0, 0, _("cannot get DIE offset: %s"),
8049 		   dwarf_errmsg (-1));
8050 	  goto do_return;
8051 	}
8052 
8053       int tag = dwarf_tag (&dies[level]);
8054       if (unlikely (tag == DW_TAG_invalid))
8055 	{
8056 	  if (!silent)
8057 	    error (0, 0, _("cannot get tag of DIE at offset [%" PRIx64
8058 				  "] in section '%s': %s"),
8059 		   (uint64_t) offset, secname, dwarf_errmsg (-1));
8060 	  goto do_return;
8061 	}
8062 
8063       if (!silent)
8064 	{
8065 	  unsigned int code = dwarf_getabbrevcode (dies[level].abbrev);
8066 	  if (is_split)
8067 	    printf (" {%6" PRIx64 "}  ", (uint64_t) offset);
8068 	  else
8069 	    printf (" [%6" PRIx64 "]  ", (uint64_t) offset);
8070 	  printf ("%*s%-20s abbrev: %u\n", (int) (level * 2), "",
8071 		  dwarf_tag_name (tag), code);
8072 	}
8073 
8074       /* Print the attribute values.  */
8075       args.level = level;
8076       args.dies = dies;
8077       (void) dwarf_getattrs (&dies[level], attr_callback, &args, 0);
8078 
8079       /* Make room for the next level's DIE.  */
8080       if (level + 1 == maxdies)
8081 	dies = xrealloc (dies, (maxdies += 10) * sizeof (Dwarf_Die));
8082 
8083       int res = dwarf_child (&dies[level], &dies[level + 1]);
8084       if (res > 0)
8085 	{
8086 	  while ((res = dwarf_siblingof (&dies[level], &dies[level])) == 1)
8087 	    if (level-- == 0)
8088 	      break;
8089 
8090 	  if (unlikely (res == -1))
8091 	    {
8092 	      if (!silent)
8093 		error (0, 0, _("cannot get next DIE: %s\n"),
8094 		       dwarf_errmsg (-1));
8095 	      goto do_return;
8096 	    }
8097 	}
8098       else if (unlikely (res < 0))
8099 	{
8100 	  if (!silent)
8101 	    error (0, 0, _("cannot get next DIE: %s"),
8102 		   dwarf_errmsg (-1));
8103 	  goto do_return;
8104 	}
8105       else
8106 	++level;
8107     }
8108   while (level >= 0);
8109 
8110   /* We might want to show the split compile unit if this was a skeleton.
8111      We need to scan it if we are requesting printing .debug_ranges for
8112      DWARF4 since GNU DebugFission uses "offsets" into the main ranges
8113      section.  */
8114   if (unit_type == DW_UT_skeleton
8115       && ((!silent && show_split_units)
8116 	  || (version < 5 && (print_debug_sections & section_ranges) != 0)))
8117     {
8118       Dwarf_Die subdie;
8119       if (dwarf_cu_info (cu, NULL, NULL, NULL, &subdie, NULL, NULL, NULL) != 0
8120 	  || dwarf_tag (&subdie) == DW_TAG_invalid)
8121 	{
8122 	  if (!silent)
8123 	    {
8124 	      Dwarf_Attribute dwo_at;
8125 	      const char *dwo_name =
8126 		(dwarf_formstring (dwarf_attr (&cudie, DW_AT_dwo_name,
8127 					       &dwo_at))
8128 		 ?: (dwarf_formstring (dwarf_attr (&cudie, DW_AT_GNU_dwo_name,
8129 						   &dwo_at))
8130 		     ?: "<unknown>"));
8131 	      fprintf (stderr,
8132 		       "Could not find split unit '%s', id: %" PRIx64 "\n",
8133 		       dwo_name, unit_id);
8134 	    }
8135 	}
8136       else
8137 	{
8138 	  Dwarf_CU *split_cu = subdie.cu;
8139 	  dwarf_cu_die (split_cu, &result, NULL, &abbroffset,
8140 			&addrsize, &offsize, &unit_id, &subdie_off);
8141 	  Dwarf_Off offset = cu->start;
8142 
8143 	  if (!silent)
8144 	    {
8145 	      printf (_(" Split compilation unit at offset %"
8146 			       PRIu64 ":\n"
8147 			       " Version: %" PRIu16
8148 			       ", Abbreviation section offset: %" PRIu64
8149 			       ", Address size: %" PRIu8
8150 			       ", Offset size: %" PRIu8 "\n"),
8151 		      (uint64_t) offset, version, abbroffset,
8152 		      addrsize, offsize);
8153 	      printf (_(" Unit type: %s (%" PRIu8 ")"),
8154 		      dwarf_unit_name (unit_type), unit_type);
8155 	      printf (", Unit id: 0x%.16" PRIx64 "", unit_id);
8156 	      printf ("\n");
8157 	    }
8158 
8159 	  unit_type = DW_UT_split_compile;
8160 	  is_split = true;
8161 	  level = 0;
8162 	  dies[0] = subdie;
8163 	  args.cu = dies[0].cu;
8164 	  args.dbg = split_cu->dbg;
8165 	  args.is_split = is_split;
8166 	  goto do_cu;
8167 	}
8168     }
8169 
8170   /* And again... */
8171   goto next_cu;
8172 
8173  do_return:
8174   free (dies);
8175 }
8176 
8177 static void
print_debug_info_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)8178 print_debug_info_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
8179 			  Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
8180 {
8181   print_debug_units (dwflmod, ebl, ehdr, scn, shdr, dbg, false);
8182 }
8183 
8184 static void
print_debug_types_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)8185 print_debug_types_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
8186 			   Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
8187 {
8188   print_debug_units (dwflmod, ebl, ehdr, scn, shdr, dbg, true);
8189 }
8190 
8191 
8192 static void
print_decoded_line_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)8193 print_decoded_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
8194 			    GElf_Ehdr *ehdr __attribute__ ((unused)),
8195 			    Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
8196 {
8197   printf (_("\
8198 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n\n"),
8199 	  elf_ndxscn (scn), section_name (ebl, shdr),
8200 	  (uint64_t) shdr->sh_offset);
8201 
8202   size_t address_size
8203     = elf_getident (ebl->elf, NULL)[EI_CLASS] == ELFCLASS32 ? 4 : 8;
8204 
8205   Dwarf_Lines *lines;
8206   size_t nlines;
8207   Dwarf_Off off, next_off = 0;
8208   Dwarf_CU *cu = NULL;
8209   while (dwarf_next_lines (dbg, off = next_off, &next_off, &cu, NULL, NULL,
8210 			   &lines, &nlines) == 0)
8211     {
8212       Dwarf_Die cudie;
8213       if (cu != NULL && dwarf_cu_info (cu, NULL, NULL, &cudie,
8214 				       NULL, NULL, NULL, NULL) == 0)
8215 	printf (" CU [%" PRIx64 "] %s\n",
8216 		dwarf_dieoffset (&cudie), dwarf_diename (&cudie));
8217       else
8218 	{
8219 	  /* DWARF5 lines can be independent of any CU, but they probably
8220 	     are used by some CU.  Determine the CU this block is for.  */
8221 	  Dwarf_Off cuoffset;
8222 	  Dwarf_Off ncuoffset = 0;
8223 	  size_t hsize;
8224 	  while (dwarf_nextcu (dbg, cuoffset = ncuoffset, &ncuoffset, &hsize,
8225 			       NULL, NULL, NULL) == 0)
8226 	    {
8227 	      if (dwarf_offdie (dbg, cuoffset + hsize, &cudie) == NULL)
8228 		continue;
8229 	      Dwarf_Attribute stmt_list;
8230 	      if (dwarf_attr (&cudie, DW_AT_stmt_list, &stmt_list) == NULL)
8231 		continue;
8232 	      Dwarf_Word lineoff;
8233 	      if (dwarf_formudata (&stmt_list, &lineoff) != 0)
8234 		continue;
8235 	      if (lineoff == off)
8236 		{
8237 		  /* Found the CU.  */
8238 		  cu = cudie.cu;
8239 		  break;
8240 		}
8241 	    }
8242 
8243 	  if (cu != NULL)
8244 	    printf (" CU [%" PRIx64 "] %s\n",
8245 		    dwarf_dieoffset (&cudie), dwarf_diename (&cudie));
8246 	  else
8247 	    printf (" No CU\n");
8248 	}
8249 
8250       printf ("  line:col SBPE* disc isa op address"
8251 	      " (Statement Block Prologue Epilogue *End)\n");
8252       const char *last_file = "";
8253       for (size_t n = 0; n < nlines; n++)
8254 	{
8255 	  Dwarf_Line *line = dwarf_onesrcline (lines, n);
8256 	  if (line == NULL)
8257 	    {
8258 	      printf ("  dwarf_onesrcline: %s\n", dwarf_errmsg (-1));
8259 	      continue;
8260 	    }
8261 	  Dwarf_Word mtime, length;
8262 	  const char *file = dwarf_linesrc (line, &mtime, &length);
8263 	  if (file == NULL)
8264 	    {
8265 	      printf ("  <%s> (mtime: ?, length: ?)\n", dwarf_errmsg (-1));
8266 	      last_file = "";
8267 	    }
8268 	  else if (strcmp (last_file, file) != 0)
8269 	    {
8270 	      printf ("  %s (mtime: %" PRIu64 ", length: %" PRIu64 ")\n",
8271 		      file, mtime, length);
8272 	      last_file = file;
8273 	    }
8274 
8275 	  int lineno, colno;
8276 	  bool statement, endseq, block, prologue_end, epilogue_begin;
8277 	  unsigned int lineop, isa, disc;
8278 	  Dwarf_Addr address;
8279 	  dwarf_lineaddr (line, &address);
8280 	  dwarf_lineno (line, &lineno);
8281 	  dwarf_linecol (line, &colno);
8282 	  dwarf_lineop_index (line, &lineop);
8283 	  dwarf_linebeginstatement (line, &statement);
8284 	  dwarf_lineendsequence (line, &endseq);
8285 	  dwarf_lineblock (line, &block);
8286 	  dwarf_lineprologueend (line, &prologue_end);
8287 	  dwarf_lineepiloguebegin (line, &epilogue_begin);
8288 	  dwarf_lineisa (line, &isa);
8289 	  dwarf_linediscriminator (line, &disc);
8290 
8291 	  /* End sequence is special, it is one byte past.  */
8292 	  printf ("  %4d:%-3d %c%c%c%c%c %4d %3d %2d ",
8293 		  lineno, colno,
8294 		  (statement ? 'S' : ' '),
8295 		  (block ? 'B' : ' '),
8296 		  (prologue_end ? 'P' : ' '),
8297 		  (epilogue_begin ? 'E' : ' '),
8298 		  (endseq ? '*' : ' '),
8299 		  disc, isa, lineop);
8300 	  print_dwarf_addr (dwflmod, address_size,
8301 			    address - (endseq ? 1 : 0), address);
8302 	  printf ("\n");
8303 
8304 	  if (endseq)
8305 	    printf("\n");
8306 	}
8307     }
8308 }
8309 
8310 
8311 /* Print the value of a form.
8312    Returns new value of readp, or readendp on failure.  */
8313 static const unsigned char *
print_form_data(Dwarf * dbg,int form,const unsigned char * readp,const unsigned char * readendp,unsigned int offset_len,Dwarf_Off str_offsets_base)8314 print_form_data (Dwarf *dbg, int form, const unsigned char *readp,
8315 		 const unsigned char *readendp, unsigned int offset_len,
8316 		 Dwarf_Off str_offsets_base)
8317 {
8318   Dwarf_Word val;
8319   unsigned char *endp;
8320   Elf_Data *data;
8321   char *str;
8322   switch (form)
8323     {
8324     case DW_FORM_data1:
8325       if (readendp - readp < 1)
8326 	{
8327 	invalid_data:
8328 	  error (0, 0, "invalid data");
8329 	  return readendp;
8330 	}
8331       val = *readp++;
8332       printf (" %" PRIx8, (unsigned int) val);
8333       break;
8334 
8335     case DW_FORM_data2:
8336       if (readendp - readp < 2)
8337 	goto invalid_data;
8338       val = read_2ubyte_unaligned_inc (dbg, readp);
8339       printf(" %" PRIx16, (unsigned int) val);
8340       break;
8341 
8342     case DW_FORM_data4:
8343       if (readendp - readp < 4)
8344 	goto invalid_data;
8345       val = read_4ubyte_unaligned_inc (dbg, readp);
8346       printf (" %" PRIx32, (unsigned int) val);
8347       break;
8348 
8349     case DW_FORM_data8:
8350       if (readendp - readp < 8)
8351 	goto invalid_data;
8352       val = read_8ubyte_unaligned_inc (dbg, readp);
8353       printf (" %" PRIx64, val);
8354       break;
8355 
8356     case DW_FORM_sdata:
8357       if (readendp - readp < 1)
8358 	goto invalid_data;
8359       get_sleb128 (val, readp, readendp);
8360       printf (" %" PRIx64, val);
8361       break;
8362 
8363     case DW_FORM_udata:
8364       if (readendp - readp < 1)
8365 	goto invalid_data;
8366       get_uleb128 (val, readp, readendp);
8367       printf (" %" PRIx64, val);
8368       break;
8369 
8370     case DW_FORM_block:
8371       if (readendp - readp < 1)
8372 	goto invalid_data;
8373       get_uleb128 (val, readp, readendp);
8374       if ((size_t) (readendp - readp) < val)
8375 	goto invalid_data;
8376       print_bytes (val, readp);
8377       readp += val;
8378       break;
8379 
8380     case DW_FORM_block1:
8381       if (readendp - readp < 1)
8382 	goto invalid_data;
8383       val = *readp++;
8384       if ((size_t) (readendp - readp) < val)
8385 	goto invalid_data;
8386       print_bytes (val, readp);
8387       readp += val;
8388       break;
8389 
8390     case DW_FORM_block2:
8391       if (readendp - readp < 2)
8392 	goto invalid_data;
8393       val = read_2ubyte_unaligned_inc (dbg, readp);
8394       if ((size_t) (readendp - readp) < val)
8395 	goto invalid_data;
8396       print_bytes (val, readp);
8397       readp += val;
8398       break;
8399 
8400     case DW_FORM_block4:
8401       if (readendp - readp < 4)
8402 	goto invalid_data;
8403       val = read_4ubyte_unaligned_inc (dbg, readp);
8404       if ((size_t) (readendp - readp) < val)
8405 	goto invalid_data;
8406       print_bytes (val, readp);
8407       readp += val;
8408       break;
8409 
8410     case DW_FORM_data16:
8411       if (readendp - readp < 16)
8412 	goto invalid_data;
8413       print_bytes (16, readp);
8414       readp += 16;
8415       break;
8416 
8417     case DW_FORM_flag:
8418       if (readendp - readp < 1)
8419 	goto invalid_data;
8420       val = *readp++;
8421       printf ("%s", val != 0 ? yes_str : no_str);
8422       break;
8423 
8424     case DW_FORM_string:
8425       endp = memchr (readp, '\0', readendp - readp);
8426       if (endp == NULL)
8427 	goto invalid_data;
8428       printf ("%s", readp);
8429       readp = endp + 1;
8430       break;
8431 
8432     case DW_FORM_strp:
8433     case DW_FORM_line_strp:
8434     case DW_FORM_strp_sup:
8435       if ((size_t) (readendp - readp) < offset_len)
8436 	goto invalid_data;
8437       if (offset_len == 8)
8438 	val = read_8ubyte_unaligned_inc (dbg, readp);
8439       else
8440 	val = read_4ubyte_unaligned_inc (dbg, readp);
8441       if (form == DW_FORM_strp)
8442 	data = dbg->sectiondata[IDX_debug_str];
8443       else if (form == DW_FORM_line_strp)
8444 	data = dbg->sectiondata[IDX_debug_line_str];
8445       else /* form == DW_FORM_strp_sup */
8446 	{
8447 	  Dwarf *alt = dwarf_getalt (dbg);
8448 	  data = alt != NULL ? alt->sectiondata[IDX_debug_str] : NULL;
8449 	}
8450       if (data == NULL || val >= data->d_size
8451 	  || memchr (data->d_buf + val, '\0', data->d_size - val) == NULL)
8452 	str = "???";
8453       else
8454 	str = (char *) data->d_buf + val;
8455       printf ("%s (%" PRIu64 ")", str, val);
8456       break;
8457 
8458     case DW_FORM_sec_offset:
8459       if ((size_t) (readendp - readp) < offset_len)
8460 	goto invalid_data;
8461       if (offset_len == 8)
8462 	val = read_8ubyte_unaligned_inc (dbg, readp);
8463       else
8464 	val = read_4ubyte_unaligned_inc (dbg, readp);
8465       printf ("[%" PRIx64 "]", val);
8466       break;
8467 
8468     case DW_FORM_strx:
8469     case DW_FORM_GNU_str_index:
8470       if (readendp - readp < 1)
8471 	goto invalid_data;
8472       get_uleb128 (val, readp, readendp);
8473     strx_val:
8474       data = dbg->sectiondata[IDX_debug_str_offsets];
8475       if (data == NULL
8476 	  || data->d_size - str_offsets_base < val)
8477 	str = "???";
8478       else
8479 	{
8480 	  const unsigned char *strreadp = data->d_buf + str_offsets_base + val;
8481 	  const unsigned char *strreadendp = data->d_buf + data->d_size;
8482 	  if ((size_t) (strreadendp - strreadp) < offset_len)
8483 	    str = "???";
8484 	  else
8485 	    {
8486 	      Dwarf_Off idx;
8487 	      if (offset_len == 8)
8488 		idx = read_8ubyte_unaligned (dbg, strreadp);
8489 	      else
8490 		idx = read_4ubyte_unaligned (dbg, strreadp);
8491 
8492 	      data = dbg->sectiondata[IDX_debug_str];
8493 	      if (data == NULL || idx >= data->d_size
8494 		  || memchr (data->d_buf + idx, '\0',
8495 			     data->d_size - idx) == NULL)
8496 		str = "???";
8497 	      else
8498 		str = (char *) data->d_buf + idx;
8499 	    }
8500 	}
8501       printf ("%s (%" PRIu64 ")", str, val);
8502       break;
8503 
8504     case DW_FORM_strx1:
8505       if (readendp - readp < 1)
8506 	goto invalid_data;
8507       val = *readp++;
8508       goto strx_val;
8509 
8510     case DW_FORM_strx2:
8511       if (readendp - readp < 2)
8512 	goto invalid_data;
8513       val = read_2ubyte_unaligned_inc (dbg, readp);
8514       goto strx_val;
8515 
8516     case DW_FORM_strx3:
8517       if (readendp - readp < 3)
8518 	goto invalid_data;
8519       val = read_3ubyte_unaligned_inc (dbg, readp);
8520       goto strx_val;
8521 
8522     case DW_FORM_strx4:
8523       if (readendp - readp < 4)
8524 	goto invalid_data;
8525       val = read_4ubyte_unaligned_inc (dbg, readp);
8526       goto strx_val;
8527 
8528     default:
8529       error (0, 0, _("unknown form: %s"), dwarf_form_name (form));
8530       return readendp;
8531     }
8532 
8533   return readp;
8534 }
8535 
8536 /* Only used via run_advance_pc() macro */
8537 static inline void
run_advance_pc(unsigned int op_advance,unsigned int minimum_instr_len,unsigned int max_ops_per_instr,unsigned int * op_addr_advance,Dwarf_Word * address,unsigned int * op_index)8538 run_advance_pc (unsigned int op_advance,
8539                 unsigned int minimum_instr_len,
8540                 unsigned int max_ops_per_instr,
8541                 unsigned int *op_addr_advance,
8542                 Dwarf_Word *address,
8543                 unsigned int *op_index)
8544 {
8545   const unsigned int advanced_op_index = (*op_index) + op_advance;
8546 
8547   *op_addr_advance = minimum_instr_len * (advanced_op_index
8548                                          / max_ops_per_instr);
8549   *address = *address + *op_addr_advance;
8550   *op_index = advanced_op_index % max_ops_per_instr;
8551 }
8552 
8553 static void
print_debug_line_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)8554 print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
8555 			  Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
8556 {
8557   if (decodedline)
8558     {
8559       print_decoded_line_section (dwflmod, ebl, ehdr, scn, shdr, dbg);
8560       return;
8561     }
8562 
8563   printf (_("\
8564 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
8565 	  elf_ndxscn (scn), section_name (ebl, shdr),
8566 	  (uint64_t) shdr->sh_offset);
8567 
8568   if (shdr->sh_size == 0)
8569     return;
8570 
8571   /* There is no functionality in libdw to read the information in the
8572      way it is represented here.  Hardcode the decoder.  */
8573   Elf_Data *data = (dbg->sectiondata[IDX_debug_line]
8574 		    ?: elf_rawdata (scn, NULL));
8575   if (unlikely (data == NULL))
8576     {
8577       error (0, 0, _("cannot get line data section data: %s"),
8578 	     elf_errmsg (-1));
8579       return;
8580     }
8581 
8582   const unsigned char *linep = (const unsigned char *) data->d_buf;
8583   const unsigned char *lineendp;
8584 
8585   while (linep
8586 	 < (lineendp = (const unsigned char *) data->d_buf + data->d_size))
8587     {
8588       size_t start_offset = linep - (const unsigned char *) data->d_buf;
8589 
8590       printf (_("\nTable at offset %zu:\n"), start_offset);
8591 
8592       if (unlikely (linep + 4 > lineendp))
8593 	goto invalid_data;
8594       Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, linep);
8595       unsigned int length = 4;
8596       if (unlikely (unit_length == 0xffffffff))
8597 	{
8598 	  if (unlikely (linep + 8 > lineendp))
8599 	    {
8600 	    invalid_data:
8601 	      error (0, 0, _("invalid data in section [%zu] '%s'"),
8602 		     elf_ndxscn (scn), section_name (ebl, shdr));
8603 	      return;
8604 	    }
8605 	  unit_length = read_8ubyte_unaligned_inc (dbg, linep);
8606 	  length = 8;
8607 	}
8608 
8609       /* Check whether we have enough room in the section.  */
8610       if (unlikely (unit_length > (size_t) (lineendp - linep)))
8611 	goto invalid_data;
8612       lineendp = linep + unit_length;
8613 
8614       /* The next element of the header is the version identifier.  */
8615       if ((size_t) (lineendp - linep) < 2)
8616 	goto invalid_data;
8617       uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, linep);
8618 
8619       size_t address_size
8620 	= elf_getident (ebl->elf, NULL)[EI_CLASS] == ELFCLASS32 ? 4 : 8;
8621       unsigned char segment_selector_size = 0;
8622       if (version > 4)
8623 	{
8624 	  if ((size_t) (lineendp - linep) < 2)
8625 	    goto invalid_data;
8626 	  address_size = *linep++;
8627 	  segment_selector_size = *linep++;
8628 	}
8629 
8630       /* Next comes the header length.  */
8631       Dwarf_Word header_length;
8632       if (length == 4)
8633 	{
8634 	  if ((size_t) (lineendp - linep) < 4)
8635 	    goto invalid_data;
8636 	  header_length = read_4ubyte_unaligned_inc (dbg, linep);
8637 	}
8638       else
8639 	{
8640 	  if ((size_t) (lineendp - linep) < 8)
8641 	    goto invalid_data;
8642 	  header_length = read_8ubyte_unaligned_inc (dbg, linep);
8643 	}
8644 
8645       const unsigned char *header_start = linep;
8646 
8647       /* Next the minimum instruction length.  */
8648       if ((size_t) (lineendp - linep) < 1)
8649 	goto invalid_data;
8650       uint_fast8_t minimum_instr_len = *linep++;
8651 
8652       /* Next the maximum operations per instruction, in version 4 format.  */
8653       uint_fast8_t max_ops_per_instr;
8654       if (version < 4)
8655 	max_ops_per_instr = 1;
8656       else
8657 	{
8658 	  if ((size_t) (lineendp - linep) < 1)
8659 	    goto invalid_data;
8660 	  max_ops_per_instr = *linep++;
8661 	}
8662 
8663       /* We need at least 4 more bytes.  */
8664       if ((size_t) (lineendp - linep) < 4)
8665 	goto invalid_data;
8666 
8667       /* Then the flag determining the default value of the is_stmt
8668 	 register.  */
8669       uint_fast8_t default_is_stmt = *linep++;
8670 
8671       /* Now the line base.  */
8672       int_fast8_t line_base = *linep++;
8673 
8674       /* And the line range.  */
8675       uint_fast8_t line_range = *linep++;
8676 
8677       /* The opcode base.  */
8678       uint_fast8_t opcode_base = *linep++;
8679 
8680       /* Print what we got so far.  */
8681       printf (_("\n"
8682 		       " Length:                         %" PRIu64 "\n"
8683 		       " DWARF version:                  %" PRIuFAST16 "\n"
8684 		       " Prologue length:                %" PRIu64 "\n"
8685 		       " Address size:                   %zd\n"
8686 		       " Segment selector size:          %zd\n"
8687 		       " Min instruction length:         %" PRIuFAST8 "\n"
8688 		       " Max operations per instruction: %" PRIuFAST8 "\n"
8689 		       " Initial value if 'is_stmt':     %" PRIuFAST8 "\n"
8690 		       " Line base:                      %" PRIdFAST8 "\n"
8691 		       " Line range:                     %" PRIuFAST8 "\n"
8692 		       " Opcode base:                    %" PRIuFAST8 "\n"
8693 		       "\n"
8694 		       "Opcodes:\n"),
8695 	      (uint64_t) unit_length, version, (uint64_t) header_length,
8696 	      address_size, (size_t) segment_selector_size,
8697 	      minimum_instr_len, max_ops_per_instr,
8698 	      default_is_stmt, line_base,
8699 	      line_range, opcode_base);
8700 
8701       if (version < 2 || version > 5)
8702 	{
8703 	  error (0, 0, _("cannot handle .debug_line version: %u\n"),
8704 		 (unsigned int) version);
8705 	  linep = lineendp;
8706 	  continue;
8707 	}
8708 
8709       if (address_size != 4 && address_size != 8)
8710 	{
8711 	  error (0, 0, _("cannot handle address size: %u\n"),
8712 		 (unsigned int) address_size);
8713 	  linep = lineendp;
8714 	  continue;
8715 	}
8716 
8717       if (segment_selector_size != 0)
8718 	{
8719 	  error (0, 0, _("cannot handle segment selector size: %u\n"),
8720 		 (unsigned int) segment_selector_size);
8721 	  linep = lineendp;
8722 	  continue;
8723 	}
8724 
8725       if (unlikely (linep + opcode_base - 1 >= lineendp))
8726 	{
8727 	invalid_unit:
8728 	  error (0, 0,
8729 		 _("invalid data at offset %tu in section [%zu] '%s'"),
8730 		 linep - (const unsigned char *) data->d_buf,
8731 		 elf_ndxscn (scn), section_name (ebl, shdr));
8732 	  linep = lineendp;
8733 	  continue;
8734 	}
8735       int opcode_base_l10 = 1;
8736       unsigned int tmp = opcode_base;
8737       while (tmp > 10)
8738 	{
8739 	  tmp /= 10;
8740 	  ++opcode_base_l10;
8741 	}
8742       const uint8_t *standard_opcode_lengths = linep - 1;
8743       for (uint_fast8_t cnt = 1; cnt < opcode_base; ++cnt)
8744 	printf (ngettext ("  [%*" PRIuFAST8 "]  %hhu argument\n",
8745 			  "  [%*" PRIuFAST8 "]  %hhu arguments\n",
8746 			  (int) linep[cnt - 1]),
8747 		opcode_base_l10, cnt, linep[cnt - 1]);
8748       linep += opcode_base - 1;
8749 
8750       if (unlikely (linep >= lineendp))
8751 	goto invalid_unit;
8752 
8753       Dwarf_Off str_offsets_base = str_offsets_base_off (dbg, NULL);
8754 
8755       puts (_("\nDirectory table:"));
8756       if (version > 4)
8757 	{
8758 	  struct encpair { uint16_t desc; uint16_t form; };
8759 	  struct encpair enc[256];
8760 
8761 	  printf (_("      ["));
8762 	  if ((size_t) (lineendp - linep) < 1)
8763 	    goto invalid_data;
8764 	  unsigned char directory_entry_format_count = *linep++;
8765 	  for (int i = 0; i < directory_entry_format_count; i++)
8766 	    {
8767 	      uint16_t desc, form;
8768 	      if ((size_t) (lineendp - linep) < 1)
8769 		goto invalid_data;
8770 	      get_uleb128 (desc, linep, lineendp);
8771 	      if ((size_t) (lineendp - linep) < 1)
8772 		goto invalid_data;
8773 	      get_uleb128 (form, linep, lineendp);
8774 
8775 	      enc[i].desc = desc;
8776 	      enc[i].form = form;
8777 
8778 	      printf ("%s(%s)",
8779 		      dwarf_line_content_description_name (desc),
8780 		      dwarf_form_name (form));
8781 	      if (i + 1 < directory_entry_format_count)
8782 		printf (", ");
8783 	    }
8784 	  printf ("]\n");
8785 
8786 	  uint64_t directories_count;
8787 	  if ((size_t) (lineendp - linep) < 1)
8788             goto invalid_data;
8789 	  get_uleb128 (directories_count, linep, lineendp);
8790 
8791 	  if (directory_entry_format_count == 0
8792 	      && directories_count != 0)
8793 	    goto invalid_data;
8794 
8795 	  for (uint64_t i = 0; i < directories_count; i++)
8796 	    {
8797 	      printf (" %-5" PRIu64 " ", i);
8798 	      for (int j = 0; j < directory_entry_format_count; j++)
8799 		{
8800 		  linep = print_form_data (dbg, enc[j].form,
8801 					   linep, lineendp, length,
8802 					   str_offsets_base);
8803 		  if (j + 1 < directory_entry_format_count)
8804 		    printf (", ");
8805 		}
8806 	      printf ("\n");
8807 	      if (linep >= lineendp)
8808 		goto invalid_unit;
8809 	    }
8810 	}
8811       else
8812 	{
8813 	  while (linep < lineendp && *linep != 0)
8814 	    {
8815 	      unsigned char *endp = memchr (linep, '\0', lineendp - linep);
8816 	      if (unlikely (endp == NULL))
8817 		goto invalid_unit;
8818 
8819 	      printf (" %s\n", (char *) linep);
8820 
8821 	      linep = endp + 1;
8822 	    }
8823 	  if (linep >= lineendp || *linep != 0)
8824 	    goto invalid_unit;
8825 	  /* Skip the final NUL byte.  */
8826 	  ++linep;
8827 	}
8828 
8829       if (unlikely (linep >= lineendp))
8830 	goto invalid_unit;
8831 
8832       puts (_("\nFile name table:"));
8833       if (version > 4)
8834 	{
8835 	  struct encpair { uint16_t desc; uint16_t form; };
8836 	  struct encpair enc[256];
8837 
8838 	  printf (_("      ["));
8839 	  if ((size_t) (lineendp - linep) < 1)
8840 	    goto invalid_data;
8841 	  unsigned char file_name_format_count = *linep++;
8842 	  for (int i = 0; i < file_name_format_count; i++)
8843 	    {
8844 	      uint64_t desc, form;
8845 	      if ((size_t) (lineendp - linep) < 1)
8846 		goto invalid_data;
8847 	      get_uleb128 (desc, linep, lineendp);
8848 	      if ((size_t) (lineendp - linep) < 1)
8849 		goto invalid_data;
8850 	      get_uleb128 (form, linep, lineendp);
8851 
8852 	      if (! libdw_valid_user_form (form))
8853 		goto invalid_data;
8854 
8855 	      enc[i].desc = desc;
8856 	      enc[i].form = form;
8857 
8858 	      printf ("%s(%s)",
8859 		      dwarf_line_content_description_name (desc),
8860 		      dwarf_form_name (form));
8861 	      if (i + 1 < file_name_format_count)
8862 		printf (", ");
8863 	    }
8864 	  printf ("]\n");
8865 
8866 	  uint64_t file_name_count;
8867 	  if ((size_t) (lineendp - linep) < 1)
8868             goto invalid_data;
8869 	  get_uleb128 (file_name_count, linep, lineendp);
8870 
8871 	  if (file_name_format_count == 0
8872 	      && file_name_count != 0)
8873 	    goto invalid_data;
8874 
8875 	  for (uint64_t i = 0; i < file_name_count; i++)
8876 	    {
8877 	      printf (" %-5" PRIu64 " ", i);
8878 	      for (int j = 0; j < file_name_format_count; j++)
8879 		{
8880 		  linep = print_form_data (dbg, enc[j].form,
8881 					   linep, lineendp, length,
8882 					   str_offsets_base);
8883 		  if (j + 1 < file_name_format_count)
8884 		    printf (", ");
8885 		}
8886 	      printf ("\n");
8887 	      if (linep > lineendp)
8888 		goto invalid_unit;
8889 	    }
8890 	}
8891       else
8892 	{
8893 	  puts (_(" Entry Dir   Time      Size      Name"));
8894 	  for (unsigned int cnt = 1; linep < lineendp && *linep != 0; ++cnt)
8895 	    {
8896 	      /* First comes the file name.  */
8897 	      char *fname = (char *) linep;
8898 	      unsigned char *endp = memchr (fname, '\0', lineendp - linep);
8899 	      if (unlikely (endp == NULL))
8900 		goto invalid_unit;
8901 	      linep = endp + 1;
8902 
8903 	      /* Then the index.  */
8904 	      unsigned int diridx;
8905 	      if (lineendp - linep < 1)
8906 		goto invalid_unit;
8907 	      get_uleb128 (diridx, linep, lineendp);
8908 
8909 	      /* Next comes the modification time.  */
8910 	      unsigned int mtime;
8911 	      if (lineendp - linep < 1)
8912 		goto invalid_unit;
8913 	      get_uleb128 (mtime, linep, lineendp);
8914 
8915 	      /* Finally the length of the file.  */
8916 	      unsigned int fsize;
8917 	      if (lineendp - linep < 1)
8918 		goto invalid_unit;
8919 	      get_uleb128 (fsize, linep, lineendp);
8920 
8921 	      printf (" %-5u %-5u %-9u %-9u %s\n",
8922 		      cnt, diridx, mtime, fsize, fname);
8923 	    }
8924 	  if (linep >= lineendp || *linep != '\0')
8925 	    goto invalid_unit;
8926 	  /* Skip the final NUL byte.  */
8927 	  ++linep;
8928 	}
8929 
8930       unsigned int debug_str_offset = 0;
8931       if (unlikely (linep == header_start + header_length - 4))
8932 	{
8933 	  /* CUBINs contain an unsigned 4-byte offset */
8934 	  debug_str_offset = read_4ubyte_unaligned_inc (dbg, linep);
8935 	}
8936 
8937       if (linep == lineendp)
8938 	{
8939 	  puts (_("\nNo line number statements."));
8940 	  continue;
8941 	}
8942 
8943       puts (_("\nLine number statements:"));
8944       Dwarf_Word address = 0;
8945       unsigned int op_index = 0;
8946       size_t line = 1;
8947       uint_fast8_t is_stmt = default_is_stmt;
8948 
8949       /* Apply the "operation advance" from a special opcode
8950 	 or DW_LNS_advance_pc (as per DWARF4 6.2.5.1).  */
8951       unsigned int op_addr_advance;
8952 #define advance_pc(op_advance) run_advance_pc(op_advance, minimum_instr_len, \
8953                       max_ops_per_instr, &op_addr_advance, &address, &op_index)
8954 
8955       if (max_ops_per_instr == 0)
8956 	{
8957 	  error (0, 0,
8958 		 _("invalid maximum operations per instruction is zero"));
8959 	  linep = lineendp;
8960 	  continue;
8961 	}
8962 
8963       while (linep < lineendp)
8964 	{
8965 	  size_t offset = linep - (const unsigned char *) data->d_buf;
8966 	  unsigned int u128;
8967 	  int s128;
8968 
8969 	  /* Read the opcode.  */
8970 	  unsigned int opcode = *linep++;
8971 
8972 	  printf (" [%6" PRIx64 "]", (uint64_t)offset);
8973 	  /* Is this a special opcode?  */
8974 	  if (likely (opcode >= opcode_base))
8975 	    {
8976 	      if (unlikely (line_range == 0))
8977 		goto invalid_unit;
8978 
8979 	      /* Yes.  Handling this is quite easy since the opcode value
8980 		 is computed with
8981 
8982 		 opcode = (desired line increment - line_base)
8983 			   + (line_range * address advance) + opcode_base
8984 	      */
8985 	      int line_increment = (line_base
8986 				    + (opcode - opcode_base) % line_range);
8987 
8988 	      /* Perform the increments.  */
8989 	      line += line_increment;
8990 	      advance_pc ((opcode - opcode_base) / line_range);
8991 
8992 	      printf (_(" special opcode %u: address+%u = "),
8993 		      opcode, op_addr_advance);
8994 	      print_dwarf_addr (dwflmod, 0, address, address);
8995 	      if (op_index > 0)
8996 		printf (_(", op_index = %u, line%+d = %zu\n"),
8997 			op_index, line_increment, line);
8998 	      else
8999 		printf (_(", line%+d = %zu\n"),
9000 			line_increment, line);
9001 	    }
9002 	  else if (opcode == 0)
9003 	    {
9004 	      /* This an extended opcode.  */
9005 	      if (unlikely (linep + 2 > lineendp))
9006 		goto invalid_unit;
9007 
9008 	      /* The length.  */
9009 	      unsigned int len = *linep++;
9010 
9011 	      if (unlikely (linep + len > lineendp))
9012 		goto invalid_unit;
9013 
9014 	      /* The sub-opcode.  */
9015 	      opcode = *linep++;
9016 
9017 	      printf (_(" extended opcode %u: "), opcode);
9018 
9019 	      switch (opcode)
9020 		{
9021 		case DW_LNE_end_sequence:
9022 		  puts (_(" end of sequence"));
9023 
9024 		  /* Reset the registers we care about.  */
9025 		  address = 0;
9026 		  op_index = 0;
9027 		  line = 1;
9028 		  is_stmt = default_is_stmt;
9029 		  break;
9030 
9031 		case DW_LNE_set_address:
9032 		  op_index = 0;
9033 		  if (unlikely ((size_t) (lineendp - linep) < address_size))
9034 		    goto invalid_unit;
9035 		  if (address_size == 4)
9036 		    address = read_4ubyte_unaligned_inc (dbg, linep);
9037 		  else
9038 		    address = read_8ubyte_unaligned_inc (dbg, linep);
9039 		  {
9040 		    printf (_(" set address to "));
9041 		    print_dwarf_addr (dwflmod, 0, address, address);
9042 		    printf ("\n");
9043 		  }
9044 		  break;
9045 
9046 		case DW_LNE_define_file:
9047 		  {
9048 		    char *fname = (char *) linep;
9049 		    unsigned char *endp = memchr (linep, '\0',
9050 						  lineendp - linep);
9051 		    if (unlikely (endp == NULL))
9052 		      goto invalid_unit;
9053 		    linep = endp + 1;
9054 
9055 		    unsigned int diridx;
9056 		    if (lineendp - linep < 1)
9057 		      goto invalid_unit;
9058 		    get_uleb128 (diridx, linep, lineendp);
9059 		    Dwarf_Word mtime;
9060 		    if (lineendp - linep < 1)
9061 		      goto invalid_unit;
9062 		    get_uleb128 (mtime, linep, lineendp);
9063 		    Dwarf_Word filelength;
9064 		    if (lineendp - linep < 1)
9065 		      goto invalid_unit;
9066 		    get_uleb128 (filelength, linep, lineendp);
9067 
9068 		    printf (_("\
9069  define new file: dir=%u, mtime=%" PRIu64 ", length=%" PRIu64 ", name=%s\n"),
9070 			    diridx, (uint64_t) mtime, (uint64_t) filelength,
9071 			    fname);
9072 		  }
9073 		  break;
9074 
9075 		case DW_LNE_set_discriminator:
9076 		  /* Takes one ULEB128 parameter, the discriminator.  */
9077 		  if (unlikely (standard_opcode_lengths[opcode] != 1
9078 				|| lineendp - linep < 1))
9079 		    goto invalid_unit;
9080 
9081 		  get_uleb128 (u128, linep, lineendp);
9082 		  printf (_(" set discriminator to %u\n"), u128);
9083 		  break;
9084 
9085 		case DW_LNE_NVIDIA_inlined_call:
9086 		  {
9087 		    if (unlikely (linep >= lineendp))
9088 		      goto invalid_data;
9089 
9090 		    unsigned int context;
9091 		    get_uleb128 (context, linep, lineendp);
9092 
9093 		    if (unlikely (linep >= lineendp))
9094 		      goto invalid_data;
9095 
9096 		    unsigned int function_name;
9097 		    get_uleb128 (function_name, linep, lineendp);
9098 		    function_name += debug_str_offset;
9099 
9100 		    Elf_Data *str_data = dbg->sectiondata[IDX_debug_str];
9101 		    char *function_str;
9102 		    if (str_data == NULL || function_name >= str_data->d_size
9103 			|| memchr (str_data->d_buf + function_name, '\0',
9104 				   str_data->d_size - function_name) == NULL)
9105 		      function_str = "???";
9106 		    else
9107 		      function_str = (char *) str_data->d_buf + function_name;
9108 
9109 		    printf (_(" set inlined context %u,"
9110 		              " function name %s (0x%x)\n"),
9111 			    context, function_str, function_name);
9112 		    break;
9113 		  }
9114 
9115 		case DW_LNE_NVIDIA_set_function_name:
9116 		  {
9117 		    if (unlikely (linep >= lineendp))
9118 		      goto invalid_data;
9119 
9120 		    unsigned int function_name;
9121 		    get_uleb128 (function_name, linep, lineendp);
9122 		    function_name += debug_str_offset;
9123 
9124 		    Elf_Data *str_data = dbg->sectiondata[IDX_debug_str];
9125 		    char *function_str;
9126 		    if (str_data == NULL || function_name >= str_data->d_size
9127 			|| memchr (str_data->d_buf + function_name, '\0',
9128 				   str_data->d_size - function_name) == NULL)
9129 		      function_str = "???";
9130 		    else
9131 		      function_str = (char *) str_data->d_buf + function_name;
9132 
9133 		    printf (_(" set function name %s (0x%x)\n"),
9134 			    function_str, function_name);
9135 		  }
9136 		  break;
9137 
9138 		default:
9139 		  /* Unknown, ignore it.  */
9140 		  puts (_(" unknown opcode"));
9141 		  linep += len - 1;
9142 		  break;
9143 		}
9144 	    }
9145 	  else if (opcode <= DW_LNS_set_isa)
9146 	    {
9147 	      /* This is a known standard opcode.  */
9148 	      switch (opcode)
9149 		{
9150 		case DW_LNS_copy:
9151 		  /* Takes no argument.  */
9152 		  puts (_(" copy"));
9153 		  break;
9154 
9155 		case DW_LNS_advance_pc:
9156 		  /* Takes one uleb128 parameter which is added to the
9157 		     address.  */
9158 		  if (lineendp - linep < 1)
9159 		    goto invalid_unit;
9160 		  get_uleb128 (u128, linep, lineendp);
9161 		  advance_pc (u128);
9162 		  {
9163 		    printf (_(" advance address by %u to "),
9164 			    op_addr_advance);
9165 		    print_dwarf_addr (dwflmod, 0, address, address);
9166 		    if (op_index > 0)
9167 		      printf (_(", op_index to %u"), op_index);
9168 		    printf ("\n");
9169 		  }
9170 		  break;
9171 
9172 		case DW_LNS_advance_line:
9173 		  /* Takes one sleb128 parameter which is added to the
9174 		     line.  */
9175 		  if (lineendp - linep < 1)
9176 		    goto invalid_unit;
9177 		  get_sleb128 (s128, linep, lineendp);
9178 		  line += s128;
9179 		  printf (_("\
9180  advance line by constant %d to %" PRId64 "\n"),
9181 			  s128, (int64_t) line);
9182 		  break;
9183 
9184 		case DW_LNS_set_file:
9185 		  /* Takes one uleb128 parameter which is stored in file.  */
9186 		  if (lineendp - linep < 1)
9187 		    goto invalid_unit;
9188 		  get_uleb128 (u128, linep, lineendp);
9189 		  printf (_(" set file to %" PRIu64 "\n"),
9190 			  (uint64_t) u128);
9191 		  break;
9192 
9193 		case DW_LNS_set_column:
9194 		  /* Takes one uleb128 parameter which is stored in column.  */
9195 		  if (unlikely (standard_opcode_lengths[opcode] != 1
9196 				|| lineendp - linep < 1))
9197 		    goto invalid_unit;
9198 
9199 		  get_uleb128 (u128, linep, lineendp);
9200 		  printf (_(" set column to %" PRIu64 "\n"),
9201 			  (uint64_t) u128);
9202 		  break;
9203 
9204 		case DW_LNS_negate_stmt:
9205 		  /* Takes no argument.  */
9206 		  is_stmt = 1 - is_stmt;
9207 		  printf (_(" set '%s' to %" PRIuFAST8 "\n"),
9208 			  "is_stmt", is_stmt);
9209 		  break;
9210 
9211 		case DW_LNS_set_basic_block:
9212 		  /* Takes no argument.  */
9213 		  puts (_(" set basic block flag"));
9214 		  break;
9215 
9216 		case DW_LNS_const_add_pc:
9217 		  /* Takes no argument.  */
9218 
9219 		  if (unlikely (line_range == 0))
9220 		    goto invalid_unit;
9221 
9222 		  advance_pc ((255 - opcode_base) / line_range);
9223 		  {
9224 		    printf (_(" advance address by constant %u to "),
9225 			    op_addr_advance);
9226 		    print_dwarf_addr (dwflmod, 0, address, address);
9227 		    if (op_index > 0)
9228 		      printf (_(", op_index to %u"), op_index);
9229 		    printf ("\n");
9230 		  }
9231 		  break;
9232 
9233 		case DW_LNS_fixed_advance_pc:
9234 		  /* Takes one 16 bit parameter which is added to the
9235 		     address.  */
9236 		  if (unlikely (standard_opcode_lengths[opcode] != 1
9237 				|| lineendp - linep < 2))
9238 		    goto invalid_unit;
9239 
9240 		  u128 = read_2ubyte_unaligned_inc (dbg, linep);
9241 		  address += u128;
9242 		  op_index = 0;
9243 		  {
9244 		    printf (_("\
9245  advance address by fixed value %u to \n"),
9246 			    u128);
9247 		    print_dwarf_addr (dwflmod, 0, address, address);
9248 		    printf ("\n");
9249 		  }
9250 		  break;
9251 
9252 		case DW_LNS_set_prologue_end:
9253 		  /* Takes no argument.  */
9254 		  puts (_(" set prologue end flag"));
9255 		  break;
9256 
9257 		case DW_LNS_set_epilogue_begin:
9258 		  /* Takes no argument.  */
9259 		  puts (_(" set epilogue begin flag"));
9260 		  break;
9261 
9262 		case DW_LNS_set_isa:
9263 		  /* Takes one uleb128 parameter which is stored in isa.  */
9264 		  if (unlikely (standard_opcode_lengths[opcode] != 1
9265 				|| lineendp - linep < 1))
9266 		    goto invalid_unit;
9267 
9268 		  get_uleb128 (u128, linep, lineendp);
9269 		  printf (_(" set isa to %u\n"), u128);
9270 		  break;
9271 		}
9272 	    }
9273 	  else
9274 	    {
9275 	      /* This is a new opcode the generator but not we know about.
9276 		 Read the parameters associated with it but then discard
9277 		 everything.  Read all the parameters for this opcode.  */
9278 	      printf (ngettext (" unknown opcode with %" PRIu8 " parameter:",
9279 				" unknown opcode with %" PRIu8 " parameters:",
9280 				standard_opcode_lengths[opcode]),
9281 		      standard_opcode_lengths[opcode]);
9282 	      for (int n = standard_opcode_lengths[opcode];
9283 		   n > 0 && linep < lineendp; --n)
9284 		{
9285 		  get_uleb128 (u128, linep, lineendp);
9286 		  if (n != standard_opcode_lengths[opcode])
9287 		    putc_unlocked (',', stdout);
9288 		  printf (" %u", u128);
9289 		}
9290 
9291 	      /* Next round, ignore this opcode.  */
9292 	      continue;
9293 	    }
9294 	}
9295     }
9296 
9297   /* There must only be one data block.  */
9298   assert (elf_getdata (scn, data) == NULL);
9299 }
9300 
9301 
9302 static void
print_debug_loclists_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)9303 print_debug_loclists_section (Dwfl_Module *dwflmod,
9304 			      Ebl *ebl,
9305 			      GElf_Ehdr *ehdr __attribute__ ((unused)),
9306 			      Elf_Scn *scn, GElf_Shdr *shdr,
9307 			      Dwarf *dbg)
9308 {
9309   printf (_("\
9310 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
9311 	  elf_ndxscn (scn), section_name (ebl, shdr),
9312 	  (uint64_t) shdr->sh_offset);
9313 
9314   Elf_Data *data = (dbg->sectiondata[IDX_debug_loclists]
9315 		    ?: elf_rawdata (scn, NULL));
9316   if (unlikely (data == NULL))
9317     {
9318       error (0, 0, _("cannot get .debug_loclists content: %s"),
9319 	     elf_errmsg (-1));
9320       return;
9321     }
9322 
9323   /* For the listptr to get the base address/CU.  */
9324   sort_listptr (&known_loclistsptr, "loclistsptr");
9325   size_t listptr_idx = 0;
9326 
9327   const unsigned char *readp = data->d_buf;
9328   const unsigned char *const dataend = ((unsigned char *) data->d_buf
9329 					+ data->d_size);
9330   while (readp < dataend)
9331     {
9332       if (unlikely (readp > dataend - 4))
9333 	{
9334 	invalid_data:
9335 	  error (0, 0, _("invalid data in section [%zu] '%s'"),
9336 		 elf_ndxscn (scn), section_name (ebl, shdr));
9337 	  return;
9338 	}
9339 
9340       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
9341       printf (_("Table at Offset 0x%" PRIx64 ":\n\n"),
9342 	      (uint64_t) offset);
9343 
9344       uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
9345       unsigned int offset_size = 4;
9346       if (unlikely (unit_length == 0xffffffff))
9347 	{
9348 	  if (unlikely (readp > dataend - 8))
9349 	    goto invalid_data;
9350 
9351 	  unit_length = read_8ubyte_unaligned_inc (dbg, readp);
9352 	  offset_size = 8;
9353 	}
9354       printf (_(" Length:         %8" PRIu64 "\n"), unit_length);
9355 
9356       /* We need at least 2-bytes + 1-byte + 1-byte + 4-bytes = 8
9357 	 bytes to complete the header.  And this unit cannot go beyond
9358 	 the section data.  */
9359       if (readp > dataend - 8
9360 	  || unit_length < 8
9361 	  || unit_length > (uint64_t) (dataend - readp))
9362 	goto invalid_data;
9363 
9364       const unsigned char *nexthdr = readp + unit_length;
9365 
9366       uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
9367       printf (_(" DWARF version:  %8" PRIu16 "\n"), version);
9368 
9369       if (version != 5)
9370 	{
9371 	  error (0, 0, _("Unknown version"));
9372 	  goto next_table;
9373 	}
9374 
9375       uint8_t address_size = *readp++;
9376       printf (_(" Address size:   %8" PRIu64 "\n"),
9377 	      (uint64_t) address_size);
9378 
9379       if (address_size != 4 && address_size != 8)
9380 	{
9381 	  error (0, 0, _("unsupported address size"));
9382 	  goto next_table;
9383 	}
9384 
9385       uint8_t segment_size = *readp++;
9386       printf (_(" Segment size:   %8" PRIu64 "\n"),
9387 	      (uint64_t) segment_size);
9388 
9389       if (segment_size != 0)
9390         {
9391           error (0, 0, _("unsupported segment size"));
9392           goto next_table;
9393         }
9394 
9395       uint32_t offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
9396       printf (_(" Offset entries: %8" PRIu64 "\n"),
9397 	      (uint64_t) offset_entry_count);
9398 
9399       /* We need the CU that uses this unit to get the initial base address. */
9400       Dwarf_Addr cu_base = 0;
9401       struct Dwarf_CU *cu = NULL;
9402       if (listptr_cu (&known_loclistsptr, &listptr_idx,
9403 		      (Dwarf_Off) offset,
9404 		      (Dwarf_Off) (nexthdr - (unsigned char *) data->d_buf),
9405 		      &cu_base, &cu)
9406 	  || split_dwarf_cu_base (dbg, &cu, &cu_base))
9407 	{
9408 	  Dwarf_Die cudie;
9409 	  if (dwarf_cu_die (cu, &cudie,
9410 			    NULL, NULL, NULL, NULL,
9411 			    NULL, NULL) == NULL)
9412 	    printf (_(" Unknown CU base: "));
9413 	  else
9414 	    printf (_(" CU [%6" PRIx64 "] base: "),
9415 		    dwarf_dieoffset (&cudie));
9416 	  print_dwarf_addr (dwflmod, address_size, cu_base, cu_base);
9417 	  printf ("\n");
9418 	}
9419       else
9420 	printf (_(" Not associated with a CU.\n"));
9421 
9422       printf ("\n");
9423 
9424       const unsigned char *offset_array_start = readp;
9425       if (offset_entry_count > 0)
9426 	{
9427 	  uint64_t max_entries = (unit_length - 8) / offset_size;
9428 	  if (offset_entry_count > max_entries)
9429 	    {
9430 	      error (0, 0,
9431 		     _("too many offset entries for unit length"));
9432 	      offset_entry_count = max_entries;
9433 	    }
9434 
9435 	  printf (_("  Offsets starting at 0x%" PRIx64 ":\n"),
9436 		  (uint64_t) (offset_array_start
9437 			      - (unsigned char *) data->d_buf));
9438 	  for (uint32_t idx = 0; idx < offset_entry_count; idx++)
9439 	    {
9440 	      printf ("   [%6" PRIu32 "] ", idx);
9441 	      if (offset_size == 4)
9442 		{
9443 		  uint32_t off = read_4ubyte_unaligned_inc (dbg, readp);
9444 		  printf ("0x%" PRIx32 "\n", off);
9445 		}
9446 	      else
9447 		{
9448 		  uint64_t off = read_8ubyte_unaligned_inc (dbg, readp);
9449 		  printf ("0x%" PRIx64 "\n", off);
9450 		}
9451 	    }
9452 	  printf ("\n");
9453 	}
9454 
9455       Dwarf_Addr base = cu_base;
9456       bool start_of_list = true;
9457       while (readp < nexthdr)
9458 	{
9459 	  Dwarf_Off off = (Dwarf_Off) (readp - (unsigned char *) data->d_buf);
9460 	  if (listptr_attr (&known_loclistsptr, listptr_idx, off,
9461 			    DW_AT_GNU_locviews))
9462 	    {
9463 	      Dwarf_Off next_off = next_listptr_offset (&known_loclistsptr,
9464 							&listptr_idx, off);
9465 	      const unsigned char *locp = readp;
9466 	      const unsigned char *locendp;
9467 	      if (next_off == 0
9468 		  || next_off > (size_t) (nexthdr - ((const unsigned char *)
9469 						     data->d_buf)))
9470 		locendp = nexthdr;
9471 	      else
9472 		locendp = (const unsigned char *) data->d_buf + next_off;
9473 
9474 	      printf ("  Offset: %" PRIx64 ", Index: %" PRIx64 "\n",
9475 		      (uint64_t) (readp - (unsigned char *) data->d_buf),
9476 		      (uint64_t) (readp - offset_array_start));
9477 
9478 	      while (locp < locendp)
9479 		{
9480 		  uint64_t v1, v2;
9481 		  get_uleb128 (v1, locp, locendp);
9482 		  if (locp >= locendp)
9483 		    {
9484 		      printf (_("    <INVALID DATA>\n"));
9485 		      break;
9486 		    }
9487 		  get_uleb128 (v2, locp, locendp);
9488 		  printf ("    view pair %" PRId64 ", %" PRId64 "\n", v1, v2);
9489 		}
9490 
9491 	      printf ("\n");
9492 	      readp = (unsigned char *) locendp;
9493 	      continue;
9494 	    }
9495 
9496 	  uint8_t kind = *readp++;
9497 	  uint64_t op1, op2, len;
9498 
9499 	  /* Skip padding.  */
9500 	  if (start_of_list && kind == DW_LLE_end_of_list)
9501 	    continue;
9502 
9503 	  if (start_of_list)
9504 	    {
9505 	      base = cu_base;
9506 	      printf ("  Offset: %" PRIx64 ", Index: %" PRIx64 "\n",
9507 		      (uint64_t) (readp - (unsigned char *) data->d_buf - 1),
9508 		      (uint64_t) (readp - offset_array_start - 1));
9509 	      start_of_list = false;
9510 	    }
9511 
9512 	  printf ("    %s", dwarf_loc_list_encoding_name (kind));
9513 	  switch (kind)
9514 	    {
9515 	    case DW_LLE_end_of_list:
9516 	      start_of_list = true;
9517 	      printf ("\n\n");
9518 	      break;
9519 
9520 	    case DW_LLE_base_addressx:
9521 	      if ((uint64_t) (nexthdr - readp) < 1)
9522 		{
9523 		invalid_entry:
9524 		  error (0, 0, _("invalid loclists data"));
9525 		  goto next_table;
9526 		}
9527 	      get_uleb128 (op1, readp, nexthdr);
9528 	      printf (" %" PRIx64 "\n", op1);
9529 	      if (! print_unresolved_addresses)
9530 		{
9531 		  Dwarf_Addr addr;
9532 		  if (get_indexed_addr (cu, op1, &addr) != 0)
9533 		    printf ("      ???\n");
9534 		  else
9535 		    {
9536 		      printf ("      ");
9537 		      print_dwarf_addr (dwflmod, address_size, addr, addr);
9538 		      printf ("\n");
9539 		    }
9540 		}
9541 	      break;
9542 
9543 	    case DW_LLE_startx_endx:
9544 	      if ((uint64_t) (nexthdr - readp) < 1)
9545 		goto invalid_entry;
9546 	      get_uleb128 (op1, readp, nexthdr);
9547 	      if ((uint64_t) (nexthdr - readp) < 1)
9548 		goto invalid_entry;
9549 	      get_uleb128 (op2, readp, nexthdr);
9550 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
9551 	      if (! print_unresolved_addresses)
9552 		{
9553 		  Dwarf_Addr addr1;
9554 		  Dwarf_Addr addr2;
9555 		  if (get_indexed_addr (cu, op1, &addr1) != 0
9556 		      || get_indexed_addr (cu, op2, &addr2) != 0)
9557 		    {
9558 		      printf ("      ???..\n");
9559 		      printf ("      ???\n");
9560 		    }
9561 		  else
9562 		    {
9563 		      printf ("      ");
9564 		      print_dwarf_addr (dwflmod, address_size, addr1, addr1);
9565 		      printf ("..\n      ");
9566 		      print_dwarf_addr (dwflmod, address_size,
9567 					addr2 - 1, addr2);
9568 		      printf ("\n");
9569 		    }
9570 		}
9571 	      if ((uint64_t) (nexthdr - readp) < 1)
9572 		goto invalid_entry;
9573 	      get_uleb128 (len, readp, nexthdr);
9574 	      if ((uint64_t) (nexthdr - readp) < len)
9575 		goto invalid_entry;
9576 	      print_ops (dwflmod, dbg, 8, 8, version,
9577 			 address_size, offset_size, cu, len, readp);
9578 	      readp += len;
9579 	      break;
9580 
9581 	    case DW_LLE_startx_length:
9582 	      if ((uint64_t) (nexthdr - readp) < 1)
9583 		goto invalid_entry;
9584 	      get_uleb128 (op1, readp, nexthdr);
9585 	      if ((uint64_t) (nexthdr - readp) < 1)
9586 		goto invalid_entry;
9587 	      get_uleb128 (op2, readp, nexthdr);
9588 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
9589 	      if (! print_unresolved_addresses)
9590 		{
9591 		  Dwarf_Addr addr1;
9592 		  Dwarf_Addr addr2;
9593 		  if (get_indexed_addr (cu, op1, &addr1) != 0)
9594 		    {
9595 		      printf ("      ???..\n");
9596 		      printf ("      ???\n");
9597 		    }
9598 		  else
9599 		    {
9600 		      addr2 = addr1 + op2;
9601 		      printf ("      ");
9602 		      print_dwarf_addr (dwflmod, address_size, addr1, addr1);
9603 		      printf ("..\n      ");
9604 		      print_dwarf_addr (dwflmod, address_size,
9605 					addr2 - 1, addr2);
9606 		      printf ("\n");
9607 		    }
9608 		}
9609 	      if ((uint64_t) (nexthdr - readp) < 1)
9610 		goto invalid_entry;
9611 	      get_uleb128 (len, readp, nexthdr);
9612 	      if ((uint64_t) (nexthdr - readp) < len)
9613 		goto invalid_entry;
9614 	      print_ops (dwflmod, dbg, 8, 8, version,
9615 			 address_size, offset_size, cu, len, readp);
9616 	      readp += len;
9617 	      break;
9618 
9619 	    case DW_LLE_offset_pair:
9620 	      if ((uint64_t) (nexthdr - readp) < 1)
9621 		goto invalid_entry;
9622 	      get_uleb128 (op1, readp, nexthdr);
9623 	      if ((uint64_t) (nexthdr - readp) < 1)
9624 		goto invalid_entry;
9625 	      get_uleb128 (op2, readp, nexthdr);
9626 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
9627 	      if (! print_unresolved_addresses)
9628 		{
9629 		  op1 += base;
9630 		  op2 += base;
9631 		  printf ("      ");
9632 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
9633 		  printf ("..\n      ");
9634 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
9635 		  printf ("\n");
9636 		}
9637 	      if ((uint64_t) (nexthdr - readp) < 1)
9638 		goto invalid_entry;
9639 	      get_uleb128 (len, readp, nexthdr);
9640 	      if ((uint64_t) (nexthdr - readp) < len)
9641 		goto invalid_entry;
9642 	      print_ops (dwflmod, dbg, 8, 8, version,
9643 			 address_size, offset_size, cu, len, readp);
9644 	      readp += len;
9645 	      break;
9646 
9647 	    case DW_LLE_default_location:
9648 	      if ((uint64_t) (nexthdr - readp) < 1)
9649 		goto invalid_entry;
9650 	      get_uleb128 (len, readp, nexthdr);
9651 	      if ((uint64_t) (nexthdr - readp) < len)
9652 		goto invalid_entry;
9653 	      print_ops (dwflmod, dbg, 8, 8, version,
9654 			 address_size, offset_size, cu, len, readp);
9655 	      readp += len;
9656 	      break;
9657 
9658 	    case DW_LLE_base_address:
9659 	      if (address_size == 4)
9660 		{
9661 		  if ((uint64_t) (nexthdr - readp) < 4)
9662 		    goto invalid_entry;
9663 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
9664 		}
9665 	      else
9666 		{
9667 		  if ((uint64_t) (nexthdr - readp) < 8)
9668 		    goto invalid_entry;
9669 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
9670 		}
9671 	      base = op1;
9672 	      printf (" 0x%" PRIx64 "\n", base);
9673 	      if (! print_unresolved_addresses)
9674 		{
9675 		  printf ("      ");
9676 		  print_dwarf_addr (dwflmod, address_size, base, base);
9677 		  printf ("\n");
9678 		}
9679 	      break;
9680 
9681 	    case DW_LLE_start_end:
9682 	      if (address_size == 4)
9683 		{
9684 		  if ((uint64_t) (nexthdr - readp) < 8)
9685 		    goto invalid_entry;
9686 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
9687 		  op2 = read_4ubyte_unaligned_inc (dbg, readp);
9688 		}
9689 	      else
9690 		{
9691 		  if ((uint64_t) (nexthdr - readp) < 16)
9692 		    goto invalid_entry;
9693 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
9694 		  op2 = read_8ubyte_unaligned_inc (dbg, readp);
9695 		}
9696 	      printf (" 0x%" PRIx64 "..0x%" PRIx64 "\n", op1, op2);
9697 	      if (! print_unresolved_addresses)
9698 		{
9699 		  printf ("      ");
9700 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
9701 		  printf ("..\n      ");
9702 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
9703 		  printf ("\n");
9704 		}
9705 	      if ((uint64_t) (nexthdr - readp) < 1)
9706 		goto invalid_entry;
9707 	      get_uleb128 (len, readp, nexthdr);
9708 	      if ((uint64_t) (nexthdr - readp) < len)
9709 		goto invalid_entry;
9710 	      print_ops (dwflmod, dbg, 8, 8, version,
9711 			 address_size, offset_size, cu, len, readp);
9712 	      readp += len;
9713 	      break;
9714 
9715 	    case DW_LLE_start_length:
9716 	      if (address_size == 4)
9717 		{
9718 		  if ((uint64_t) (nexthdr - readp) < 4)
9719 		    goto invalid_entry;
9720 		  op1 = read_4ubyte_unaligned_inc (dbg, readp);
9721 		}
9722 	      else
9723 		{
9724 		  if ((uint64_t) (nexthdr - readp) < 8)
9725 		    goto invalid_entry;
9726 		  op1 = read_8ubyte_unaligned_inc (dbg, readp);
9727 		}
9728 	      if ((uint64_t) (nexthdr - readp) < 1)
9729 		goto invalid_entry;
9730 	      get_uleb128 (op2, readp, nexthdr);
9731 	      printf (" 0x%" PRIx64 ", %" PRIx64 "\n", op1, op2);
9732 	      if (! print_unresolved_addresses)
9733 		{
9734 		  op2 = op1 + op2;
9735 		  printf ("      ");
9736 		  print_dwarf_addr (dwflmod, address_size, op1, op1);
9737 		  printf ("..\n      ");
9738 		  print_dwarf_addr (dwflmod, address_size, op2 - 1, op2);
9739 		  printf ("\n");
9740 		}
9741 	      if ((uint64_t) (nexthdr - readp) < 1)
9742 		goto invalid_entry;
9743 	      get_uleb128 (len, readp, nexthdr);
9744 	      if ((uint64_t) (nexthdr - readp) < len)
9745 		goto invalid_entry;
9746 	      print_ops (dwflmod, dbg, 8, 8, version,
9747 			 address_size, offset_size, cu, len, readp);
9748 	      readp += len;
9749 	      break;
9750 
9751 	    case DW_LLE_GNU_view_pair:
9752 	      if ((uint64_t) (nexthdr - readp) < 1)
9753 		goto invalid_entry;
9754 	      get_uleb128 (op1, readp, nexthdr);
9755 	      if ((uint64_t) (nexthdr - readp) < 1)
9756 		goto invalid_entry;
9757 	      get_uleb128 (op2, readp, nexthdr);
9758 	      printf (" %" PRIx64 ", %" PRIx64 "\n", op1, op2);
9759 	      break;
9760 
9761 	    default:
9762 	      goto invalid_entry;
9763 	    }
9764 	}
9765 
9766     next_table:
9767       if (readp != nexthdr)
9768 	{
9769           size_t padding = nexthdr - readp;
9770           printf (_("   %zu padding bytes\n\n"), padding);
9771 	  readp = nexthdr;
9772 	}
9773     }
9774 }
9775 
9776 
9777 static void
print_debug_loc_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)9778 print_debug_loc_section (Dwfl_Module *dwflmod,
9779 			 Ebl *ebl, GElf_Ehdr *ehdr,
9780 			 Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
9781 {
9782   Elf_Data *data = (dbg->sectiondata[IDX_debug_loc]
9783 		    ?: elf_rawdata (scn, NULL));
9784 
9785   if (unlikely (data == NULL))
9786     {
9787       error (0, 0, _("cannot get .debug_loc content: %s"),
9788 	     elf_errmsg (-1));
9789       return;
9790     }
9791 
9792   printf (_("\
9793 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
9794 	  elf_ndxscn (scn), section_name (ebl, shdr),
9795 	  (uint64_t) shdr->sh_offset);
9796 
9797   sort_listptr (&known_locsptr, "loclistptr");
9798   size_t listptr_idx = 0;
9799 
9800   uint_fast8_t address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
9801   uint_fast8_t offset_size = 4;
9802 
9803   bool first = true;
9804   Dwarf_Addr base = 0;
9805   unsigned char *readp = data->d_buf;
9806   unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size;
9807   Dwarf_CU *last_cu = NULL;
9808   while (readp < endp)
9809     {
9810       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
9811       Dwarf_CU *cu = last_cu;
9812       unsigned int attr = 0;
9813 
9814       if (first && skip_listptr_hole (&known_locsptr, &listptr_idx,
9815 				      &address_size, &offset_size, &base,
9816 				      &cu, offset, &readp, endp, &attr))
9817 	continue;
9818 
9819       if (last_cu != cu)
9820        {
9821 	Dwarf_Die cudie;
9822 	if (dwarf_cu_die (cu, &cudie,
9823 			  NULL, NULL, NULL, NULL,
9824 			  NULL, NULL) == NULL)
9825 	  printf (_("\n Unknown CU base: "));
9826 	else
9827 	  printf (_("\n CU [%6" PRIx64 "] base: "),
9828 		  dwarf_dieoffset (&cudie));
9829 	print_dwarf_addr (dwflmod, address_size, base, base);
9830 	printf ("\n");
9831        }
9832       last_cu = cu;
9833 
9834       if (attr == DW_AT_GNU_locviews)
9835 	{
9836 	  Dwarf_Off next_off = next_listptr_offset (&known_locsptr,
9837 						    &listptr_idx, offset);
9838 	  const unsigned char *locp = readp;
9839 	  const unsigned char *locendp;
9840 	  if (next_off == 0
9841 	      || next_off > (size_t) (endp
9842 				      - (const unsigned char *) data->d_buf))
9843 	    locendp = endp;
9844 	  else
9845 	    locendp = (const unsigned char *) data->d_buf + next_off;
9846 
9847 	  while (locp < locendp)
9848 	    {
9849 	      uint64_t v1, v2;
9850 	      get_uleb128 (v1, locp, locendp);
9851 	      if (locp >= locendp)
9852 		{
9853 		  printf (_(" [%6tx]  <INVALID DATA>\n"), offset);
9854 		  break;
9855 		}
9856 	      get_uleb128 (v2, locp, locendp);
9857 	      if (first)		/* First view pair in a list.  */
9858 		printf (" [%6tx] ", offset);
9859 	      else
9860 		printf ("          ");
9861 	      printf ("view pair %" PRId64 ", %" PRId64 "\n", v1, v2);
9862 	      first = false;
9863 	    }
9864 
9865 	  first = true;
9866 	  readp = (unsigned char *) locendp;
9867 	  continue;
9868 	}
9869 
9870       /* GNU DebugFission encoded addresses as addrx.  */
9871       bool is_debugfission = ((cu != NULL
9872 			       || split_dwarf_cu_base (dbg, &cu, &base))
9873 			      && (cu->version < 5
9874 				  && cu->unit_type == DW_UT_split_compile));
9875       if (!is_debugfission
9876 	  && unlikely (data->d_size - offset < (size_t) address_size * 2))
9877         {
9878 	invalid_data:
9879 	  printf (_(" [%6tx]  <INVALID DATA>\n"), offset);
9880 	  break;
9881 	}
9882 
9883       Dwarf_Addr begin;
9884       Dwarf_Addr end;
9885       bool use_base = true;
9886       if (is_debugfission)
9887 	{
9888 	  const unsigned char *locp = readp;
9889 	  const unsigned char *locendp = readp + data->d_size;
9890 	  if (locp >= locendp)
9891 	    goto invalid_data;
9892 
9893 	  Dwarf_Word idx;
9894 	  unsigned char code = *locp++;
9895 	  switch (code)
9896 	    {
9897 	    case DW_LLE_GNU_end_of_list_entry:
9898 	      begin = 0;
9899 	      end = 0;
9900 	      break;
9901 
9902 	    case DW_LLE_GNU_base_address_selection_entry:
9903 	      if (locp >= locendp)
9904 		goto invalid_data;
9905 	      begin = (Dwarf_Addr) -1;
9906 	      get_uleb128 (idx, locp, locendp);
9907 	      if (get_indexed_addr (cu, idx, &end) != 0)
9908 		end = idx; /* ... */
9909 	      break;
9910 
9911 	    case DW_LLE_GNU_start_end_entry:
9912 	      if (locp >= locendp)
9913 		goto invalid_data;
9914 	      get_uleb128 (idx, locp, locendp);
9915 	      if (get_indexed_addr (cu, idx, &begin) != 0)
9916 		begin = idx; /* ... */
9917 	      if (locp >= locendp)
9918 		goto invalid_data;
9919 	      get_uleb128 (idx, locp, locendp);
9920 	      if (get_indexed_addr (cu, idx, &end) != 0)
9921 		end = idx; /* ... */
9922 	      use_base = false;
9923 	      break;
9924 
9925 	    case DW_LLE_GNU_start_length_entry:
9926 	      if (locp >= locendp)
9927 		goto invalid_data;
9928 	      get_uleb128 (idx, locp, locendp);
9929 	      if (get_indexed_addr (cu, idx, &begin) != 0)
9930 		begin = idx; /* ... */
9931 	      if (locendp - locp < 4)
9932 		goto invalid_data;
9933 	      end = read_4ubyte_unaligned_inc (dbg, locp);
9934 	      end += begin;
9935 	      use_base = false;
9936 	      break;
9937 
9938 	    default:
9939 		goto invalid_data;
9940 	    }
9941 
9942 	  readp = (unsigned char *) locp;
9943 	}
9944       else if (address_size == 8)
9945 	{
9946 	  begin = read_8ubyte_unaligned_inc (dbg, readp);
9947 	  end = read_8ubyte_unaligned_inc (dbg, readp);
9948 	}
9949       else
9950 	{
9951 	  begin = read_4ubyte_unaligned_inc (dbg, readp);
9952 	  end = read_4ubyte_unaligned_inc (dbg, readp);
9953 	  if (begin == (Dwarf_Addr) (uint32_t) -1)
9954 	    begin = (Dwarf_Addr) -1l;
9955 	}
9956 
9957       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
9958 	{
9959 	  if (first)
9960 	    printf (" [%6tx] ", offset);
9961 	  else
9962 	    printf ("          ");
9963 	  puts (_("base address"));
9964 	  printf ("          ");
9965 	  print_dwarf_addr (dwflmod, address_size, end, end);
9966 	  printf ("\n");
9967 	  base = end;
9968 	  first = false;
9969 	}
9970       else if (begin == 0 && end == 0) /* End of list entry.  */
9971 	{
9972 	  if (first)
9973 	    printf (_(" [%6tx] empty list\n"), offset);
9974 	  first = true;
9975 	}
9976       else
9977 	{
9978 	  /* We have a location expression entry.  */
9979 	  uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp);
9980 
9981 	  if (first)		/* First entry in a list.  */
9982 	    printf (" [%6tx] ", offset);
9983 	  else
9984 	    printf ("          ");
9985 
9986 	  printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end);
9987 	  if (! print_unresolved_addresses)
9988 	    {
9989 	      Dwarf_Addr dab = use_base ? base + begin : begin;
9990 	      Dwarf_Addr dae = use_base ? base + end : end;
9991 	      printf ("          ");
9992 	      print_dwarf_addr (dwflmod, address_size, dab, dab);
9993 	      printf ("..\n          ");
9994 	      print_dwarf_addr (dwflmod, address_size, dae - 1, dae);
9995 	      printf ("\n");
9996 	    }
9997 
9998 	  if (endp - readp <= (ptrdiff_t) len)
9999 	    {
10000 	      fputs (_("   <INVALID DATA>\n"), stdout);
10001 	      break;
10002 	    }
10003 
10004 	  print_ops (dwflmod, dbg, 11, 11,
10005 		     cu != NULL ? cu->version : 3,
10006 		     address_size, offset_size, cu, len, readp);
10007 
10008 	  first = false;
10009 	  readp += len;
10010 	}
10011     }
10012 }
10013 
10014 struct mac_culist
10015 {
10016   Dwarf_Die die;
10017   Dwarf_Off offset;
10018   Dwarf_Files *files;
10019   struct mac_culist *next;
10020 };
10021 
10022 
10023 static int
mac_compare(const void * p1,const void * p2)10024 mac_compare (const void *p1, const void *p2)
10025 {
10026   struct mac_culist *m1 = (struct mac_culist *) p1;
10027   struct mac_culist *m2 = (struct mac_culist *) p2;
10028 
10029   if (m1->offset < m2->offset)
10030     return -1;
10031   if (m1->offset > m2->offset)
10032     return 1;
10033   return 0;
10034 }
10035 
10036 
10037 static void
print_debug_macinfo_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10038 print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10039 			     Ebl *ebl,
10040 			     GElf_Ehdr *ehdr __attribute__ ((unused)),
10041 			     Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
10042 {
10043   printf (_("\
10044 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
10045 	  elf_ndxscn (scn), section_name (ebl, shdr),
10046 	  (uint64_t) shdr->sh_offset);
10047   putc_unlocked ('\n', stdout);
10048 
10049   /* There is no function in libdw to iterate over the raw content of
10050      the section but it is easy enough to do.  */
10051   Elf_Data *data = (dbg->sectiondata[IDX_debug_macinfo]
10052 		    ?: elf_rawdata (scn, NULL));
10053   if (unlikely (data == NULL))
10054     {
10055       error (0, 0, _("cannot get macro information section data: %s"),
10056 	     elf_errmsg (-1));
10057       return;
10058     }
10059 
10060   /* Get the source file information for all CUs.  */
10061   Dwarf_Off offset;
10062   Dwarf_Off ncu = 0;
10063   size_t hsize;
10064   struct mac_culist *culist = NULL;
10065   size_t nculist = 0;
10066   while (dwarf_nextcu (dbg, offset = ncu, &ncu, &hsize, NULL, NULL, NULL) == 0)
10067     {
10068       Dwarf_Die cudie;
10069       if (dwarf_offdie (dbg, offset + hsize, &cudie) == NULL)
10070 	continue;
10071 
10072       Dwarf_Attribute attr;
10073       if (dwarf_attr (&cudie, DW_AT_macro_info, &attr) == NULL)
10074 	continue;
10075 
10076       Dwarf_Word macoff;
10077       if (dwarf_formudata (&attr, &macoff) != 0)
10078 	continue;
10079 
10080       struct mac_culist *newp = (struct mac_culist *) alloca (sizeof (*newp));
10081       newp->die = cudie;
10082       newp->offset = macoff;
10083       newp->files = NULL;
10084       newp->next = culist;
10085       culist = newp;
10086       ++nculist;
10087     }
10088 
10089   /* Convert the list into an array for easier consumption.  */
10090   struct mac_culist *cus = (struct mac_culist *) alloca ((nculist + 1)
10091 							 * sizeof (*cus));
10092   /* Add sentinel.  */
10093   cus[nculist].offset = data->d_size;
10094   cus[nculist].files = (Dwarf_Files *) -1l;
10095   if (nculist > 0)
10096     {
10097       for (size_t cnt = nculist - 1; culist != NULL; --cnt)
10098 	{
10099 	  assert (cnt < nculist);
10100 	  cus[cnt] = *culist;
10101 	  culist = culist->next;
10102 	}
10103 
10104       /* Sort the array according to the offset in the .debug_macinfo
10105 	 section.  Note we keep the sentinel at the end.  */
10106       qsort (cus, nculist, sizeof (*cus), mac_compare);
10107     }
10108 
10109   const unsigned char *readp = (const unsigned char *) data->d_buf;
10110   const unsigned char *readendp = readp + data->d_size;
10111   int level = 1;
10112 
10113   while (readp < readendp)
10114     {
10115       unsigned int opcode = *readp++;
10116       unsigned int u128;
10117       unsigned int u128_2;
10118       const unsigned char *endp;
10119 
10120       switch (opcode)
10121 	{
10122 	case DW_MACINFO_define:
10123 	case DW_MACINFO_undef:
10124 	case DW_MACINFO_vendor_ext:
10125 	  /*  For the first two opcodes the parameters are
10126 		line, string
10127 	      For the latter
10128 		number, string.
10129 	      We can treat these cases together.  */
10130 	  get_uleb128 (u128, readp, readendp);
10131 
10132 	  endp = memchr (readp, '\0', readendp - readp);
10133 	  if (unlikely (endp == NULL))
10134 	    {
10135 	      printf (_("\
10136 %*s*** non-terminated string at end of section"),
10137 		      level, "");
10138 	      return;
10139 	    }
10140 
10141 	  if (opcode == DW_MACINFO_define)
10142 	    printf ("%*s#define %s, line %u\n",
10143 		    level, "", (char *) readp, u128);
10144 	  else if (opcode == DW_MACINFO_undef)
10145 	    printf ("%*s#undef %s, line %u\n",
10146 		    level, "", (char *) readp, u128);
10147 	  else
10148 	    printf (" #vendor-ext %s, number %u\n", (char *) readp, u128);
10149 
10150 	  readp = endp + 1;
10151 	  break;
10152 
10153 	case DW_MACINFO_start_file:
10154 	  /* The two parameters are line and file index, in this order.  */
10155 	  get_uleb128 (u128, readp, readendp);
10156 	  if (readendp - readp < 1)
10157 	    {
10158 	      printf (_("\
10159 %*s*** missing DW_MACINFO_start_file argument at end of section"),
10160 		      level, "");
10161 	      return;
10162 	    }
10163 	  get_uleb128 (u128_2, readp, readendp);
10164 
10165 	  /* Find the CU DIE for this file.  */
10166 	  size_t macoff = readp - (const unsigned char *) data->d_buf;
10167 	  const char *fname = "???";
10168 	  if (macoff >= cus[0].offset && cus[0].offset != data->d_size)
10169 	    {
10170 	      while (macoff >= cus[1].offset && cus[1].offset != data->d_size)
10171 		++cus;
10172 
10173 	      if (cus[0].files == NULL
10174 		  && dwarf_getsrcfiles (&cus[0].die, &cus[0].files, NULL) != 0)
10175 		cus[0].files = (Dwarf_Files *) -1l;
10176 
10177 	      if (cus[0].files != (Dwarf_Files *) -1l)
10178 		fname = (dwarf_filesrc (cus[0].files, u128_2, NULL, NULL)
10179 			 ?: "???");
10180 	    }
10181 
10182 	  printf ("%*sstart_file %u, [%u] %s\n",
10183 		  level, "", u128, u128_2, fname);
10184 	  ++level;
10185 	  break;
10186 
10187 	case DW_MACINFO_end_file:
10188 	  --level;
10189 	  printf ("%*send_file\n", level, "");
10190 	  /* Nothing more to do.  */
10191 	  break;
10192 
10193 	default:
10194 	  // XXX gcc seems to generate files with a trailing zero.
10195 	  if (unlikely (opcode != 0 || readp != readendp))
10196 	    printf ("%*s*** invalid opcode %u\n", level, "", opcode);
10197 	  break;
10198 	}
10199     }
10200 }
10201 
10202 
10203 static void
print_debug_macro_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10204 print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10205 			   Ebl *ebl,
10206 			   GElf_Ehdr *ehdr __attribute__ ((unused)),
10207 			   Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
10208 {
10209   printf (_("\
10210 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
10211 	  elf_ndxscn (scn), section_name (ebl, shdr),
10212 	  (uint64_t) shdr->sh_offset);
10213   putc_unlocked ('\n', stdout);
10214 
10215   Elf_Data *data =  elf_getdata (scn, NULL);
10216   if (unlikely (data == NULL))
10217     {
10218       error (0, 0, _("cannot get macro information section data: %s"),
10219 	     elf_errmsg (-1));
10220       return;
10221     }
10222 
10223   /* Get the source file information for all CUs.  Uses same
10224      datastructure as macinfo.  But uses offset field to directly
10225      match .debug_line offset.  And just stored in a list.  */
10226   Dwarf_Off offset;
10227   Dwarf_Off ncu = 0;
10228   size_t hsize;
10229   struct mac_culist *culist = NULL;
10230   size_t nculist = 0;
10231   while (dwarf_nextcu (dbg, offset = ncu, &ncu, &hsize, NULL, NULL, NULL) == 0)
10232     {
10233       Dwarf_Die cudie;
10234       if (dwarf_offdie (dbg, offset + hsize, &cudie) == NULL)
10235 	continue;
10236 
10237       Dwarf_Attribute attr;
10238       if (dwarf_attr (&cudie, DW_AT_stmt_list, &attr) == NULL)
10239 	continue;
10240 
10241       Dwarf_Word lineoff;
10242       if (dwarf_formudata (&attr, &lineoff) != 0)
10243 	continue;
10244 
10245       struct mac_culist *newp = (struct mac_culist *) alloca (sizeof (*newp));
10246       newp->die = cudie;
10247       newp->offset = lineoff;
10248       newp->files = NULL;
10249       newp->next = culist;
10250       culist = newp;
10251       ++nculist;
10252     }
10253 
10254   const unsigned char *readp = (const unsigned char *) data->d_buf;
10255   const unsigned char *readendp = readp + data->d_size;
10256 
10257   while (readp < readendp)
10258     {
10259       printf (_(" Offset:             0x%" PRIx64 "\n"),
10260 	      (uint64_t) (readp - (const unsigned char *) data->d_buf));
10261 
10262       // Header, 2 byte version, 1 byte flag, optional .debug_line offset,
10263       // optional vendor extension macro entry table.
10264       if (readp + 2 > readendp)
10265 	{
10266 	invalid_data:
10267 	  error (0, 0, _("invalid data"));
10268 	  return;
10269 	}
10270       const uint16_t vers = read_2ubyte_unaligned_inc (dbg, readp);
10271       printf (_(" Version:            %" PRIu16 "\n"), vers);
10272 
10273       // Version 4 is the GNU extension for DWARF4.  DWARF5 will use version
10274       // 5 when it gets standardized.
10275       if (vers != 4 && vers != 5)
10276 	{
10277 	  printf (_("  unknown version, cannot parse section\n"));
10278 	  return;
10279 	}
10280 
10281       if (readp + 1 > readendp)
10282 	goto invalid_data;
10283       const unsigned char flag = *readp++;
10284       printf (_(" Flag:               0x%" PRIx8), flag);
10285       if (flag != 0)
10286 	{
10287 	  printf (" (");
10288 	  if ((flag & 0x01) != 0)
10289 	    {
10290 	      printf ("offset_size");
10291 	      if ((flag & 0xFE) !=  0)
10292 		printf (", ");
10293 	    }
10294 	  if ((flag & 0x02) != 0)
10295 	    {
10296 	      printf ("debug_line_offset");
10297 	      if ((flag & 0xFC) !=  0)
10298 		printf (", ");
10299 	    }
10300 	  if ((flag & 0x04) != 0)
10301 	    {
10302 	      printf ("operands_table");
10303 	      if ((flag & 0xF8) !=  0)
10304 		printf (", ");
10305 	    }
10306 	  if ((flag & 0xF8) != 0)
10307 	    printf ("unknown");
10308 	  printf (")");
10309 	}
10310       printf ("\n");
10311 
10312       unsigned int offset_len = (flag & 0x01) ? 8 : 4;
10313       printf (_(" Offset length:      %" PRIu8 "\n"), offset_len);
10314       Dwarf_Off line_offset = -1;
10315       if (flag & 0x02)
10316 	{
10317 	  if (offset_len == 8)
10318 	    line_offset = read_8ubyte_unaligned_inc (dbg, readp);
10319 	  else
10320 	    line_offset = read_4ubyte_unaligned_inc (dbg, readp);
10321 	  printf (_(" .debug_line offset: 0x%" PRIx64 "\n"),
10322 		  line_offset);
10323 	}
10324 
10325       struct mac_culist *cu = NULL;
10326       if (line_offset != (Dwarf_Off) -1)
10327 	{
10328 	  cu = culist;
10329 	  while (cu != NULL && line_offset != cu->offset)
10330 	    cu = cu->next;
10331 	}
10332 
10333       Dwarf_Off str_offsets_base = str_offsets_base_off (dbg, (cu != NULL
10334 							       ? cu->die.cu
10335 							       : NULL));
10336 
10337       const unsigned char *vendor[DW_MACRO_hi_user - DW_MACRO_lo_user + 1];
10338       memset (vendor, 0, sizeof vendor);
10339       if (flag & 0x04)
10340 	{
10341 	  // 1 byte length, for each item, 1 byte opcode, uleb128 number
10342 	  // of arguments, for each argument 1 byte form code.
10343 	  if (readp + 1 > readendp)
10344 	    goto invalid_data;
10345 	  unsigned int tlen = *readp++;
10346 	  printf (_("  extension opcode table, %" PRIu8 " items:\n"),
10347 		  tlen);
10348 	  for (unsigned int i = 0; i < tlen; i++)
10349 	    {
10350 	      if (readp + 1 > readendp)
10351 		goto invalid_data;
10352 	      unsigned int opcode = *readp++;
10353 	      printf (_("    [%" PRIx8 "]"), opcode);
10354 	      if (opcode < DW_MACRO_lo_user
10355 		  || opcode > DW_MACRO_hi_user)
10356 		goto invalid_data;
10357 	      // Record the start of description for this vendor opcode.
10358 	      // uleb128 nr args, 1 byte per arg form.
10359 	      vendor[opcode - DW_MACRO_lo_user] = readp;
10360 	      if (readp + 1 > readendp)
10361 		goto invalid_data;
10362 	      unsigned int args = *readp++;
10363 	      if (args > 0)
10364 		{
10365 		  printf (_(" %" PRIu8 " arguments:"), args);
10366 		  while (args > 0)
10367 		    {
10368 		      if (readp + 1 > readendp)
10369 			goto invalid_data;
10370 		      unsigned int form = *readp++;
10371 		      printf (" %s", dwarf_form_name (form));
10372 		      if (! libdw_valid_user_form (form))
10373 			goto invalid_data;
10374 		      args--;
10375 		      if (args > 0)
10376 			putchar_unlocked (',');
10377 		    }
10378 		}
10379 	      else
10380 		printf (_(" no arguments."));
10381 	      putchar_unlocked ('\n');
10382 	    }
10383 	}
10384       putchar_unlocked ('\n');
10385 
10386       int level = 1;
10387       if (readp + 1 > readendp)
10388 	goto invalid_data;
10389       unsigned int opcode = *readp++;
10390       while (opcode != 0)
10391 	{
10392 	  unsigned int u128;
10393 	  unsigned int u128_2;
10394 	  const unsigned char *endp;
10395 	  uint64_t off;
10396 
10397           switch (opcode)
10398             {
10399             case DW_MACRO_start_file:
10400 	      get_uleb128 (u128, readp, readendp);
10401 	      if (readp >= readendp)
10402 		goto invalid_data;
10403 	      get_uleb128 (u128_2, readp, readendp);
10404 
10405 	      /* Find the CU DIE that matches this line offset.  */
10406 	      const char *fname = "???";
10407 	      if (cu != NULL)
10408 		{
10409 		  if (cu->files == NULL
10410 		      && dwarf_getsrcfiles (&cu->die, &cu->files,
10411 					    NULL) != 0)
10412 		    cu->files = (Dwarf_Files *) -1l;
10413 
10414 		  if (cu->files != (Dwarf_Files *) -1l)
10415 		    fname = (dwarf_filesrc (cu->files, u128_2,
10416 					    NULL, NULL) ?: "???");
10417 		}
10418 	      printf ("%*sstart_file %u, [%u] %s\n",
10419 		      level, "", u128, u128_2, fname);
10420 	      ++level;
10421 	      break;
10422 
10423 	    case DW_MACRO_end_file:
10424 	      --level;
10425 	      printf ("%*send_file\n", level, "");
10426 	      break;
10427 
10428 	    case DW_MACRO_define:
10429 	      get_uleb128 (u128, readp, readendp);
10430 	      endp = memchr (readp, '\0', readendp - readp);
10431 	      if (endp == NULL)
10432 		goto invalid_data;
10433 	      printf ("%*s#define %s, line %u\n",
10434 		      level, "", readp, u128);
10435 	      readp = endp + 1;
10436 	      break;
10437 
10438 	    case DW_MACRO_undef:
10439 	      get_uleb128 (u128, readp, readendp);
10440 	      endp = memchr (readp, '\0', readendp - readp);
10441 	      if (endp == NULL)
10442 		goto invalid_data;
10443 	      printf ("%*s#undef %s, line %u\n",
10444 		      level, "", readp, u128);
10445 	      readp = endp + 1;
10446 	      break;
10447 
10448 	    case DW_MACRO_define_strp:
10449 	      get_uleb128 (u128, readp, readendp);
10450 	      if (readp + offset_len > readendp)
10451 		goto invalid_data;
10452 	      if (offset_len == 8)
10453 		off = read_8ubyte_unaligned_inc (dbg, readp);
10454 	      else
10455 		off = read_4ubyte_unaligned_inc (dbg, readp);
10456 	      printf ("%*s#define %s, line %u (indirect)\n",
10457 		      level, "", dwarf_getstring (dbg, off, NULL), u128);
10458 	      break;
10459 
10460 	    case DW_MACRO_undef_strp:
10461 	      get_uleb128 (u128, readp, readendp);
10462 	      if (readp + offset_len > readendp)
10463 		goto invalid_data;
10464 	      if (offset_len == 8)
10465 		off = read_8ubyte_unaligned_inc (dbg, readp);
10466 	      else
10467 		off = read_4ubyte_unaligned_inc (dbg, readp);
10468 	      printf ("%*s#undef %s, line %u (indirect)\n",
10469 		      level, "", dwarf_getstring (dbg, off, NULL), u128);
10470 	      break;
10471 
10472 	    case DW_MACRO_import:
10473 	      if (readp + offset_len > readendp)
10474 		goto invalid_data;
10475 	      if (offset_len == 8)
10476 		off = read_8ubyte_unaligned_inc (dbg, readp);
10477 	      else
10478 		off = read_4ubyte_unaligned_inc (dbg, readp);
10479 	      printf ("%*s#include offset 0x%" PRIx64 "\n",
10480 		      level, "", off);
10481 	      break;
10482 
10483 	    case DW_MACRO_define_sup:
10484 	      get_uleb128 (u128, readp, readendp);
10485 	      if (readp + offset_len > readendp)
10486 		goto invalid_data;
10487 	      printf ("%*s#define ", level, "");
10488 	      readp =  print_form_data (dbg, DW_FORM_strp_sup,
10489 					readp, readendp, offset_len,
10490 					str_offsets_base);
10491 	      printf (", line %u (sup)\n", u128);
10492 	      break;
10493 
10494 	    case DW_MACRO_undef_sup:
10495 	      get_uleb128 (u128, readp, readendp);
10496 	      if (readp + offset_len > readendp)
10497 		goto invalid_data;
10498 	      printf ("%*s#undef ", level, "");
10499 	      readp =  print_form_data (dbg, DW_FORM_strp_sup,
10500 					readp, readendp, offset_len,
10501 					str_offsets_base);
10502 	      printf (", line %u (sup)\n", u128);
10503 	      break;
10504 
10505 	    case DW_MACRO_import_sup:
10506 	      if (readp + offset_len > readendp)
10507 		goto invalid_data;
10508 	      if (offset_len == 8)
10509 		off = read_8ubyte_unaligned_inc (dbg, readp);
10510 	      else
10511 		off = read_4ubyte_unaligned_inc (dbg, readp);
10512 	      // XXX Needs support for reading from supplementary object file.
10513 	      printf ("%*s#include offset 0x%" PRIx64 " (sup)\n",
10514 		      level, "", off);
10515 	      break;
10516 
10517 	    case DW_MACRO_define_strx:
10518 	      get_uleb128 (u128, readp, readendp);
10519 	      if (readp + offset_len > readendp)
10520 		goto invalid_data;
10521 	      printf ("%*s#define ", level, "");
10522 	      readp =  print_form_data (dbg, DW_FORM_strx,
10523 					readp, readendp, offset_len,
10524 					str_offsets_base);
10525 	      printf (", line %u (strx)\n", u128);
10526 	      break;
10527 
10528 	    case DW_MACRO_undef_strx:
10529 	      get_uleb128 (u128, readp, readendp);
10530 	      if (readp + offset_len > readendp)
10531 		goto invalid_data;
10532 	      printf ("%*s#undef ", level, "");
10533 	      readp =  print_form_data (dbg, DW_FORM_strx,
10534 					readp, readendp, offset_len,
10535 					str_offsets_base);
10536 	      printf (", line %u (strx)\n", u128);
10537 	      break;
10538 
10539 	    default:
10540 	      printf ("%*svendor opcode 0x%" PRIx8, level, "", opcode);
10541 	      if (opcode < DW_MACRO_lo_user
10542 		  || opcode > DW_MACRO_lo_user
10543 		  || vendor[opcode - DW_MACRO_lo_user] == NULL)
10544 		goto invalid_data;
10545 
10546 	      const unsigned char *op_desc;
10547 	      op_desc = vendor[opcode - DW_MACRO_lo_user];
10548 
10549 	      // Just skip the arguments, we cannot really interpret them,
10550 	      // but print as much as we can.
10551 	      unsigned int args = *op_desc++;
10552 	      while (args > 0 && readp < readendp)
10553 		{
10554 		  unsigned int form = *op_desc++;
10555 		  readp = print_form_data (dbg, form, readp, readendp,
10556 					   offset_len, str_offsets_base);
10557 		  args--;
10558 		  if (args > 0)
10559 		    printf (", ");
10560 		}
10561 	      putchar_unlocked ('\n');
10562 	    }
10563 
10564 	  if (readp + 1 > readendp)
10565 	    goto invalid_data;
10566 	  opcode = *readp++;
10567 	  if (opcode == 0)
10568 	    putchar_unlocked ('\n');
10569 	}
10570     }
10571 }
10572 
10573 
10574 /* Callback for printing global names.  */
10575 static int
print_pubnames(Dwarf * dbg,Dwarf_Global * global,void * arg)10576 print_pubnames (Dwarf *dbg __attribute__ ((unused)), Dwarf_Global *global,
10577 		void *arg)
10578 {
10579   int *np = (int *) arg;
10580 
10581   printf (_(" [%5d] DIE offset: %6" PRId64
10582 		   ", CU DIE offset: %6" PRId64 ", name: %s\n"),
10583 	  (*np)++, global->die_offset, global->cu_offset, global->name);
10584 
10585   return 0;
10586 }
10587 
10588 
10589 /* Print the known exported symbols in the DWARF section '.debug_pubnames'.  */
10590 static void
print_debug_pubnames_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10591 print_debug_pubnames_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10592 			      Ebl *ebl,
10593 			      GElf_Ehdr *ehdr __attribute__ ((unused)),
10594 			      Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
10595 {
10596   printf (_("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
10597 	  elf_ndxscn (scn), section_name (ebl, shdr),
10598 	  (uint64_t) shdr->sh_offset);
10599 
10600   int n = 0;
10601   (void) dwarf_getpubnames (dbg, print_pubnames, &n, 0);
10602 }
10603 
10604 /* Print the content of the DWARF string section '.debug_str'.  */
10605 static void
print_debug_str_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10606 print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10607 			 Ebl *ebl,
10608 			 GElf_Ehdr *ehdr __attribute__ ((unused)),
10609 			 Elf_Scn *scn, GElf_Shdr *shdr,
10610 			 Dwarf *dbg __attribute__ ((unused)))
10611 {
10612   Elf_Data *data = elf_rawdata (scn, NULL);
10613   const size_t sh_size = data ? data->d_size : 0;
10614 
10615   /* Compute floor(log16(shdr->sh_size)).  */
10616   GElf_Addr tmp = sh_size;
10617   int digits = 1;
10618   while (tmp >= 16)
10619     {
10620       ++digits;
10621       tmp >>= 4;
10622     }
10623   digits = MAX (4, digits);
10624 
10625   printf (_("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"
10626 		   " %*s  String\n"),
10627 	  elf_ndxscn (scn),
10628 	  section_name (ebl, shdr), (uint64_t) shdr->sh_offset,
10629 	  /* TRANS: the debugstr| prefix makes the string unique.  */
10630 	  digits + 2, sgettext ("debugstr|Offset"));
10631 
10632   Dwarf_Off offset = 0;
10633   while (offset < sh_size)
10634     {
10635       size_t len;
10636       const char *str = (const char *) data->d_buf + offset;
10637       const char *endp = memchr (str, '\0', sh_size - offset);
10638       if (unlikely (endp == NULL))
10639 	{
10640 	  printf (_(" *** error, missing string terminator\n"));
10641 	  break;
10642 	}
10643 
10644       printf (" [%*" PRIx64 "]  \"%s\"\n", digits, (uint64_t) offset, str);
10645       len = endp - str;
10646       offset += len + 1;
10647     }
10648 }
10649 
10650 static void
print_debug_str_offsets_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10651 print_debug_str_offsets_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10652 				 Ebl *ebl,
10653 				 GElf_Ehdr *ehdr __attribute__ ((unused)),
10654 				 Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
10655 {
10656   printf (_("\
10657 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
10658 	  elf_ndxscn (scn), section_name (ebl, shdr),
10659 	  (uint64_t) shdr->sh_offset);
10660 
10661   if (shdr->sh_size == 0)
10662     return;
10663 
10664   /* We like to get the section from libdw to make sure they are relocated.  */
10665   Elf_Data *data = (dbg->sectiondata[IDX_debug_str_offsets]
10666 		    ?: elf_rawdata (scn, NULL));
10667   if (unlikely (data == NULL))
10668     {
10669       error (0, 0, _("cannot get .debug_str_offsets section data: %s"),
10670 	     elf_errmsg (-1));
10671       return;
10672     }
10673 
10674   size_t idx = 0;
10675   sort_listptr (&known_stroffbases, "str_offsets");
10676 
10677   const unsigned char *start = (const unsigned char *) data->d_buf;
10678   const unsigned char *readp = start;
10679   const unsigned char *readendp = ((const unsigned char *) data->d_buf
10680 				   + data->d_size);
10681 
10682   while (readp < readendp)
10683     {
10684       /* Most string offset tables will have a header.  For split
10685 	 dwarf unit GNU DebugFission didn't add one.  But they were
10686 	 also only defined for split units (main or skeleton units
10687 	 didn't have indirect strings).  So if we don't have a
10688 	 DW_AT_str_offsets_base at all and this is offset zero, then
10689 	 just start printing offsets immediately, if this is a .dwo
10690 	 section.  */
10691       Dwarf_Off off = (Dwarf_Off) (readp
10692 				   - (const unsigned char *) data->d_buf);
10693 
10694       printf ("Table at offset %" PRIx64 " ", off);
10695 
10696       struct listptr *listptr = get_listptr (&known_stroffbases, idx++);
10697       const unsigned char *next_unitp = readendp;
10698       uint8_t offset_size;
10699       bool has_header;
10700       if (listptr == NULL)
10701 	{
10702 	  /* This can happen for .dwo files.  There is only an header
10703 	     in the case this is a version 5 split DWARF file.  */
10704 	  Dwarf_CU *cu;
10705 	  uint8_t unit_type;
10706 	  if (dwarf_get_units (dbg, NULL, &cu, NULL, &unit_type,
10707 			       NULL, NULL) != 0)
10708 	    {
10709 	      error (0, 0, "Warning: Cannot find any DWARF unit.");
10710 	      /* Just guess some values.  */
10711 	      has_header = false;
10712 	      offset_size = 4;
10713 	    }
10714 	  else if (off == 0
10715 		   && (unit_type == DW_UT_split_type
10716 		       || unit_type == DW_UT_split_compile))
10717 	    {
10718 	      has_header = cu->version > 4;
10719 	      offset_size = cu->offset_size;
10720 	    }
10721 	  else
10722 	    {
10723 	      error (0, 0,
10724 		     "Warning: No CU references .debug_str_offsets after %"
10725 		     PRIx64, off);
10726 	      has_header = cu->version > 4;
10727 	      offset_size = cu->offset_size;
10728 	    }
10729 	  printf ("\n");
10730 	}
10731       else
10732 	{
10733 	  /* This must be DWARF5, since GNU DebugFission didn't define
10734 	     DW_AT_str_offsets_base.  */
10735 	  has_header = true;
10736 
10737 	  Dwarf_Die cudie;
10738 	  if (dwarf_cu_die (listptr->cu, &cudie,
10739 			    NULL, NULL, NULL, NULL,
10740 			    NULL, NULL) == NULL)
10741 	    printf ("Unknown CU (%s):\n", dwarf_errmsg (-1));
10742 	  else
10743 	    printf ("for CU [%6" PRIx64 "]:\n", dwarf_dieoffset (&cudie));
10744 	}
10745 
10746       if (has_header)
10747 	{
10748 	  uint64_t unit_length;
10749 	  uint16_t version;
10750 	  uint16_t padding;
10751 
10752 	  unit_length = read_4ubyte_unaligned_inc (dbg, readp);
10753 	  if (unlikely (unit_length == 0xffffffff))
10754 	    {
10755 	      if (unlikely (readp > readendp - 8))
10756 		{
10757 		invalid_data:
10758 		  error (0, 0, "Invalid data");
10759 		  return;
10760 		}
10761 	      unit_length = read_8ubyte_unaligned_inc (dbg, readp);
10762 	      offset_size = 8;
10763 	    }
10764 	  else
10765 	    offset_size = 4;
10766 
10767 	  printf ("\n");
10768 	  printf (_(" Length:        %8" PRIu64 "\n"),
10769 		  unit_length);
10770 	  printf (_(" Offset size:   %8" PRIu8 "\n"),
10771 		  offset_size);
10772 
10773 	  /* We need at least 2-bytes (version) + 2-bytes (padding) =
10774 	     4 bytes to complete the header.  And this unit cannot go
10775 	     beyond the section data.  */
10776 	  if (readp > readendp - 4
10777 	      || unit_length < 4
10778 	      || unit_length > (uint64_t) (readendp - readp))
10779 	    goto invalid_data;
10780 
10781 	  next_unitp = readp + unit_length;
10782 
10783 	  version = read_2ubyte_unaligned_inc (dbg, readp);
10784 	  printf (_(" DWARF version: %8" PRIu16 "\n"), version);
10785 
10786 	  if (version != 5)
10787 	    {
10788 	      error (0, 0, _("Unknown version"));
10789 	      goto next_unit;
10790 	    }
10791 
10792 	  padding = read_2ubyte_unaligned_inc (dbg, readp);
10793 	  printf (_(" Padding:       %8" PRIx16 "\n"), padding);
10794 
10795 	  if (listptr != NULL
10796 	      && listptr->offset != (Dwarf_Off) (readp - start))
10797 	    {
10798 	      error (0, 0, "String offsets index doesn't start after header");
10799 	      goto next_unit;
10800 	    }
10801 
10802 	  printf ("\n");
10803 	}
10804 
10805       int digits = 1;
10806       size_t offsets = (next_unitp - readp) / offset_size;
10807       while (offsets >= 10)
10808 	{
10809 	  ++digits;
10810 	  offsets /= 10;
10811 	}
10812 
10813       unsigned int uidx = 0;
10814       size_t index_offset =  readp - (const unsigned char *) data->d_buf;
10815       printf (" Offsets start at 0x%zx:\n", index_offset);
10816       while (readp <= next_unitp - offset_size)
10817 	{
10818 	  Dwarf_Word offset;
10819 	  if (offset_size == 4)
10820 	    offset = read_4ubyte_unaligned_inc (dbg, readp);
10821 	  else
10822 	    offset = read_8ubyte_unaligned_inc (dbg, readp);
10823 	  const char *str = dwarf_getstring (dbg, offset, NULL);
10824 	  printf (" [%*u] [%*" PRIx64 "]  \"%s\"\n",
10825 		  digits, uidx++, (int) offset_size * 2, offset, str ?: "???");
10826 	}
10827       printf ("\n");
10828 
10829       if (readp != next_unitp)
10830 	error (0, 0, "extra %zd bytes at end of unit",
10831 	       (size_t) (next_unitp - readp));
10832 
10833     next_unit:
10834       readp = next_unitp;
10835     }
10836 }
10837 
10838 
10839 /* Print the content of the call frame search table section
10840    '.eh_frame_hdr'.  */
10841 static void
print_debug_frame_hdr_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10842 print_debug_frame_hdr_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
10843 			       Ebl *ebl __attribute__ ((unused)),
10844 			       GElf_Ehdr *ehdr __attribute__ ((unused)),
10845 			       Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
10846 {
10847   printf (_("\
10848 \nCall frame search table section [%2zu] '.eh_frame_hdr':\n"),
10849 	  elf_ndxscn (scn));
10850 
10851   Elf_Data *data = elf_rawdata (scn, NULL);
10852 
10853   if (unlikely (data == NULL))
10854     {
10855       error (0, 0, _("cannot get %s content: %s"),
10856 	     ".eh_frame_hdr", elf_errmsg (-1));
10857       return;
10858     }
10859 
10860   const unsigned char *readp = data->d_buf;
10861   const unsigned char *const dataend = ((unsigned char *) data->d_buf
10862 					+ data->d_size);
10863 
10864   if (unlikely (readp + 4 > dataend))
10865     {
10866     invalid_data:
10867       error (0, 0, _("invalid data"));
10868       return;
10869     }
10870 
10871   unsigned int version = *readp++;
10872   unsigned int eh_frame_ptr_enc = *readp++;
10873   unsigned int fde_count_enc = *readp++;
10874   unsigned int table_enc = *readp++;
10875 
10876   printf (" version:          %u\n"
10877 	  " eh_frame_ptr_enc: %#x ",
10878 	  version, eh_frame_ptr_enc);
10879   print_encoding_base ("", eh_frame_ptr_enc);
10880   printf (" fde_count_enc:    %#x ", fde_count_enc);
10881   print_encoding_base ("", fde_count_enc);
10882   printf (" table_enc:        %#x ", table_enc);
10883   print_encoding_base ("", table_enc);
10884 
10885   uint64_t eh_frame_ptr = 0;
10886   if (eh_frame_ptr_enc != DW_EH_PE_omit)
10887     {
10888       readp = read_encoded (eh_frame_ptr_enc, readp, dataend, &eh_frame_ptr,
10889 			    dbg);
10890       if (unlikely (readp == NULL))
10891 	goto invalid_data;
10892 
10893       printf (" eh_frame_ptr:     %#" PRIx64, eh_frame_ptr);
10894       if ((eh_frame_ptr_enc & 0x70) == DW_EH_PE_pcrel)
10895 	printf (" (offset: %#" PRIx64 ")",
10896 		/* +4 because of the 4 byte header of the section.  */
10897 		(uint64_t) shdr->sh_offset + 4 + eh_frame_ptr);
10898 
10899       putchar_unlocked ('\n');
10900     }
10901 
10902   uint64_t fde_count = 0;
10903   if (fde_count_enc != DW_EH_PE_omit)
10904     {
10905       readp = read_encoded (fde_count_enc, readp, dataend, &fde_count, dbg);
10906       if (unlikely (readp == NULL))
10907 	goto invalid_data;
10908 
10909       printf (" fde_count:        %" PRIu64 "\n", fde_count);
10910     }
10911 
10912   if (fde_count == 0 || table_enc == DW_EH_PE_omit)
10913     return;
10914 
10915   puts (" Table:");
10916 
10917   /* Optimize for the most common case.  */
10918   if (table_enc == (DW_EH_PE_datarel | DW_EH_PE_sdata4))
10919     while (fde_count > 0 && readp + 8 <= dataend)
10920       {
10921 	int32_t initial_location = read_4sbyte_unaligned_inc (dbg, readp);
10922 	uint64_t initial_offset = ((uint64_t) shdr->sh_offset
10923 				   + (int64_t) initial_location);
10924 	int32_t address = read_4sbyte_unaligned_inc (dbg, readp);
10925 	// XXX Possibly print symbol name or section offset for initial_offset
10926 	printf ("  %#" PRIx32 " (offset: %#6" PRIx64 ") -> %#" PRIx32
10927 		" fde=[%6" PRIx64 "]\n",
10928 		initial_location, initial_offset,
10929 		address, address - (eh_frame_ptr + 4));
10930       }
10931   else
10932     while (0 && readp < dataend)
10933       {
10934 
10935       }
10936 }
10937 
10938 
10939 /* Print the content of the exception handling table section
10940    '.eh_frame_hdr'.  */
10941 static void
print_debug_exception_table(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)10942 print_debug_exception_table (Dwfl_Module *dwflmod __attribute__ ((unused)),
10943 			     Ebl *ebl __attribute__ ((unused)),
10944 			     GElf_Ehdr *ehdr __attribute__ ((unused)),
10945 			     Elf_Scn *scn,
10946 			     GElf_Shdr *shdr __attribute__ ((unused)),
10947 			     Dwarf *dbg __attribute__ ((unused)))
10948 {
10949   printf (_("\
10950 \nException handling table section [%2zu] '.gcc_except_table':\n"),
10951 	  elf_ndxscn (scn));
10952 
10953   Elf_Data *data = elf_rawdata (scn, NULL);
10954 
10955   if (unlikely (data == NULL))
10956     {
10957       error (0, 0, _("cannot get %s content: %s"),
10958 	     ".gcc_except_table", elf_errmsg (-1));
10959       return;
10960     }
10961 
10962   const unsigned char *readp = data->d_buf;
10963   const unsigned char *const dataend = readp + data->d_size;
10964 
10965   if (unlikely (readp + 1 > dataend))
10966     {
10967     invalid_data:
10968       error (0, 0, _("invalid data"));
10969       return;
10970     }
10971   unsigned int lpstart_encoding = *readp++;
10972   printf (_(" LPStart encoding:    %#x "), lpstart_encoding);
10973   print_encoding_base ("", lpstart_encoding);
10974   if (lpstart_encoding != DW_EH_PE_omit)
10975     {
10976       uint64_t lpstart;
10977       readp = read_encoded (lpstart_encoding, readp, dataend, &lpstart, dbg);
10978       printf (" LPStart:             %#" PRIx64 "\n", lpstart);
10979     }
10980 
10981   if (unlikely (readp + 1 > dataend))
10982     goto invalid_data;
10983   unsigned int ttype_encoding = *readp++;
10984   printf (_(" TType encoding:      %#x "), ttype_encoding);
10985   print_encoding_base ("", ttype_encoding);
10986   const unsigned char *ttype_base = NULL;
10987   if (ttype_encoding != DW_EH_PE_omit)
10988     {
10989       unsigned int ttype_base_offset;
10990       get_uleb128 (ttype_base_offset, readp, dataend);
10991       printf (" TType base offset:   %#x\n", ttype_base_offset);
10992       if ((size_t) (dataend - readp) > ttype_base_offset)
10993         ttype_base = readp + ttype_base_offset;
10994     }
10995 
10996   if (unlikely (readp + 1 > dataend))
10997     goto invalid_data;
10998   unsigned int call_site_encoding = *readp++;
10999   printf (_(" Call site encoding:  %#x "), call_site_encoding);
11000   print_encoding_base ("", call_site_encoding);
11001   unsigned int call_site_table_len;
11002   get_uleb128 (call_site_table_len, readp, dataend);
11003 
11004   const unsigned char *const action_table = readp + call_site_table_len;
11005   if (unlikely (action_table > dataend))
11006     goto invalid_data;
11007   unsigned int u = 0;
11008   unsigned int max_action = 0;
11009   while (readp < action_table)
11010     {
11011       if (u == 0)
11012 	puts (_("\n Call site table:"));
11013 
11014       uint64_t call_site_start;
11015       readp = read_encoded (call_site_encoding, readp, dataend,
11016 			    &call_site_start, dbg);
11017       uint64_t call_site_length;
11018       readp = read_encoded (call_site_encoding, readp, dataend,
11019 			    &call_site_length, dbg);
11020       uint64_t landing_pad;
11021       readp = read_encoded (call_site_encoding, readp, dataend,
11022 			    &landing_pad, dbg);
11023       unsigned int action;
11024       get_uleb128 (action, readp, dataend);
11025       max_action = MAX (action, max_action);
11026       printf (_(" [%4u] Call site start:   %#" PRIx64 "\n"
11027 		       "        Call site length:  %" PRIu64 "\n"
11028 		       "        Landing pad:       %#" PRIx64 "\n"
11029 		       "        Action:            %u\n"),
11030 	      u++, call_site_start, call_site_length, landing_pad, action);
11031     }
11032   if (readp != action_table)
11033     goto invalid_data;
11034 
11035   unsigned int max_ar_filter = 0;
11036   if (max_action > 0)
11037     {
11038       puts ("\n Action table:");
11039 
11040       size_t maxdata = (size_t) (dataend - action_table);
11041       if (max_action > maxdata || maxdata - max_action < 1)
11042 	{
11043 	invalid_action_table:
11044 	  fputs (_("   <INVALID DATA>\n"), stdout);
11045 	  return;
11046 	}
11047 
11048       const unsigned char *const action_table_end
11049 	= action_table + max_action + 1;
11050 
11051       u = 0;
11052       do
11053 	{
11054 	  int ar_filter;
11055 	  get_sleb128 (ar_filter, readp, action_table_end);
11056 	  if (ar_filter > 0 && (unsigned int) ar_filter > max_ar_filter)
11057 	    max_ar_filter = ar_filter;
11058 	  int ar_disp;
11059 	  if (readp >= action_table_end)
11060 	    goto invalid_action_table;
11061 	  get_sleb128 (ar_disp, readp, action_table_end);
11062 
11063 	  printf (" [%4u] ar_filter:  % d\n"
11064 		  "        ar_disp:    % -5d",
11065 		  u, ar_filter, ar_disp);
11066 	  if (abs (ar_disp) & 1)
11067 	    printf (" -> [%4u]\n", u + (ar_disp + 1) / 2);
11068 	  else if (ar_disp != 0)
11069 	    puts (" -> ???");
11070 	  else
11071 	    putchar_unlocked ('\n');
11072 	  ++u;
11073 	}
11074       while (readp < action_table_end);
11075     }
11076 
11077   if (max_ar_filter > 0 && ttype_base != NULL)
11078     {
11079       unsigned char dsize;
11080       puts ("\n TType table:");
11081 
11082       // XXX Not *4, size of encoding;
11083       switch (ttype_encoding & 7)
11084 	{
11085 	case DW_EH_PE_udata2:
11086 	case DW_EH_PE_sdata2:
11087 	  dsize = 2;
11088 	  break;
11089 	case DW_EH_PE_udata4:
11090 	case DW_EH_PE_sdata4:
11091 	  dsize = 4;
11092 	  break;
11093 	case DW_EH_PE_udata8:
11094 	case DW_EH_PE_sdata8:
11095 	  dsize = 8;
11096 	  break;
11097 	default:
11098 	  dsize = 0;
11099 	  error (1, 0, _("invalid TType encoding"));
11100 	}
11101 
11102       if (max_ar_filter
11103 	  > (size_t) (ttype_base - (const unsigned char *) data->d_buf) / dsize)
11104 	goto invalid_data;
11105 
11106       readp = ttype_base - max_ar_filter * dsize;
11107       do
11108 	{
11109 	  uint64_t ttype;
11110 	  readp = read_encoded (ttype_encoding, readp, ttype_base, &ttype,
11111 				dbg);
11112 	  printf (" [%4u] %#" PRIx64 "\n", max_ar_filter--, ttype);
11113 	}
11114       while (readp < ttype_base);
11115     }
11116 }
11117 
11118 /* Print the content of the '.gdb_index' section.
11119    http://sourceware.org/gdb/current/onlinedocs/gdb/Index-Section-Format.html
11120 */
11121 static void
print_gdb_index_section(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr,Elf_Scn * scn,GElf_Shdr * shdr,Dwarf * dbg)11122 print_gdb_index_section (Dwfl_Module *dwflmod, Ebl *ebl,
11123 			 GElf_Ehdr *ehdr __attribute__ ((unused)),
11124 			 Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
11125 {
11126   printf (_("\nGDB section [%2zu] '%s' at offset %#" PRIx64
11127 		   " contains %" PRId64 " bytes :\n"),
11128 	  elf_ndxscn (scn), section_name (ebl, shdr),
11129 	  (uint64_t) shdr->sh_offset, (uint64_t) shdr->sh_size);
11130 
11131   Elf_Data *data = elf_rawdata (scn, NULL);
11132 
11133   if (unlikely (data == NULL))
11134     {
11135       error (0, 0, _("cannot get %s content: %s"),
11136 	     ".gdb_index", elf_errmsg (-1));
11137       return;
11138     }
11139 
11140   // .gdb_index is always in little endian.
11141   Dwarf dummy_dbg = { .other_byte_order = MY_ELFDATA != ELFDATA2LSB };
11142   dbg = &dummy_dbg;
11143 
11144   const unsigned char *readp = data->d_buf;
11145   const unsigned char *const dataend = readp + data->d_size;
11146 
11147   if (unlikely (readp + 4 > dataend))
11148     {
11149     invalid_data:
11150       error (0, 0, _("invalid data"));
11151       return;
11152     }
11153 
11154   int32_t vers = read_4ubyte_unaligned (dbg, readp);
11155   printf (_(" Version:         %" PRId32 "\n"), vers);
11156 
11157   // The only difference between version 4 and version 5 is the
11158   // hash used for generating the table.  Version 6 contains symbols
11159   // for inlined functions, older versions didn't.  Version 7 adds
11160   // symbol kinds.  Version 8 just indicates that it correctly includes
11161   // TUs for symbols.
11162   if (vers < 4 || vers > 8)
11163     {
11164       printf (_("  unknown version, cannot parse section\n"));
11165       return;
11166     }
11167 
11168   readp += 4;
11169   if (unlikely (readp + 4 > dataend))
11170     goto invalid_data;
11171 
11172   uint32_t cu_off = read_4ubyte_unaligned (dbg, readp);
11173   printf (_(" CU offset:       %#" PRIx32 "\n"), cu_off);
11174 
11175   readp += 4;
11176   if (unlikely (readp + 4 > dataend))
11177     goto invalid_data;
11178 
11179   uint32_t tu_off = read_4ubyte_unaligned (dbg, readp);
11180   printf (_(" TU offset:       %#" PRIx32 "\n"), tu_off);
11181 
11182   readp += 4;
11183   if (unlikely (readp + 4 > dataend))
11184     goto invalid_data;
11185 
11186   uint32_t addr_off = read_4ubyte_unaligned (dbg, readp);
11187   printf (_(" address offset:  %#" PRIx32 "\n"), addr_off);
11188 
11189   readp += 4;
11190   if (unlikely (readp + 4 > dataend))
11191     goto invalid_data;
11192 
11193   uint32_t sym_off = read_4ubyte_unaligned (dbg, readp);
11194   printf (_(" symbol offset:   %#" PRIx32 "\n"), sym_off);
11195 
11196   readp += 4;
11197   if (unlikely (readp + 4 > dataend))
11198     goto invalid_data;
11199 
11200   uint32_t const_off = read_4ubyte_unaligned (dbg, readp);
11201   printf (_(" constant offset: %#" PRIx32 "\n"), const_off);
11202 
11203   if (unlikely ((size_t) (dataend - (const unsigned char *) data->d_buf)
11204 		< const_off))
11205     goto invalid_data;
11206 
11207   readp = data->d_buf + cu_off;
11208 
11209   const unsigned char *nextp = data->d_buf + tu_off;
11210   if (tu_off >= data->d_size)
11211     goto invalid_data;
11212 
11213   size_t cu_nr = (nextp - readp) / 16;
11214 
11215   printf (_("\n CU list at offset %#" PRIx32
11216 		   " contains %zu entries:\n"),
11217 	  cu_off, cu_nr);
11218 
11219   size_t n = 0;
11220   while (dataend - readp >= 16 && n < cu_nr)
11221     {
11222       uint64_t off = read_8ubyte_unaligned (dbg, readp);
11223       readp += 8;
11224 
11225       uint64_t len = read_8ubyte_unaligned (dbg, readp);
11226       readp += 8;
11227 
11228       printf (" [%4zu] start: %0#8" PRIx64
11229 	      ", length: %5" PRIu64 "\n", n, off, len);
11230       n++;
11231     }
11232 
11233   readp = data->d_buf + tu_off;
11234   nextp = data->d_buf + addr_off;
11235   if (addr_off >= data->d_size)
11236     goto invalid_data;
11237 
11238   size_t tu_nr = (nextp - readp) / 24;
11239 
11240   printf (_("\n TU list at offset %#" PRIx32
11241 		   " contains %zu entries:\n"),
11242 	  tu_off, tu_nr);
11243 
11244   n = 0;
11245   while (dataend - readp >= 24 && n < tu_nr)
11246     {
11247       uint64_t off = read_8ubyte_unaligned (dbg, readp);
11248       readp += 8;
11249 
11250       uint64_t type = read_8ubyte_unaligned (dbg, readp);
11251       readp += 8;
11252 
11253       uint64_t sig = read_8ubyte_unaligned (dbg, readp);
11254       readp += 8;
11255 
11256       printf (" [%4zu] CU offset: %5" PRId64
11257 	      ", type offset: %5" PRId64
11258 	      ", signature: %0#8" PRIx64 "\n", n, off, type, sig);
11259       n++;
11260     }
11261 
11262   readp = data->d_buf + addr_off;
11263   nextp = data->d_buf + sym_off;
11264   if (sym_off >= data->d_size)
11265     goto invalid_data;
11266 
11267   size_t addr_nr = (nextp - readp) / 20;
11268 
11269   printf (_("\n Address list at offset %#" PRIx32
11270 		   " contains %zu entries:\n"),
11271 	  addr_off, addr_nr);
11272 
11273   n = 0;
11274   while (dataend - readp >= 20 && n < addr_nr)
11275     {
11276       uint64_t low = read_8ubyte_unaligned (dbg, readp);
11277       readp += 8;
11278 
11279       uint64_t high = read_8ubyte_unaligned (dbg, readp);
11280       readp += 8;
11281 
11282       uint32_t idx = read_4ubyte_unaligned (dbg, readp);
11283       readp += 4;
11284 
11285       printf (" [%4zu] ", n);
11286       print_dwarf_addr (dwflmod, 8, low, low);
11287       printf ("..");
11288       print_dwarf_addr (dwflmod, 8, high - 1, high);
11289       printf (", CU index: %5" PRId32 "\n", idx);
11290       n++;
11291     }
11292 
11293   const unsigned char *const_start = data->d_buf + const_off;
11294   if (const_off >= data->d_size)
11295     goto invalid_data;
11296 
11297   readp = data->d_buf + sym_off;
11298   nextp = const_start;
11299   size_t sym_nr = (nextp - readp) / 8;
11300 
11301   printf (_("\n Symbol table at offset %#" PRIx32
11302 		   " contains %zu slots:\n"),
11303 	  addr_off, sym_nr);
11304 
11305   n = 0;
11306   while (dataend - readp >= 8 && n < sym_nr)
11307     {
11308       uint32_t name = read_4ubyte_unaligned (dbg, readp);
11309       readp += 4;
11310 
11311       uint32_t vector = read_4ubyte_unaligned (dbg, readp);
11312       readp += 4;
11313 
11314       if (name != 0 || vector != 0)
11315 	{
11316 	  const unsigned char *sym = const_start + name;
11317 	  if (unlikely ((size_t) (dataend - const_start) < name
11318 			|| memchr (sym, '\0', dataend - sym) == NULL))
11319 	    goto invalid_data;
11320 
11321 	  printf (" [%4zu] symbol: %s, CUs: ", n, sym);
11322 
11323 	  const unsigned char *readcus = const_start + vector;
11324 	  if (unlikely ((size_t) (dataend - const_start) < vector))
11325 	    goto invalid_data;
11326 	  uint32_t cus = read_4ubyte_unaligned (dbg, readcus);
11327 	  while (cus--)
11328 	    {
11329 	      uint32_t cu_kind, cu, kind;
11330 	      bool is_static;
11331 	      readcus += 4;
11332 	      if (unlikely (readcus + 4 > dataend))
11333 		goto invalid_data;
11334 	      cu_kind = read_4ubyte_unaligned (dbg, readcus);
11335 	      cu = cu_kind & ((1 << 24) - 1);
11336 	      kind = (cu_kind >> 28) & 7;
11337 	      is_static = cu_kind & (1U << 31);
11338 	      if (cu > cu_nr - 1)
11339 		printf ("%" PRId32 "T", cu - (uint32_t) cu_nr);
11340 	      else
11341 		printf ("%" PRId32, cu);
11342 	      if (kind != 0)
11343 		{
11344 		  printf (" (");
11345 		  switch (kind)
11346 		    {
11347 		    case 1:
11348 		      printf ("type");
11349 		      break;
11350 		    case 2:
11351 		      printf ("var");
11352 		      break;
11353 		    case 3:
11354 		      printf ("func");
11355 		      break;
11356 		    case 4:
11357 		      printf ("other");
11358 		      break;
11359 		    default:
11360 		      printf ("unknown-0x%" PRIx32, kind);
11361 		      break;
11362 		    }
11363 		  printf (":%c)", (is_static ? 'S' : 'G'));
11364 		}
11365 	      if (cus > 0)
11366 		printf (", ");
11367 	    }
11368 	  printf ("\n");
11369 	}
11370       n++;
11371     }
11372 }
11373 
11374 /* Returns true and sets split DWARF CU id if there is a split compile
11375    unit in the given Dwarf, and no non-split units are found (before it).  */
11376 static bool
is_split_dwarf(Dwarf * dbg,uint64_t * id,Dwarf_CU ** split_cu)11377 is_split_dwarf (Dwarf *dbg, uint64_t *id, Dwarf_CU **split_cu)
11378 {
11379   Dwarf_CU *cu = NULL;
11380   while (dwarf_get_units (dbg, cu, &cu, NULL, NULL, NULL, NULL) == 0)
11381     {
11382       uint8_t unit_type;
11383       if (dwarf_cu_info (cu, NULL, &unit_type, NULL, NULL,
11384 			 id, NULL, NULL) != 0)
11385 	return false;
11386 
11387       if (unit_type != DW_UT_split_compile && unit_type != DW_UT_split_type)
11388 	return false;
11389 
11390       /* We really only care about the split compile unit, the types
11391 	 should be fine and self sufficient.  Also they don't have an
11392 	 id that we can match with a skeleton unit.  */
11393       if (unit_type == DW_UT_split_compile)
11394 	{
11395 	  *split_cu = cu;
11396 	  return true;
11397 	}
11398     }
11399 
11400   return false;
11401 }
11402 
11403 /* Check that there is one and only one Dwfl_Module, return in arg.  */
11404 static int
getone_dwflmod(Dwfl_Module * dwflmod,void ** userdata,const char * name,Dwarf_Addr base,void * arg)11405 getone_dwflmod (Dwfl_Module *dwflmod,
11406 	       void **userdata __attribute__ ((unused)),
11407 	       const char *name __attribute__ ((unused)),
11408 	       Dwarf_Addr base __attribute__ ((unused)),
11409 	       void *arg)
11410 {
11411   Dwfl_Module **m = (Dwfl_Module **) arg;
11412   if (*m != NULL)
11413     return DWARF_CB_ABORT;
11414   *m = dwflmod;
11415   return DWARF_CB_OK;
11416 }
11417 
11418 static void
print_debug(Dwfl_Module * dwflmod,Ebl * ebl,GElf_Ehdr * ehdr)11419 print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
11420 {
11421   /* Used for skeleton file, if necessary for split DWARF.  */
11422   Dwfl *skel_dwfl = NULL;
11423   Dwfl_Module *skel_mod = NULL;
11424   char *skel_name = NULL;
11425   Dwarf *split_dbg = NULL;
11426   Dwarf_CU *split_cu = NULL;
11427 
11428   /* Before we start the real work get a debug context descriptor.  */
11429   Dwarf_Addr dwbias;
11430   Dwarf *dbg = dwfl_module_getdwarf (dwflmod, &dwbias);
11431   Dwarf dummy_dbg =
11432     {
11433       .elf = ebl->elf,
11434       .other_byte_order = MY_ELFDATA != ehdr->e_ident[EI_DATA]
11435     };
11436   if (dbg == NULL)
11437     {
11438       if ((print_debug_sections & ~(section_exception|section_frame)) != 0)
11439 	error (0, 0, _("cannot get debug context descriptor: %s"),
11440 	       dwfl_errmsg (-1));
11441       dbg = &dummy_dbg;
11442     }
11443   else
11444     {
11445       /* If we are asked about a split dwarf (.dwo) file, use the user
11446 	 provided, or find the corresponding skeleton file. If we got
11447 	 a skeleton file, replace the given dwflmod and dbg, with one
11448 	 derived from the skeleton file to provide enough context.  */
11449       uint64_t split_id;
11450       if (is_split_dwarf (dbg, &split_id, &split_cu))
11451 	{
11452 	  if (dwarf_skeleton != NULL)
11453 	    skel_name = strdup (dwarf_skeleton);
11454 	  else
11455 	    {
11456 	      /* Replace file.dwo with file.o and see if that matches. */
11457 	      const char *fname;
11458 	      dwfl_module_info (dwflmod, NULL, NULL, NULL, NULL, NULL,
11459 				&fname, NULL);
11460 	      if (fname != NULL)
11461 		{
11462 		  size_t flen = strlen (fname);
11463 		  if (flen > 4 && strcmp (".dwo", fname + flen - 4) == 0)
11464 		    {
11465 		      skel_name = strdup (fname);
11466 		      if (skel_name != NULL)
11467 			{
11468 			  skel_name[flen - 3] = 'o';
11469 			  skel_name[flen - 2] = '\0';
11470 			}
11471 		    }
11472 		}
11473 	    }
11474 
11475 	  if (skel_name != NULL)
11476 	    {
11477 	      int skel_fd = open (skel_name, O_RDONLY);
11478 	      if (skel_fd == -1)
11479 		fprintf (stderr, "Warning: Couldn't open DWARF skeleton file"
11480 			 " '%s'\n", skel_name);
11481 	      else
11482 		skel_dwfl = create_dwfl (skel_fd, skel_name);
11483 
11484 	      if (skel_dwfl != NULL)
11485 		{
11486 		  if (dwfl_getmodules (skel_dwfl, &getone_dwflmod,
11487 				       &skel_mod, 0) != 0)
11488 		    {
11489 		      fprintf (stderr, "Warning: Bad DWARF skeleton,"
11490 			       " multiple modules '%s'\n", skel_name);
11491 		      dwfl_end (skel_dwfl);
11492 		      skel_mod = NULL;
11493 		    }
11494 		}
11495 	      else if (skel_fd != -1)
11496 		fprintf (stderr, "Warning: Couldn't create skeleton dwfl for"
11497 			 " '%s': %s\n", skel_name, dwfl_errmsg (-1));
11498 
11499 	      if (skel_mod != NULL)
11500 		{
11501 		  Dwarf *skel_dbg = dwfl_module_getdwarf (skel_mod, &dwbias);
11502 		  if (skel_dbg != NULL)
11503 		    {
11504 		      /* First check the skeleton CU DIE, only fetch
11505 			 the split DIE if we know the id matches to
11506 			 not unnecessary search for any split DIEs we
11507 			 don't need. */
11508 		      Dwarf_CU *cu = NULL;
11509 		      while (dwarf_get_units (skel_dbg, cu, &cu,
11510 					      NULL, NULL, NULL, NULL) == 0)
11511 			{
11512 			  uint8_t unit_type;
11513 			  uint64_t skel_id;
11514 			  if (dwarf_cu_info (cu, NULL, &unit_type, NULL, NULL,
11515 					     &skel_id, NULL, NULL) == 0
11516 			      && unit_type == DW_UT_skeleton
11517 			      && split_id == skel_id)
11518 			    {
11519 			      Dwarf_Die subdie;
11520 			      if (dwarf_cu_info (cu, NULL, NULL, NULL,
11521 						 &subdie,
11522 						 NULL, NULL, NULL) == 0
11523 				  && dwarf_tag (&subdie) != DW_TAG_invalid)
11524 				{
11525 				  split_dbg = dwarf_cu_getdwarf (subdie.cu);
11526 				  if (split_dbg == NULL)
11527 				    fprintf (stderr,
11528 					     "Warning: Couldn't get split_dbg:"
11529 					     " %s\n", dwarf_errmsg (-1));
11530 				  break;
11531 				}
11532 			      else
11533 				{
11534 				  /* Everything matches up, but not
11535 				     according to libdw. Which means
11536 				     the user knew better.  So...
11537 				     Terrible hack... We can never
11538 				     destroy the underlying dwfl
11539 				     because it would free the wrong
11540 				     Dwarfs... So we leak memory...*/
11541 				  if (cu->split == NULL
11542 				      && dwarf_skeleton != NULL)
11543 				    {
11544 				      do_not_close_dwfl = true;
11545 				      __libdw_link_skel_split (cu, split_cu);
11546 				      split_dbg = dwarf_cu_getdwarf (split_cu);
11547 				      break;
11548 				    }
11549 				  else
11550 				    fprintf (stderr, "Warning: Couldn't get"
11551 					     " skeleton subdie: %s\n",
11552 					     dwarf_errmsg (-1));
11553 				}
11554 			    }
11555 			}
11556 		      if (split_dbg == NULL)
11557 			fprintf (stderr, "Warning: '%s' didn't contain a skeleton for split id %" PRIx64 "\n", skel_name, split_id);
11558 		    }
11559 		  else
11560 		    fprintf (stderr, "Warning: Couldn't get skeleton DWARF:"
11561 			     " %s\n", dwfl_errmsg (-1));
11562 		}
11563 	    }
11564 
11565 	  if (split_dbg != NULL)
11566 	    {
11567 	      dbg = split_dbg;
11568 	      dwflmod = skel_mod;
11569 	    }
11570 	  else if (skel_name == NULL)
11571 	    fprintf (stderr,
11572 		     "Warning: split DWARF file, but no skeleton found.\n");
11573 	}
11574       else if (dwarf_skeleton != NULL)
11575 	fprintf (stderr, "Warning: DWARF skeleton given,"
11576 		 " but not a split DWARF file\n");
11577     }
11578 
11579   /* Get the section header string table index.  */
11580   size_t shstrndx;
11581   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
11582     error_exit (0, _("cannot get section header string table index"));
11583 
11584   /* If the .debug_info section is listed as implicitly required then
11585      we must make sure to handle it before handling any other debug
11586      section.  Various other sections depend on the CU DIEs being
11587      scanned (silently) first.  */
11588   bool implicit_info = (implicit_debug_sections & section_info) != 0;
11589   bool explicit_info = (print_debug_sections & section_info) != 0;
11590   if (implicit_info)
11591     {
11592       Elf_Scn *scn = NULL;
11593       while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
11594 	{
11595 	  GElf_Shdr shdr_mem;
11596 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
11597 
11598 	  if (shdr != NULL && shdr->sh_type == SHT_PROGBITS)
11599 	    {
11600 	      const char *name = elf_strptr (ebl->elf, shstrndx,
11601 					     shdr->sh_name);
11602 	      if (name == NULL)
11603 		continue;
11604 
11605 	      if (strcmp (name, ".debug_info") == 0
11606 		  || strcmp (name, ".debug_info.dwo") == 0
11607 		  || strcmp (name, ".zdebug_info") == 0
11608 		  || strcmp (name, ".zdebug_info.dwo") == 0
11609 		  || strcmp (name, ".gnu.debuglto_.debug_info") == 0)
11610 		{
11611 		  print_debug_info_section (dwflmod, ebl, ehdr,
11612 					    scn, shdr, dbg);
11613 		  break;
11614 		}
11615 	    }
11616 	}
11617       print_debug_sections &= ~section_info;
11618       implicit_debug_sections &= ~section_info;
11619     }
11620 
11621   /* Look through all the sections for the debugging sections to print.  */
11622   Elf_Scn *scn = NULL;
11623   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
11624     {
11625       GElf_Shdr shdr_mem;
11626       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
11627 
11628       if (shdr != NULL && shdr->sh_type == SHT_PROGBITS)
11629 	{
11630 	  static const struct
11631 	  {
11632 	    const char *name;
11633 	    enum section_e bitmask;
11634 	    void (*fp) (Dwfl_Module *, Ebl *,
11635 			GElf_Ehdr *, Elf_Scn *, GElf_Shdr *, Dwarf *);
11636 	  } debug_sections[] =
11637 	    {
11638 #define NEW_SECTION(name) \
11639 	      { ".debug_" #name, section_##name, print_debug_##name##_section }
11640 	      NEW_SECTION (abbrev),
11641 	      NEW_SECTION (addr),
11642 	      NEW_SECTION (aranges),
11643 	      NEW_SECTION (frame),
11644 	      NEW_SECTION (info),
11645 	      NEW_SECTION (types),
11646 	      NEW_SECTION (line),
11647 	      NEW_SECTION (loc),
11648 	      /* loclists is loc for DWARF5.  */
11649 	      { ".debug_loclists", section_loc,
11650 		print_debug_loclists_section },
11651 	      NEW_SECTION (pubnames),
11652 	      NEW_SECTION (str),
11653 	      /* A DWARF5 specialised debug string section.  */
11654 	      { ".debug_line_str", section_str,
11655 		print_debug_str_section },
11656 	      /* DWARF5 string offsets table.  */
11657 	      { ".debug_str_offsets", section_str,
11658 		print_debug_str_offsets_section },
11659 	      NEW_SECTION (macinfo),
11660 	      NEW_SECTION (macro),
11661 	      NEW_SECTION (ranges),
11662 	      /* rnglists is ranges for DWARF5.  */
11663 	      { ".debug_rnglists", section_ranges,
11664 		print_debug_rnglists_section },
11665 	      { ".eh_frame", section_frame | section_exception,
11666 		print_debug_frame_section },
11667 	      { ".eh_frame_hdr", section_frame | section_exception,
11668 		print_debug_frame_hdr_section },
11669 	      { ".gcc_except_table", section_frame | section_exception,
11670 		print_debug_exception_table },
11671 	      { ".gdb_index", section_gdb_index, print_gdb_index_section }
11672 	    };
11673 	  const int ndebug_sections = (sizeof (debug_sections)
11674 				       / sizeof (debug_sections[0]));
11675 	  const char *name = elf_strptr (ebl->elf, shstrndx,
11676 					 shdr->sh_name);
11677 	  if (name == NULL)
11678 	    continue;
11679 
11680 	  int n;
11681 	  for (n = 0; n < ndebug_sections; ++n)
11682 	    {
11683 	      size_t dbglen = strlen (debug_sections[n].name);
11684 	      size_t scnlen = strlen (name);
11685 	      if ((strncmp (name, debug_sections[n].name, dbglen) == 0
11686 		   && (dbglen == scnlen
11687 		       || (scnlen == dbglen + 4
11688 			   && strstr (name, ".dwo") == name + dbglen)))
11689 		  || (name[0] == '.' && name[1] == 'z'
11690 		      && debug_sections[n].name[1] == 'd'
11691 		      && strncmp (&name[2], &debug_sections[n].name[1],
11692 				  dbglen - 1) == 0
11693 		      && (scnlen == dbglen + 1
11694 			  || (scnlen == dbglen + 5
11695 			      && strstr (name, ".dwo") == name + dbglen + 1)))
11696 		  || (scnlen > 14 /* .gnu.debuglto_ prefix. */
11697 		      && startswith (name, ".gnu.debuglto_")
11698 		      && strcmp (&name[14], debug_sections[n].name) == 0)
11699 )
11700 		{
11701 		  if ((print_debug_sections | implicit_debug_sections)
11702 		      & debug_sections[n].bitmask)
11703 		    debug_sections[n].fp (dwflmod, ebl, ehdr, scn, shdr, dbg);
11704 		  break;
11705 		}
11706 	    }
11707 	}
11708     }
11709 
11710   dwfl_end (skel_dwfl);
11711   free (skel_name);
11712 
11713   /* Turn implicit and/or explicit back on in case we go over another file.  */
11714   if (implicit_info)
11715     implicit_debug_sections |= section_info;
11716   if (explicit_info)
11717     print_debug_sections |= section_info;
11718 
11719   reset_listptr (&known_locsptr);
11720   reset_listptr (&known_loclistsptr);
11721   reset_listptr (&known_rangelistptr);
11722   reset_listptr (&known_rnglistptr);
11723   reset_listptr (&known_addrbases);
11724   reset_listptr (&known_stroffbases);
11725 }
11726 
11727 
11728 #define ITEM_INDENT		4
11729 #define WRAP_COLUMN		75
11730 
11731 /* Print "NAME: FORMAT", wrapping when output text would make the line
11732    exceed WRAP_COLUMN.  Unpadded numbers look better for the core items
11733    but this function is also used for registers which should be printed
11734    aligned.  Fortunately registers output uses fixed fields width (such
11735    as %11d) for the alignment.
11736 
11737    Line breaks should not depend on the particular values although that
11738    may happen in some cases of the core items.  */
11739 
11740 static unsigned int
11741 __attribute__ ((format (printf, 6, 7)))
print_core_item(unsigned int colno,char sep,unsigned int wrap,size_t name_width,const char * name,const char * format,...)11742 print_core_item (unsigned int colno, char sep, unsigned int wrap,
11743 		 size_t name_width, const char *name, const char *format, ...)
11744 {
11745   size_t len = strlen (name);
11746   if (name_width < len)
11747     name_width = len;
11748 
11749   char *out;
11750   va_list ap;
11751   va_start (ap, format);
11752   int out_len = vasprintf (&out, format, ap);
11753   va_end (ap);
11754   if (out_len == -1)
11755     error_exit (0, _("memory exhausted"));
11756 
11757   size_t n = name_width + sizeof ": " - 1 + out_len;
11758 
11759   if (colno == 0)
11760     {
11761       printf ("%*s", ITEM_INDENT, "");
11762       colno = ITEM_INDENT + n;
11763     }
11764   else if (colno + 2 + n < wrap)
11765     {
11766       printf ("%c ", sep);
11767       colno += 2 + n;
11768     }
11769   else
11770     {
11771       printf ("\n%*s", ITEM_INDENT, "");
11772       colno = ITEM_INDENT + n;
11773     }
11774 
11775   printf ("%s: %*s%s", name, (int) (name_width - len), "", out);
11776 
11777   free (out);
11778 
11779   return colno;
11780 }
11781 
11782 static const void *
convert(Elf * core,Elf_Type type,uint_fast16_t count,void * value,const void * data,size_t size)11783 convert (Elf *core, Elf_Type type, uint_fast16_t count,
11784 	 void *value, const void *data, size_t size)
11785 {
11786   Elf_Data valuedata =
11787     {
11788       .d_type = type,
11789       .d_buf = value,
11790       .d_size = size ?: gelf_fsize (core, type, count, EV_CURRENT),
11791       .d_version = EV_CURRENT,
11792     };
11793   Elf_Data indata =
11794     {
11795       .d_type = type,
11796       .d_buf = (void *) data,
11797       .d_size = valuedata.d_size,
11798       .d_version = EV_CURRENT,
11799     };
11800 
11801   Elf_Data *d = (gelf_getclass (core) == ELFCLASS32
11802 		 ? elf32_xlatetom : elf64_xlatetom)
11803     (&valuedata, &indata, elf_getident (core, NULL)[EI_DATA]);
11804   if (d == NULL)
11805     error_exit (0, _("cannot convert core note data: %s"),
11806 		elf_errmsg (-1));
11807 
11808   return data + indata.d_size;
11809 }
11810 
11811 typedef uint8_t GElf_Byte;
11812 
11813 static unsigned int
handle_core_item(Elf * core,const Ebl_Core_Item * item,const void * desc,unsigned int colno,size_t * repeated_size)11814 handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
11815 		  unsigned int colno, size_t *repeated_size)
11816 {
11817   uint_fast16_t count = item->count ?: 1;
11818   /* Ebl_Core_Item count is always a small number.
11819      Make sure the backend didn't put in some large bogus value.  */
11820   assert (count < 128);
11821 
11822 #define TYPES								      \
11823   DO_TYPE (BYTE, Byte, "0x%.2" PRIx8, "%" PRId8);			      \
11824   DO_TYPE (HALF, Half, "0x%.4" PRIx16, "%" PRId16);			      \
11825   DO_TYPE (WORD, Word, "0x%.8" PRIx32, "%" PRId32);			      \
11826   DO_TYPE (SWORD, Sword, "%" PRId32, "%" PRId32);			      \
11827   DO_TYPE (XWORD, Xword, "0x%.16" PRIx64, "%" PRId64);			      \
11828   DO_TYPE (SXWORD, Sxword, "%" PRId64, "%" PRId64)
11829 
11830 #define DO_TYPE(NAME, Name, hex, dec) GElf_##Name Name
11831   typedef union { TYPES; } value_t;
11832   void *data = alloca (count * sizeof (value_t));
11833 #undef DO_TYPE
11834 
11835 #define DO_TYPE(NAME, Name, hex, dec) \
11836     GElf_##Name *value_##Name __attribute__((unused)) = data
11837   TYPES;
11838 #undef DO_TYPE
11839 
11840   size_t size = gelf_fsize (core, item->type, count, EV_CURRENT);
11841   size_t convsize = size;
11842   if (repeated_size != NULL)
11843     {
11844       if (*repeated_size > size && (item->format == 'b' || item->format == 'B'))
11845 	{
11846 	  data = alloca (*repeated_size);
11847 	  count *= *repeated_size / size;
11848 	  convsize = count * size;
11849 	  *repeated_size -= convsize;
11850 	}
11851       else if (item->count != 0 || item->format != '\n')
11852 	*repeated_size -= size;
11853     }
11854 
11855   convert (core, item->type, count, data, desc + item->offset, convsize);
11856 
11857   Elf_Type type = item->type;
11858   if (type == ELF_T_ADDR)
11859     type = gelf_getclass (core) == ELFCLASS32 ? ELF_T_WORD : ELF_T_XWORD;
11860 
11861   switch (item->format)
11862     {
11863     case 'd':
11864       assert (count == 1);
11865       switch (type)
11866 	{
11867 #define DO_TYPE(NAME, Name, hex, dec)					      \
11868 	  case ELF_T_##NAME:						      \
11869 	    colno = print_core_item (colno, ',', WRAP_COLUMN,		      \
11870 				     0, item->name, dec, value_##Name[0]); \
11871 	    break
11872 	  TYPES;
11873 #undef DO_TYPE
11874 	default:
11875 	  abort ();
11876 	}
11877       break;
11878 
11879     case 'x':
11880       assert (count == 1);
11881       switch (type)
11882 	{
11883 #define DO_TYPE(NAME, Name, hex, dec)					      \
11884 	  case ELF_T_##NAME:						      \
11885 	    colno = print_core_item (colno, ',', WRAP_COLUMN,		      \
11886 				     0, item->name, hex, value_##Name[0]);      \
11887 	    break
11888 	  TYPES;
11889 #undef DO_TYPE
11890 	default:
11891 	  abort ();
11892 	}
11893       break;
11894 
11895     case 'b':
11896     case 'B':
11897       assert (size % sizeof (unsigned int) == 0);
11898       unsigned int nbits = count * size * 8;
11899       unsigned int pop = 0;
11900       for (const unsigned int *i = data; (void *) i < data + count * size; ++i)
11901 	pop += __builtin_popcount (*i);
11902       bool negate = pop > nbits / 2;
11903       const unsigned int bias = item->format == 'b';
11904 
11905       {
11906 	char printed[(negate ? nbits - pop : pop) * 16 + 1];
11907 	char *p = printed;
11908 	*p = '\0';
11909 
11910 	if (BYTE_ORDER != LITTLE_ENDIAN && size > sizeof (unsigned int))
11911 	  {
11912 	    assert (size == sizeof (unsigned int) * 2);
11913 	    for (unsigned int *i = data;
11914 		 (void *) i < data + count * size; i += 2)
11915 	      {
11916 		unsigned int w = i[1];
11917 		i[1] = i[0];
11918 		i[0] = w;
11919 	      }
11920 	  }
11921 
11922 	unsigned int lastbit = 0;
11923 	unsigned int run = 0;
11924 	for (const unsigned int *i = data;
11925 	     (void *) i < data + count * size; ++i)
11926 	  {
11927 	    unsigned int bit = ((void *) i - data) * 8;
11928 	    unsigned int w = negate ? ~*i : *i;
11929 	    while (w != 0)
11930 	      {
11931 		/* Note that a right shift equal to (or greater than)
11932 		   the number of bits of w is undefined behaviour.  In
11933 		   particular when the least significant bit is bit 32
11934 		   (w = 0x8000000) then w >>= n is undefined.  So
11935 		   explicitly handle that case separately.  */
11936 		unsigned int n = ffs (w);
11937 		if (n < sizeof (w) * 8)
11938 		  w >>= n;
11939 		else
11940 		  w = 0;
11941 		bit += n;
11942 
11943 		if (lastbit != 0 && lastbit + 1 == bit)
11944 		  ++run;
11945 		else
11946 		  {
11947 		    if (lastbit == 0)
11948 		      p += sprintf (p, "%u", bit - bias);
11949 		    else if (run == 0)
11950 		      p += sprintf (p, ",%u", bit - bias);
11951 		    else
11952 		      p += sprintf (p, "-%u,%u", lastbit - bias, bit - bias);
11953 		    run = 0;
11954 		  }
11955 
11956 		lastbit = bit;
11957 	      }
11958 	  }
11959 	if (lastbit > 0 && run > 0 && lastbit + 1 != nbits)
11960 	  p += sprintf (p, "-%u", lastbit - bias);
11961 
11962 	colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
11963 				 negate ? "~<%s>" : "<%s>", printed);
11964       }
11965       break;
11966 
11967     case 'T':
11968     case (char) ('T'|0x80):
11969       assert (count == 2);
11970       Dwarf_Word sec;
11971       Dwarf_Word usec;
11972       switch (type)
11973 	{
11974 #define DO_TYPE(NAME, Name, hex, dec)					      \
11975 	  case ELF_T_##NAME:						      \
11976 	    sec = value_##Name[0];					      \
11977 	    usec = value_##Name[1];					      \
11978 	    break
11979 	  TYPES;
11980 #undef DO_TYPE
11981 	default:
11982 	  abort ();
11983 	}
11984       if (unlikely (item->format == (char) ('T'|0x80)))
11985 	{
11986 	  /* This is a hack for an ill-considered 64-bit ABI where
11987 	     tv_usec is actually a 32-bit field with 32 bits of padding
11988 	     rounding out struct timeval.  We've already converted it as
11989 	     a 64-bit field.  For little-endian, this just means the
11990 	     high half is the padding; it's presumably zero, but should
11991 	     be ignored anyway.  For big-endian, it means the 32-bit
11992 	     field went into the high half of USEC.  */
11993 	  GElf_Ehdr ehdr_mem;
11994 	  GElf_Ehdr *ehdr = gelf_getehdr (core, &ehdr_mem);
11995 	  if (likely (ehdr->e_ident[EI_DATA] == ELFDATA2MSB))
11996 	    usec >>= 32;
11997 	  else
11998 	    usec &= UINT32_MAX;
11999 	}
12000       colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
12001 			       "%" PRIu64 ".%.6" PRIu64, sec, usec);
12002       break;
12003 
12004     case 'c':
12005       assert (count == 1);
12006       colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
12007 			       "%c", value_Byte[0]);
12008       break;
12009 
12010     case 's':
12011       colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
12012 			       "%.*s", (int) count, value_Byte);
12013       break;
12014 
12015     case '\n':
12016       /* This is a list of strings separated by '\n'.  */
12017       assert (item->count == 0);
12018       assert (repeated_size != NULL);
12019       assert (item->name == NULL);
12020       if (unlikely (item->offset >= *repeated_size))
12021 	break;
12022 
12023       const char *s = desc + item->offset;
12024       size = *repeated_size - item->offset;
12025       *repeated_size = 0;
12026       while (size > 0)
12027 	{
12028 	  const char *eol = memchr (s, '\n', size);
12029 	  int len = size;
12030 	  if (eol != NULL)
12031 	    len = eol - s;
12032 	  printf ("%*s%.*s\n", ITEM_INDENT, "", len, s);
12033 	  if (eol == NULL)
12034 	    break;
12035 	  size -= eol + 1 - s;
12036 	  s = eol + 1;
12037 	}
12038 
12039       colno = WRAP_COLUMN;
12040       break;
12041 
12042     case 'h':
12043       break;
12044 
12045     default:
12046       error (0, 0, "XXX not handling format '%c' for %s",
12047 	     item->format, item->name);
12048       break;
12049     }
12050 
12051 #undef TYPES
12052 
12053   return colno;
12054 }
12055 
12056 
12057 /* Sort items by group, and by layout offset within each group.  */
12058 static int
compare_core_items(const void * a,const void * b)12059 compare_core_items (const void *a, const void *b)
12060 {
12061   const Ebl_Core_Item *const *p1 = a;
12062   const Ebl_Core_Item *const *p2 = b;
12063   const Ebl_Core_Item *item1 = *p1;
12064   const Ebl_Core_Item *item2 = *p2;
12065 
12066   return ((item1->group == item2->group ? 0
12067 	   : strcmp (item1->group, item2->group))
12068 	  ?: (int) item1->offset - (int) item2->offset);
12069 }
12070 
12071 /* Sort item groups by layout offset of the first item in the group.  */
12072 static int
compare_core_item_groups(const void * a,const void * b)12073 compare_core_item_groups (const void *a, const void *b)
12074 {
12075   const Ebl_Core_Item *const *const *p1 = a;
12076   const Ebl_Core_Item *const *const *p2 = b;
12077   const Ebl_Core_Item *const *group1 = *p1;
12078   const Ebl_Core_Item *const *group2 = *p2;
12079   const Ebl_Core_Item *item1 = *group1;
12080   const Ebl_Core_Item *item2 = *group2;
12081 
12082   return (int) item1->offset - (int) item2->offset;
12083 }
12084 
12085 static unsigned int
handle_core_items(Elf * core,const void * desc,size_t descsz,const Ebl_Core_Item * items,size_t nitems)12086 handle_core_items (Elf *core, const void *desc, size_t descsz,
12087 		   const Ebl_Core_Item *items, size_t nitems)
12088 {
12089   if (nitems == 0)
12090     return 0;
12091   unsigned int colno = 0;
12092 
12093   /* FORMAT '\n' makes sense to be present only as a single item as it
12094      processes all the data of a note.  FORMATs 'b' and 'B' have a special case
12095      if present as a single item but they can be also processed with other
12096      items below.  */
12097   if (nitems == 1 && (items[0].format == '\n' || items[0].format == 'b'
12098 		      || items[0].format == 'B'))
12099     {
12100       assert (items[0].offset == 0);
12101       size_t size = descsz;
12102       colno = handle_core_item (core, items, desc, colno, &size);
12103       /* If SIZE is not zero here there is some remaining data.  But we do not
12104 	 know how to process it anyway.  */
12105       return colno;
12106     }
12107   for (size_t i = 0; i < nitems; ++i)
12108     assert (items[i].format != '\n');
12109 
12110   /* Sort to collect the groups together.  */
12111   const Ebl_Core_Item *sorted_items[nitems];
12112   for (size_t i = 0; i < nitems; ++i)
12113     sorted_items[i] = &items[i];
12114   qsort (sorted_items, nitems, sizeof sorted_items[0], &compare_core_items);
12115 
12116   /* Collect the unique groups and sort them.  */
12117   const Ebl_Core_Item **groups[nitems];
12118   groups[0] = &sorted_items[0];
12119   size_t ngroups = 1;
12120   for (size_t i = 1; i < nitems; ++i)
12121     if (sorted_items[i]->group != sorted_items[i - 1]->group
12122 	&& strcmp (sorted_items[i]->group, sorted_items[i - 1]->group))
12123       groups[ngroups++] = &sorted_items[i];
12124   qsort (groups, ngroups, sizeof groups[0], &compare_core_item_groups);
12125 
12126   /* Write out all the groups.  */
12127   const void *last = desc;
12128   do
12129     {
12130       for (size_t i = 0; i < ngroups; ++i)
12131 	{
12132 	  for (const Ebl_Core_Item **item = groups[i];
12133 	       (item < &sorted_items[nitems]
12134 		&& ((*item)->group == groups[i][0]->group
12135 		    || !strcmp ((*item)->group, groups[i][0]->group)));
12136 	       ++item)
12137 	    colno = handle_core_item (core, *item, desc, colno, NULL);
12138 
12139 	  /* Force a line break at the end of the group.  */
12140 	  colno = WRAP_COLUMN;
12141 	}
12142 
12143       if (descsz == 0)
12144 	break;
12145 
12146       /* This set of items consumed a certain amount of the note's data.
12147 	 If there is more data there, we have another unit of the same size.
12148 	 Loop to print that out too.  */
12149       const Ebl_Core_Item *item = &items[nitems - 1];
12150       size_t eltsz = item->offset + gelf_fsize (core, item->type,
12151 						item->count ?: 1, EV_CURRENT);
12152 
12153       int reps = -1;
12154       do
12155 	{
12156 	  ++reps;
12157 	  desc += eltsz;
12158 	  descsz -= eltsz;
12159 	}
12160       while (descsz >= eltsz && !memcmp (desc, last, eltsz));
12161 
12162       if (reps == 1)
12163 	{
12164 	  /* For just one repeat, print it unabridged twice.  */
12165 	  desc -= eltsz;
12166 	  descsz += eltsz;
12167 	}
12168       else if (reps > 1)
12169 	printf (_("\n%*s... <repeats %u more times> ..."),
12170 		ITEM_INDENT, "", reps);
12171 
12172       last = desc;
12173     }
12174   while (descsz > 0);
12175 
12176   return colno;
12177 }
12178 
12179 static unsigned int
handle_bit_registers(const Ebl_Register_Location * regloc,const void * desc,unsigned int colno)12180 handle_bit_registers (const Ebl_Register_Location *regloc, const void *desc,
12181 		      unsigned int colno)
12182 {
12183   desc += regloc->offset;
12184 
12185   abort ();			/* XXX */
12186   return colno;
12187 }
12188 
12189 
12190 static unsigned int
handle_core_register(Ebl * ebl,Elf * core,int maxregname,const Ebl_Register_Location * regloc,const void * desc,unsigned int colno)12191 handle_core_register (Ebl *ebl, Elf *core, int maxregname,
12192 		      const Ebl_Register_Location *regloc, const void *desc,
12193 		      unsigned int colno)
12194 {
12195   if (regloc->bits % 8 != 0)
12196     return handle_bit_registers (regloc, desc, colno);
12197 
12198   desc += regloc->offset;
12199 
12200   for (int reg = regloc->regno; reg < regloc->regno + regloc->count; ++reg)
12201     {
12202       char name[REGNAMESZ];
12203       int bits;
12204       int type;
12205       register_info (ebl, reg, regloc, name, &bits, &type);
12206 
12207 #define TYPES								      \
12208       BITS (8, BYTE, "%4" PRId8, "0x%.2" PRIx8);			      \
12209       BITS (16, HALF, "%6" PRId16, "0x%.4" PRIx16);			      \
12210       BITS (32, WORD, "%11" PRId32, " 0x%.8" PRIx32);			      \
12211       BITS (64, XWORD, "%20" PRId64, "  0x%.16" PRIx64)
12212 
12213 #define BITS(bits, xtype, sfmt, ufmt)				\
12214       uint##bits##_t b##bits; int##bits##_t b##bits##s
12215       union { TYPES; uint64_t b128[2]; } value;
12216 #undef	BITS
12217 
12218       switch (type)
12219 	{
12220 	case DW_ATE_unsigned:
12221 	case DW_ATE_signed:
12222 	case DW_ATE_address:
12223 	  switch (bits)
12224 	    {
12225 #define BITS(bits, xtype, sfmt, ufmt)					      \
12226 	    case bits:							      \
12227 	      desc = convert (core, ELF_T_##xtype, 1, &value, desc, 0);	      \
12228 	      if (type == DW_ATE_signed)				      \
12229 		colno = print_core_item (colno, ' ', WRAP_COLUMN,	      \
12230 					 maxregname, name,		      \
12231 					 sfmt, value.b##bits##s);	      \
12232 	      else							      \
12233 		colno = print_core_item (colno, ' ', WRAP_COLUMN,	      \
12234 					 maxregname, name,		      \
12235 					 ufmt, value.b##bits);		      \
12236 	      break
12237 
12238 	    TYPES;
12239 
12240 	    case 128:
12241 	      assert (type == DW_ATE_unsigned);
12242 	      desc = convert (core, ELF_T_XWORD, 2, &value, desc, 0);
12243 	      int be = elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB;
12244 	      colno = print_core_item (colno, ' ', WRAP_COLUMN,
12245 				       maxregname, name,
12246 				       "0x%.16" PRIx64 "%.16" PRIx64,
12247 				       value.b128[!be], value.b128[be]);
12248 	      break;
12249 
12250 	    default:
12251 	      abort ();
12252 #undef	BITS
12253 	    }
12254 	  break;
12255 
12256 	default:
12257 	  /* Print each byte in hex, the whole thing in native byte order.  */
12258 	  assert (bits % 8 == 0);
12259 	  const uint8_t *bytes = desc;
12260 	  desc += bits / 8;
12261 	  char hex[bits / 4 + 1];
12262 	  hex[bits / 4] = '\0';
12263 	  int incr = 1;
12264 	  if (elf_getident (core, NULL)[EI_DATA] == ELFDATA2LSB)
12265 	    {
12266 	      bytes += bits / 8 - 1;
12267 	      incr = -1;
12268 	    }
12269 	  size_t idx = 0;
12270 	  for (char *h = hex; bits > 0; bits -= 8, idx += incr)
12271 	    {
12272 	      *h++ = "0123456789abcdef"[bytes[idx] >> 4];
12273 	      *h++ = "0123456789abcdef"[bytes[idx] & 0xf];
12274 	    }
12275 	  colno = print_core_item (colno, ' ', WRAP_COLUMN,
12276 				   maxregname, name, "0x%s", hex);
12277 	  break;
12278 	}
12279       desc += regloc->pad;
12280 
12281 #undef TYPES
12282     }
12283 
12284   return colno;
12285 }
12286 
12287 
12288 struct register_info
12289 {
12290   const Ebl_Register_Location *regloc;
12291   const char *set;
12292   char name[REGNAMESZ];
12293   int regno;
12294   int bits;
12295   int type;
12296 };
12297 
12298 static int
register_bitpos(const struct register_info * r)12299 register_bitpos (const struct register_info *r)
12300 {
12301   return (r->regloc->offset * 8
12302 	  + ((r->regno - r->regloc->regno)
12303 	     * (r->regloc->bits + r->regloc->pad * 8)));
12304 }
12305 
12306 static int
compare_sets_by_info(const struct register_info * r1,const struct register_info * r2)12307 compare_sets_by_info (const struct register_info *r1,
12308 		      const struct register_info *r2)
12309 {
12310   return ((int) r2->bits - (int) r1->bits
12311 	  ?: register_bitpos (r1) - register_bitpos (r2));
12312 }
12313 
12314 /* Sort registers by set, and by size and layout offset within each set.  */
12315 static int
compare_registers(const void * a,const void * b)12316 compare_registers (const void *a, const void *b)
12317 {
12318   const struct register_info *r1 = a;
12319   const struct register_info *r2 = b;
12320 
12321   /* Unused elements sort last.  */
12322   if (r1->regloc == NULL)
12323     return r2->regloc == NULL ? 0 : 1;
12324   if (r2->regloc == NULL)
12325     return -1;
12326 
12327   return ((r1->set == r2->set ? 0 : strcmp (r1->set, r2->set))
12328 	  ?: compare_sets_by_info (r1, r2));
12329 }
12330 
12331 /* Sort register sets by layout offset of the first register in the set.  */
12332 static int
compare_register_sets(const void * a,const void * b)12333 compare_register_sets (const void *a, const void *b)
12334 {
12335   const struct register_info *const *p1 = a;
12336   const struct register_info *const *p2 = b;
12337   return compare_sets_by_info (*p1, *p2);
12338 }
12339 
12340 static inline bool
same_set(const struct register_info * a,const struct register_info * b,const struct register_info * regs,size_t maxnreg)12341 same_set (const struct register_info *a,
12342 	  const struct register_info *b,
12343 	  const struct register_info *regs,
12344 	  size_t maxnreg)
12345 {
12346   return (a < &regs[maxnreg] && a->regloc != NULL
12347 	  && b < &regs[maxnreg] && b->regloc != NULL
12348 	  && a->bits == b->bits
12349 	  && (a->set == b->set || !strcmp (a->set, b->set)));
12350 }
12351 
12352 static unsigned int
handle_core_registers(Ebl * ebl,Elf * core,const void * desc,const Ebl_Register_Location * reglocs,size_t nregloc)12353 handle_core_registers (Ebl *ebl, Elf *core, const void *desc,
12354 		       const Ebl_Register_Location *reglocs, size_t nregloc)
12355 {
12356   if (nregloc == 0)
12357     return 0;
12358 
12359   ssize_t maxnreg = ebl_register_info (ebl, 0, NULL, 0, NULL, NULL, NULL, NULL);
12360   if (maxnreg <= 0)
12361     {
12362       for (size_t i = 0; i < nregloc; ++i)
12363 	if (maxnreg < reglocs[i].regno + reglocs[i].count)
12364 	  maxnreg = reglocs[i].regno + reglocs[i].count;
12365       assert (maxnreg > 0);
12366     }
12367 
12368   struct register_info regs[maxnreg];
12369   memset (regs, 0, sizeof regs);
12370 
12371   /* Sort to collect the sets together.  */
12372   int maxreg = 0;
12373   for (size_t i = 0; i < nregloc; ++i)
12374     for (int reg = reglocs[i].regno;
12375 	 reg < reglocs[i].regno + reglocs[i].count;
12376 	 ++reg)
12377       {
12378 	assert (reg < maxnreg);
12379 	if (reg > maxreg)
12380 	  maxreg = reg;
12381 	struct register_info *info = &regs[reg];
12382 	info->regloc = &reglocs[i];
12383 	info->regno = reg;
12384 	info->set = register_info (ebl, reg, &reglocs[i],
12385 				   info->name, &info->bits, &info->type);
12386       }
12387   qsort (regs, maxreg + 1, sizeof regs[0], &compare_registers);
12388 
12389   /* Collect the unique sets and sort them.  */
12390   struct register_info *sets[maxreg + 1];
12391   sets[0] = &regs[0];
12392   size_t nsets = 1;
12393   for (int i = 1; i <= maxreg; ++i)
12394     if (regs[i].regloc != NULL
12395 	&& !same_set (&regs[i], &regs[i - 1], regs, maxnreg))
12396       sets[nsets++] = &regs[i];
12397   qsort (sets, nsets, sizeof sets[0], &compare_register_sets);
12398 
12399   /* Write out all the sets.  */
12400   unsigned int colno = 0;
12401   for (size_t i = 0; i < nsets; ++i)
12402     {
12403       /* Find the longest name of a register in this set.  */
12404       size_t maxname = 0;
12405       const struct register_info *end;
12406       for (end = sets[i]; same_set (sets[i], end, regs, maxnreg); ++end)
12407 	{
12408 	  size_t len = strlen (end->name);
12409 	  if (len > maxname)
12410 	    maxname = len;
12411 	}
12412 
12413       for (const struct register_info *reg = sets[i];
12414 	   reg < end;
12415 	   reg += reg->regloc->count ?: 1)
12416 	colno = handle_core_register (ebl, core, maxname,
12417 				      reg->regloc, desc, colno);
12418 
12419       /* Force a line break at the end of the group.  */
12420       colno = WRAP_COLUMN;
12421     }
12422 
12423   return colno;
12424 }
12425 
12426 static void
handle_auxv_note(Ebl * ebl,Elf * core,GElf_Word descsz,GElf_Off desc_pos)12427 handle_auxv_note (Ebl *ebl, Elf *core, GElf_Word descsz, GElf_Off desc_pos)
12428 {
12429   Elf_Data *data = elf_getdata_rawchunk (core, desc_pos, descsz, ELF_T_AUXV);
12430   if (data == NULL)
12431   elf_error:
12432     error_exit (0, _("cannot convert core note data: %s"), elf_errmsg (-1));
12433 
12434   const size_t nauxv = descsz / gelf_fsize (core, ELF_T_AUXV, 1, EV_CURRENT);
12435   for (size_t i = 0; i < nauxv; ++i)
12436     {
12437       GElf_auxv_t av_mem;
12438       GElf_auxv_t *av = gelf_getauxv (data, i, &av_mem);
12439       if (av == NULL)
12440 	goto elf_error;
12441 
12442       const char *name;
12443       const char *fmt;
12444       if (ebl_auxv_info (ebl, av->a_type, &name, &fmt) == 0)
12445 	{
12446 	  /* Unknown type.  */
12447 	  if (av->a_un.a_val == 0)
12448 	    printf ("    %" PRIu64 "\n", av->a_type);
12449 	  else
12450 	    printf ("    %" PRIu64 ": %#" PRIx64 "\n",
12451 		    av->a_type, av->a_un.a_val);
12452 	}
12453       else
12454 	switch (fmt[0])
12455 	  {
12456 	  case '\0':		/* Normally zero.  */
12457 	    if (av->a_un.a_val == 0)
12458 	      {
12459 		printf ("    %s\n", name);
12460 		break;
12461 	      }
12462 	    FALLTHROUGH;
12463 	  case 'x':		/* hex */
12464 	  case 'p':		/* address */
12465 	  case 's':		/* address of string */
12466 	    printf ("    %s: %#" PRIx64 "\n", name, av->a_un.a_val);
12467 	    break;
12468 	  case 'u':
12469 	    printf ("    %s: %" PRIu64 "\n", name, av->a_un.a_val);
12470 	    break;
12471 	  case 'd':
12472 	    printf ("    %s: %" PRId64 "\n", name, av->a_un.a_val);
12473 	    break;
12474 
12475 	  case 'b':
12476 	    printf ("    %s: %#" PRIx64 "  ", name, av->a_un.a_val);
12477 	    GElf_Xword bit = 1;
12478 	    const char *pfx = "<";
12479 	    for (const char *p = fmt + 1; *p != 0; p = strchr (p, '\0') + 1)
12480 	      {
12481 		if (av->a_un.a_val & bit)
12482 		  {
12483 		    printf ("%s%s", pfx, p);
12484 		    pfx = " ";
12485 		  }
12486 		bit <<= 1;
12487 	      }
12488 	    printf (">\n");
12489 	    break;
12490 
12491 	  default:
12492 	    abort ();
12493 	  }
12494     }
12495 }
12496 
12497 static bool
buf_has_data(unsigned char const * ptr,unsigned char const * end,size_t sz)12498 buf_has_data (unsigned char const *ptr, unsigned char const *end, size_t sz)
12499 {
12500   return ptr < end && (size_t) (end - ptr) >= sz;
12501 }
12502 
12503 static bool
buf_read_int(Elf * core,unsigned char const ** ptrp,unsigned char const * end,int * retp)12504 buf_read_int (Elf *core, unsigned char const **ptrp, unsigned char const *end,
12505 	      int *retp)
12506 {
12507   if (! buf_has_data (*ptrp, end, 4))
12508     return false;
12509 
12510   *ptrp = convert (core, ELF_T_WORD, 1, retp, *ptrp, 4);
12511   return true;
12512 }
12513 
12514 static bool
buf_read_ulong(Elf * core,unsigned char const ** ptrp,unsigned char const * end,uint64_t * retp)12515 buf_read_ulong (Elf *core, unsigned char const **ptrp, unsigned char const *end,
12516 		uint64_t *retp)
12517 {
12518   size_t sz = gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
12519   if (! buf_has_data (*ptrp, end, sz))
12520     return false;
12521 
12522   union
12523   {
12524     uint64_t u64;
12525     uint32_t u32;
12526   } u;
12527 
12528   *ptrp = convert (core, ELF_T_ADDR, 1, &u, *ptrp, sz);
12529 
12530   if (sz == 4)
12531     *retp = u.u32;
12532   else
12533     *retp = u.u64;
12534   return true;
12535 }
12536 
12537 static void
handle_siginfo_note(Elf * core,GElf_Word descsz,GElf_Off desc_pos)12538 handle_siginfo_note (Elf *core, GElf_Word descsz, GElf_Off desc_pos)
12539 {
12540   Elf_Data *data = elf_getdata_rawchunk (core, desc_pos, descsz, ELF_T_BYTE);
12541   if (data == NULL)
12542     error_exit (0, _("cannot convert core note data: %s"), elf_errmsg (-1));
12543 
12544   unsigned char const *ptr = data->d_buf;
12545   unsigned char const *const end = data->d_buf + data->d_size;
12546 
12547   /* Siginfo head is three ints: signal number, error number, origin
12548      code.  */
12549   int si_signo, si_errno, si_code;
12550   if (! buf_read_int (core, &ptr, end, &si_signo)
12551       || ! buf_read_int (core, &ptr, end, &si_errno)
12552       || ! buf_read_int (core, &ptr, end, &si_code))
12553     {
12554     fail:
12555       printf ("    Not enough data in NT_SIGINFO note.\n");
12556       return;
12557     }
12558 
12559   /* Next is a pointer-aligned union of structures.  On 64-bit
12560      machines, that implies a word of padding.  */
12561   if (gelf_getclass (core) == ELFCLASS64)
12562     ptr += 4;
12563 
12564   printf ("    si_signo: %d, si_errno: %d, si_code: %d\n",
12565 	  si_signo, si_errno, si_code);
12566 
12567   if (si_code > 0)
12568     switch (si_signo)
12569       {
12570       case CORE_SIGILL:
12571       case CORE_SIGFPE:
12572       case CORE_SIGSEGV:
12573       case CORE_SIGBUS:
12574 	{
12575 	  uint64_t addr;
12576 	  if (! buf_read_ulong (core, &ptr, end, &addr))
12577 	    goto fail;
12578 	  printf ("    fault address: %#" PRIx64 "\n", addr);
12579 	  break;
12580 	}
12581       default:
12582 	;
12583       }
12584   else if (si_code == CORE_SI_USER)
12585     {
12586       int pid, uid;
12587       if (! buf_read_int (core, &ptr, end, &pid)
12588 	  || ! buf_read_int (core, &ptr, end, &uid))
12589 	goto fail;
12590       printf ("    sender PID: %d, sender UID: %d\n", pid, uid);
12591     }
12592 }
12593 
12594 static void
handle_file_note(Elf * core,GElf_Word descsz,GElf_Off desc_pos)12595 handle_file_note (Elf *core, GElf_Word descsz, GElf_Off desc_pos)
12596 {
12597   Elf_Data *data = elf_getdata_rawchunk (core, desc_pos, descsz, ELF_T_BYTE);
12598   if (data == NULL)
12599     error_exit (0, _("cannot convert core note data: %s"), elf_errmsg (-1));
12600 
12601   unsigned char const *ptr = data->d_buf;
12602   unsigned char const *const end = data->d_buf + data->d_size;
12603 
12604   uint64_t count, page_size;
12605   if (! buf_read_ulong (core, &ptr, end, &count)
12606       || ! buf_read_ulong (core, &ptr, end, &page_size))
12607     {
12608     fail:
12609       printf ("    Not enough data in NT_FILE note.\n");
12610       return;
12611     }
12612 
12613   size_t addrsize = gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
12614   uint64_t maxcount = (size_t) (end - ptr) / (3 * addrsize);
12615   if (count > maxcount)
12616     goto fail;
12617 
12618   /* Where file names are stored.  */
12619   unsigned char const *const fstart = ptr + 3 * count * addrsize;
12620   char const *fptr = (char *) fstart;
12621 
12622   printf ("    %" PRId64 " files:\n", count);
12623   for (uint64_t i = 0; i < count; ++i)
12624     {
12625       uint64_t mstart, mend, moffset;
12626       if (! buf_read_ulong (core, &ptr, fstart, &mstart)
12627 	  || ! buf_read_ulong (core, &ptr, fstart, &mend)
12628 	  || ! buf_read_ulong (core, &ptr, fstart, &moffset))
12629 	goto fail;
12630 
12631       const char *fnext = memchr (fptr, '\0', (char *) end - fptr);
12632       if (fnext == NULL)
12633 	goto fail;
12634 
12635       int ct = printf ("      %08" PRIx64 "-%08" PRIx64
12636 		       " %08" PRIx64 " %" PRId64,
12637 		       mstart, mend, moffset * page_size, mend - mstart);
12638       printf ("%*s%s\n", ct > 50 ? 3 : 53 - ct, "", fptr);
12639 
12640       fptr = fnext + 1;
12641     }
12642 }
12643 
12644 static void
handle_core_note(Ebl * ebl,const GElf_Nhdr * nhdr,const char * name,const void * desc)12645 handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr,
12646 		  const char *name, const void *desc)
12647 {
12648   GElf_Word regs_offset;
12649   size_t nregloc;
12650   const Ebl_Register_Location *reglocs;
12651   size_t nitems;
12652   const Ebl_Core_Item *items;
12653 
12654   if (! ebl_core_note (ebl, nhdr, name, desc,
12655 		       &regs_offset, &nregloc, &reglocs, &nitems, &items))
12656     return;
12657 
12658   /* Pass 0 for DESCSZ when there are registers in the note,
12659      so that the ITEMS array does not describe the whole thing.
12660      For non-register notes, the actual descsz might be a multiple
12661      of the unit size, not just exactly the unit size.  */
12662   unsigned int colno = handle_core_items (ebl->elf, desc,
12663 					  nregloc == 0 ? nhdr->n_descsz : 0,
12664 					  items, nitems);
12665   if (colno != 0)
12666     putchar_unlocked ('\n');
12667 
12668   colno = handle_core_registers (ebl, ebl->elf, desc + regs_offset,
12669 				 reglocs, nregloc);
12670   if (colno != 0)
12671     putchar_unlocked ('\n');
12672 }
12673 
12674 static void
handle_notes_data(Ebl * ebl,const GElf_Ehdr * ehdr,GElf_Off start,Elf_Data * data)12675 handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr,
12676 		   GElf_Off start, Elf_Data *data)
12677 {
12678   fputs_unlocked (_("  Owner          Data size  Type\n"), stdout);
12679 
12680   if (data == NULL)
12681     goto bad_note;
12682 
12683   size_t offset = 0;
12684   GElf_Nhdr nhdr;
12685   size_t name_offset;
12686   size_t desc_offset;
12687   while (offset < data->d_size
12688 	 && (offset = gelf_getnote (data, offset,
12689 				    &nhdr, &name_offset, &desc_offset)) > 0)
12690     {
12691       const char *name = nhdr.n_namesz == 0 ? "" : data->d_buf + name_offset;
12692       const char *desc = data->d_buf + desc_offset;
12693 
12694       /* GNU Build Attributes are weird, they store most of their data
12695 	 into the owner name field.  Extract just the owner name
12696 	 prefix here, then use the rest later as data.  */
12697       bool is_gnu_build_attr
12698 	= startswith (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX);
12699       const char *print_name = (is_gnu_build_attr
12700 				? ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX : name);
12701       size_t print_namesz = (is_gnu_build_attr
12702 			     ? strlen (print_name) : nhdr.n_namesz);
12703 
12704       char buf[100];
12705       char buf2[100];
12706       printf (_("  %-13.*s  %9" PRId32 "  %s\n"),
12707 	      (int) print_namesz, print_name, nhdr.n_descsz,
12708 	      ehdr->e_type == ET_CORE
12709 	      ? ebl_core_note_type_name (ebl, nhdr.n_type,
12710 					 buf, sizeof (buf))
12711 	      : ebl_object_note_type_name (ebl, name, nhdr.n_type,
12712 					   nhdr.n_descsz,
12713 					   buf2, sizeof (buf2)));
12714 
12715       /* Filter out invalid entries.  */
12716       if (memchr (name, '\0', nhdr.n_namesz) != NULL
12717 	  /* XXX For now help broken Linux kernels.  */
12718 	  || 1)
12719 	{
12720 	  if (ehdr->e_type == ET_CORE)
12721 	    {
12722 	      if (nhdr.n_type == NT_AUXV
12723 		  && (nhdr.n_namesz == 4 /* Broken old Linux kernels.  */
12724 		      || (nhdr.n_namesz == 5 && name[4] == '\0'))
12725 		  && !memcmp (name, "CORE", 4))
12726 		handle_auxv_note (ebl, ebl->elf, nhdr.n_descsz,
12727 				  start + desc_offset);
12728 	      else if (nhdr.n_namesz == 5 && strcmp (name, "CORE") == 0)
12729 		switch (nhdr.n_type)
12730 		  {
12731 		  case NT_SIGINFO:
12732 		    handle_siginfo_note (ebl->elf, nhdr.n_descsz,
12733 					 start + desc_offset);
12734 		    break;
12735 
12736 		  case NT_FILE:
12737 		    handle_file_note (ebl->elf, nhdr.n_descsz,
12738 				      start + desc_offset);
12739 		    break;
12740 
12741 		  default:
12742 		    handle_core_note (ebl, &nhdr, name, desc);
12743 		  }
12744 	      else
12745 		handle_core_note (ebl, &nhdr, name, desc);
12746 	    }
12747 	  else
12748 	    ebl_object_note (ebl, nhdr.n_namesz, name, nhdr.n_type,
12749 			     nhdr.n_descsz, desc);
12750 	}
12751     }
12752 
12753   if (offset == data->d_size)
12754     return;
12755 
12756  bad_note:
12757   error (0, 0,
12758 	 _("cannot get content of note: %s"),
12759 	 data != NULL ? "garbage data" : elf_errmsg (-1));
12760 }
12761 
12762 static void
handle_notes(Ebl * ebl,GElf_Ehdr * ehdr)12763 handle_notes (Ebl *ebl, GElf_Ehdr *ehdr)
12764 {
12765   /* If we have section headers, just look for SHT_NOTE sections.
12766      In a debuginfo file, the program headers are not reliable.  */
12767   if (shnum != 0)
12768     {
12769       /* Get the section header string table index.  */
12770       size_t shstrndx;
12771       if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
12772 	error_exit (0, _("cannot get section header string table index"));
12773 
12774       Elf_Scn *scn = NULL;
12775       while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
12776 	{
12777 	  GElf_Shdr shdr_mem;
12778 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
12779 
12780 	  if (shdr == NULL || shdr->sh_type != SHT_NOTE)
12781 	    /* Not what we are looking for.  */
12782 	    continue;
12783 
12784 	  if (notes_section != NULL)
12785 	    {
12786 	      char *sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
12787 	      if (sname == NULL || strcmp (sname, notes_section) != 0)
12788 		continue;
12789 	    }
12790 
12791 	  printf (_("\
12792 \nNote section [%2zu] '%s' of %" PRIu64 " bytes at offset %#0" PRIx64 ":\n"),
12793 		  elf_ndxscn (scn),
12794 		  elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
12795 		  shdr->sh_size, shdr->sh_offset);
12796 
12797 	  handle_notes_data (ebl, ehdr, shdr->sh_offset,
12798 			     elf_getdata (scn, NULL));
12799 	}
12800       return;
12801     }
12802 
12803   /* We have to look through the program header to find the note
12804      sections.  There can be more than one.  */
12805   for (size_t cnt = 0; cnt < phnum; ++cnt)
12806     {
12807       GElf_Phdr mem;
12808       GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &mem);
12809 
12810       if (phdr == NULL || phdr->p_type != PT_NOTE)
12811 	/* Not what we are looking for.  */
12812 	continue;
12813 
12814       printf (_("\
12815 \nNote segment of %" PRIu64 " bytes at offset %#0" PRIx64 ":\n"),
12816 	      phdr->p_filesz, phdr->p_offset);
12817 
12818       handle_notes_data (ebl, ehdr, phdr->p_offset,
12819 			 elf_getdata_rawchunk (ebl->elf,
12820 					       phdr->p_offset, phdr->p_filesz,
12821 					       (phdr->p_align == 8
12822 						? ELF_T_NHDR8 : ELF_T_NHDR)));
12823     }
12824 }
12825 
12826 
12827 static void
hex_dump(const uint8_t * data,size_t len)12828 hex_dump (const uint8_t *data, size_t len)
12829 {
12830   size_t pos = 0;
12831   while (pos < len)
12832     {
12833       printf ("  0x%08zx ", pos);
12834 
12835       const size_t chunk = MIN (len - pos, 16);
12836 
12837       for (size_t i = 0; i < chunk; ++i)
12838 	if (i % 4 == 3)
12839 	  printf ("%02x ", data[pos + i]);
12840 	else
12841 	  printf ("%02x", data[pos + i]);
12842 
12843       if (chunk < 16)
12844 	printf ("%*s", (int) ((16 - chunk) * 2 + (16 - chunk + 3) / 4), "");
12845 
12846       for (size_t i = 0; i < chunk; ++i)
12847 	{
12848 	  unsigned char b = data[pos + i];
12849 	  printf ("%c", isprint (b) ? b : '.');
12850 	}
12851 
12852       putchar ('\n');
12853       pos += chunk;
12854     }
12855 }
12856 
12857 static void
dump_data_section(Elf_Scn * scn,const GElf_Shdr * shdr,const char * name)12858 dump_data_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name)
12859 {
12860   if (shdr->sh_size == 0 || shdr->sh_type == SHT_NOBITS)
12861     printf (_("\nSection [%zu] '%s' has no data to dump.\n"),
12862 	    elf_ndxscn (scn), name);
12863   else
12864     {
12865       if (print_decompress)
12866 	{
12867 	  /* We try to decompress the section, but keep the old shdr around
12868 	     so we can show both the original shdr size and the uncompressed
12869 	     data size.   */
12870 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
12871 	    {
12872 	      if (elf_compress (scn, 0, 0) < 0)
12873 		printf ("WARNING: %s [%zd]\n",
12874 			_("Couldn't uncompress section"),
12875 			elf_ndxscn (scn));
12876 	    }
12877 	  else if (startswith (name, ".zdebug"))
12878 	    {
12879 	      if (elf_compress_gnu (scn, 0, 0) < 0)
12880 		printf ("WARNING: %s [%zd]\n",
12881 			_("Couldn't uncompress section"),
12882 			elf_ndxscn (scn));
12883 	    }
12884 	}
12885 
12886       Elf_Data *data = elf_rawdata (scn, NULL);
12887       if (data == NULL)
12888 	error (0, 0, _("cannot get data for section [%zu] '%s': %s"),
12889 	       elf_ndxscn (scn), name, elf_errmsg (-1));
12890       else
12891 	{
12892 	  if (data->d_size == shdr->sh_size)
12893 	    printf (_("\nHex dump of section [%zu] '%s', %" PRIu64
12894 			     " bytes at offset %#0" PRIx64 ":\n"),
12895 		    elf_ndxscn (scn), name,
12896 		    shdr->sh_size, shdr->sh_offset);
12897 	  else
12898 	    printf (_("\nHex dump of section [%zu] '%s', %" PRIu64
12899 			     " bytes (%zd uncompressed) at offset %#0"
12900 			     PRIx64 ":\n"),
12901 		    elf_ndxscn (scn), name,
12902 		    shdr->sh_size, data->d_size, shdr->sh_offset);
12903 	  hex_dump (data->d_buf, data->d_size);
12904 	}
12905     }
12906 }
12907 
12908 static void
print_string_section(Elf_Scn * scn,const GElf_Shdr * shdr,const char * name)12909 print_string_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name)
12910 {
12911   if (shdr->sh_size == 0 || shdr->sh_type == SHT_NOBITS)
12912     printf (_("\nSection [%zu] '%s' has no strings to dump.\n"),
12913 	    elf_ndxscn (scn), name);
12914   else
12915     {
12916       if (print_decompress)
12917 	{
12918 	  /* We try to decompress the section, but keep the old shdr around
12919 	     so we can show both the original shdr size and the uncompressed
12920 	     data size.  */
12921 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
12922 	    {
12923 	      if (elf_compress (scn, 0, 0) < 0)
12924 		printf ("WARNING: %s [%zd]\n",
12925 			_("Couldn't uncompress section"),
12926 			elf_ndxscn (scn));
12927 	    }
12928 	  else if (startswith (name, ".zdebug"))
12929 	    {
12930 	      if (elf_compress_gnu (scn, 0, 0) < 0)
12931 		printf ("WARNING: %s [%zd]\n",
12932 			_("Couldn't uncompress section"),
12933 			elf_ndxscn (scn));
12934 	    }
12935 	}
12936 
12937       Elf_Data *data = elf_rawdata (scn, NULL);
12938       if (data == NULL)
12939 	error (0, 0, _("cannot get data for section [%zu] '%s': %s"),
12940 	       elf_ndxscn (scn), name, elf_errmsg (-1));
12941       else
12942 	{
12943 	  if (data->d_size == shdr->sh_size)
12944 	    printf (_("\nString section [%zu] '%s' contains %" PRIu64
12945 			     " bytes at offset %#0" PRIx64 ":\n"),
12946 		    elf_ndxscn (scn), name,
12947 		    shdr->sh_size, shdr->sh_offset);
12948 	  else
12949 	    printf (_("\nString section [%zu] '%s' contains %" PRIu64
12950 			     " bytes (%zd uncompressed) at offset %#0"
12951 			     PRIx64 ":\n"),
12952 		    elf_ndxscn (scn), name,
12953 		    shdr->sh_size, data->d_size, shdr->sh_offset);
12954 
12955 	  const char *start = data->d_buf;
12956 	  const char *const limit = start + data->d_size;
12957 	  do
12958 	    {
12959 	      const char *end = memchr (start, '\0', limit - start);
12960 	      const size_t pos = start - (const char *) data->d_buf;
12961 	      if (unlikely (end == NULL))
12962 		{
12963 		  printf ("  [%6zx]- %.*s\n",
12964 			  pos, (int) (limit - start), start);
12965 		  break;
12966 		}
12967 	      printf ("  [%6zx]  %s\n", pos, start);
12968 	      start = end + 1;
12969 	    } while (start < limit);
12970 	}
12971     }
12972 }
12973 
12974 static void
for_each_section_argument(Elf * elf,const struct section_argument * list,void (* dump)(Elf_Scn * scn,const GElf_Shdr * shdr,const char * name))12975 for_each_section_argument (Elf *elf, const struct section_argument *list,
12976 			   void (*dump) (Elf_Scn *scn, const GElf_Shdr *shdr,
12977 					 const char *name))
12978 {
12979   /* Get the section header string table index.  */
12980   size_t shstrndx;
12981   if (elf_getshdrstrndx (elf, &shstrndx) < 0)
12982     error_exit (0, _("cannot get section header string table index"));
12983 
12984   for (const struct section_argument *a = list; a != NULL; a = a->next)
12985     {
12986       Elf_Scn *scn;
12987       GElf_Shdr shdr_mem;
12988       const char *name = NULL;
12989 
12990       char *endp = NULL;
12991       unsigned long int shndx = strtoul (a->arg, &endp, 0);
12992       if (endp != a->arg && *endp == '\0')
12993 	{
12994 	  scn = elf_getscn (elf, shndx);
12995 	  if (scn == NULL)
12996 	    {
12997 	      error (0, 0, _("\nsection [%lu] does not exist"), shndx);
12998 	      continue;
12999 	    }
13000 
13001 	  if (gelf_getshdr (scn, &shdr_mem) == NULL)
13002 	    error_exit (0, _("cannot get section header: %s"),
13003 			elf_errmsg (-1));
13004 	  name = elf_strptr (elf, shstrndx, shdr_mem.sh_name);
13005 	  (*dump) (scn, &shdr_mem, name);
13006 	}
13007       else
13008 	{
13009 	  /* Need to look up the section by name.  */
13010 	  scn = NULL;
13011 	  bool found = false;
13012 	  while ((scn = elf_nextscn (elf, scn)) != NULL)
13013 	    {
13014 	      if (gelf_getshdr (scn, &shdr_mem) == NULL)
13015 		continue;
13016 	      name = elf_strptr (elf, shstrndx, shdr_mem.sh_name);
13017 	      if (name == NULL)
13018 		continue;
13019 	      if (!strcmp (name, a->arg))
13020 		{
13021 		  found = true;
13022 		  (*dump) (scn, &shdr_mem, name);
13023 		}
13024 	    }
13025 
13026 	  if (unlikely (!found) && !a->implicit)
13027 	    error (0, 0, _("\nsection '%s' does not exist"), a->arg);
13028 	}
13029     }
13030 }
13031 
13032 static void
dump_data(Ebl * ebl)13033 dump_data (Ebl *ebl)
13034 {
13035   for_each_section_argument (ebl->elf, dump_data_sections, &dump_data_section);
13036 }
13037 
13038 static void
dump_strings(Ebl * ebl)13039 dump_strings (Ebl *ebl)
13040 {
13041   for_each_section_argument (ebl->elf, string_sections, &print_string_section);
13042 }
13043 
13044 static void
print_strings(Ebl * ebl)13045 print_strings (Ebl *ebl)
13046 {
13047   /* Get the section header string table index.  */
13048   size_t shstrndx;
13049   if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
13050     error_exit (0, _("cannot get section header string table index"));
13051 
13052   Elf_Scn *scn;
13053   GElf_Shdr shdr_mem;
13054   const char *name;
13055   scn = NULL;
13056   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
13057     {
13058       if (gelf_getshdr (scn, &shdr_mem) == NULL)
13059 	continue;
13060 
13061       if (shdr_mem.sh_type != SHT_PROGBITS
13062 	  || !(shdr_mem.sh_flags & SHF_STRINGS))
13063 	continue;
13064 
13065       name = elf_strptr (ebl->elf, shstrndx, shdr_mem.sh_name);
13066       if (name == NULL)
13067 	continue;
13068 
13069       print_string_section (scn, &shdr_mem, name);
13070     }
13071 }
13072 
13073 static void
dump_archive_index(Elf * elf,const char * fname)13074 dump_archive_index (Elf *elf, const char *fname)
13075 {
13076   size_t narsym;
13077   const Elf_Arsym *arsym = elf_getarsym (elf, &narsym);
13078   if (arsym == NULL)
13079     {
13080       int result = elf_errno ();
13081       if (unlikely (result != ELF_E_NO_INDEX))
13082 	error_exit (0, _("cannot get symbol index of archive '%s': %s"),
13083 		    fname, elf_errmsg (result));
13084       else
13085 	printf (_("\nArchive '%s' has no symbol index\n"), fname);
13086       return;
13087     }
13088 
13089   printf (_("\nIndex of archive '%s' has %zu entries:\n"),
13090 	  fname, narsym);
13091 
13092   size_t as_off = 0;
13093   for (const Elf_Arsym *s = arsym; s < &arsym[narsym - 1]; ++s)
13094     {
13095       if (s->as_off != as_off)
13096 	{
13097 	  as_off = s->as_off;
13098 
13099 	  Elf *subelf = NULL;
13100 	  if (unlikely (elf_rand (elf, as_off) == 0)
13101 	      || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf))
13102 			   == NULL))
13103 #if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 7)
13104 	    while (1)
13105 #endif
13106 	      error_exit (0,
13107 			  _("cannot extract member at offset %zu in '%s': %s"),
13108 			  as_off, fname, elf_errmsg (-1));
13109 
13110 	  const Elf_Arhdr *h = elf_getarhdr (subelf);
13111 
13112 	  printf (_("Archive member '%s' contains:\n"), h->ar_name);
13113 
13114 	  elf_end (subelf);
13115 	}
13116 
13117       printf ("\t%s\n", s->as_name);
13118     }
13119 }
13120 
13121 #include "debugpred.h"
13122