1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Print size information from ELF file.
2587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard   Copyright (C) 2000-2007,2009,2012,2014,2015 Red Hat, Inc.
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 2000.
5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of the GNU General Public License as published by
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   (at your option) any later version.
10361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
12361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   WITHOUT ANY WARRANTY; without even the implied warranty of
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   GNU General Public License for more details.
15361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received a copy of the GNU General Public License
17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
19b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifdef HAVE_CONFIG_H
20b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h>
21b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif
22b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
23b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <argp.h>
24b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <error.h>
25b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <fcntl.h>
26b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <gelf.h>
27b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <inttypes.h>
28b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libelf.h>
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libintl.h>
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <locale.h>
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdbool.h>
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdio.h>
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdio_ext.h>
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdlib.h>
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h>
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <unistd.h>
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <sys/param.h>
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
39b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <system.h>
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Name and version of program.  */
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void print_version (FILE *stream, struct argp_state *state);
44fdc93e12a77866cafd1aae4463d89cef2c01d9b1Ulrich DrepperARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Bug report address.  */
47fdc93e12a77866cafd1aae4463d89cef2c01d9b1Ulrich DrepperARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Values for the parameters which have no short form.  */
51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define OPT_FORMAT	0x100
52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define OPT_RADIX	0x101
53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Definitions of arguments for argp functions.  */
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const struct argp_option options[] =
56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 0, NULL, 0, N_("Output format:"), 0 },
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { "format", OPT_FORMAT, "FORMAT", 0,
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    N_("Use the output format FORMAT.  FORMAT can be `bsd' or `sysv'.  "
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper       "The default is `bsd'"), 0 },
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'A', NULL, 0, N_("Same as `--format=sysv'"), 0 },
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'B', NULL, 0, N_("Same as `--format=bsd'"), 0 },
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { "radix", OPT_RADIX, "RADIX", 0, N_("Use RADIX for printing symbol values"),
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    0},
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'd', NULL, 0, N_("Same as `--radix=10'"), 0 },
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'o', NULL, 0, N_("Same as `--radix=8'"), 0 },
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'x', NULL, 0, N_("Same as `--radix=16'"), 0 },
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'f', NULL, 0,
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    N_("Similar to `--format=sysv' output but in one line"), 0 },
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 0, NULL, 0, N_("Output options:"), 0 },
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 'F', NULL, 0,
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    N_("Print size and permission flags for loadable segments"), 0 },
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { "totals", 't', NULL, 0, N_("Display the total sizes (bsd only)"), 0 },
75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  { NULL, 0, NULL, 0, NULL, 0 }
76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Short description of program.  */
79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const char doc[] = N_("\
80b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperList section sizes of FILEs (a.out by default).");
81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Strings for arguments in help texts.  */
83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const char args_doc[] = N_("[FILE...]");
84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Prototype for option handler.  */
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic error_t parse_opt (int key, char *arg, struct argp_state *state);
87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Data structure to communicate with argp functions.  */
89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic struct argp argp =
90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  options, parse_opt, args_doc, doc, NULL, NULL, NULL
92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Print symbols in file named FNAME.  */
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic int process_file (const char *fname);
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Handle content of archive.  */
99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic int handle_ar (int fd, Elf *elf, const char *prefix, const char *fname);
100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Handle ELF file.  */
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void handle_elf (Elf *elf, const char *fullname, const char *fname);
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show total size.  */
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void show_bsd_totals (void);
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define INTERNAL_ERROR(fname) \
108587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard  error (EXIT_FAILURE, 0, gettext ("%s: INTERNAL ERROR %d (%s): %s"),      \
109587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard	 fname, __LINE__, PACKAGE_VERSION, elf_errmsg (-1))
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* User-selectable options.  */
113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* The selected output format.  */
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic enum
116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  format_bsd = 0,
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  format_sysv,
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  format_sysv_one_line,
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  format_segments
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} format;
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Radix for printed numbers.  */
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic enum
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  radix_decimal = 0,
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  radix_hex,
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  radix_octal
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} radix;
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Mapping of radix and binary class to length.  */
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const int length_map[2][3] =
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [ELFCLASS32 - 1] =
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_hex] = 8,
138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_decimal] = 10,
139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_octal] = 11
140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  },
141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [ELFCLASS64 - 1] =
142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
143b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_hex] = 16,
144b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_decimal] = 20,
145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [radix_octal] = 22
146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  }
147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* True if total sizes should be printed.  */
150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic bool totals;
151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* To print the total sizes in a reasonable format remember the higest
152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   "class" of ELF binaries processed.  */
153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic int totals_class;
154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperint
157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppermain (int argc, char *argv[])
158b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
159b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int remaining;
160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int result = 0;
161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
162b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* We use no threads here which can interfere with handling a stream.  */
163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  __fsetlocking (stdin, FSETLOCKING_BYCALLER);
164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  __fsetlocking (stdout, FSETLOCKING_BYCALLER);
165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  __fsetlocking (stderr, FSETLOCKING_BYCALLER);
166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Set locale.  */
168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  setlocale (LC_ALL, "");
169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Make sure the message catalog can be found.  */
171b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  bindtextdomain (PACKAGE_TARNAME, LOCALEDIR);
172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Initialize the message catalog.  */
174b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  textdomain (PACKAGE_TARNAME);
175b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
176b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Parse and process arguments.  */
177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
179b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Tell the library which version we are expecting.  */
181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  elf_version (EV_CURRENT);
182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (remaining == argc)
184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /* The user didn't specify a name so we use a.out.  */
185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    result = process_file ("a.out");
186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
187b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /* Process all the remaining files.  */
188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    do
189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result |= process_file (argv[remaining]);
190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    while (++remaining < argc);
191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Print the total sizes but only if the output format is BSD and at
193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     least one file has been correctly read (i.e., we recognized the
194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     class).  */
195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (totals && format == format_bsd && totals_class != 0)
196b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    show_bsd_totals ();
197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return result;
199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Print the version information.  */
203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
204b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperprint_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
206b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  fprintf (stream, "size (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  fprintf (stream, gettext ("\
208b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperCopyright (C) %s Red Hat, Inc.\n\
209b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperThis is free software; see the source for copying conditions.  There is NO\n\
210b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
2113a64a3087f53ab860c7de04da0e53dabef459520Ulrich Drepper"), "2012");
212b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
213b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Handle program arguments.  */
217b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic error_t
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperparse_opt (int key, char *arg,
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	   struct argp_state *state __attribute__ ((unused)))
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  switch (key)
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'd':
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      radix = radix_decimal;
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'f':
228b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      format = format_sysv_one_line;
229b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
231b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'o':
232b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      radix = radix_octal;
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
234b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'x':
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      radix = radix_hex;
237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'A':
240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      format = format_sysv;
241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
243b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'B':
244b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      format = format_bsd;
245b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
246b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
247b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 'F':
248b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      format = format_segments;
249b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
250b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
251b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case OPT_FORMAT:
252b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (strcmp (arg, "bsd") == 0 || strcmp (arg, "berkeley") == 0)
253b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	format = format_bsd;
2547690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      else if (likely (strcmp (arg, "sysv") == 0))
255b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	format = format_sysv;
256b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
257b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	error (EXIT_FAILURE, 0, gettext ("Invalid format: %s"), arg);
258b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
259b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case OPT_RADIX:
261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (strcmp (arg, "x") == 0 || strcmp (arg, "16") == 0)
262b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	radix = radix_hex;
263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (strcmp (arg, "d") == 0 || strcmp (arg, "10") == 0)
264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	radix = radix_decimal;
265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (strcmp (arg, "o") == 0 || strcmp (arg, "8") == 0)
266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	radix = radix_octal;
267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	error (EXIT_FAILURE, 0, gettext ("Invalid radix: %s"), arg);
269b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
270b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    case 't':
272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      totals = true;
273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      break;
274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
275b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    default:
276b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return ARGP_ERR_UNKNOWN;
277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return 0;
279b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
280b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
281b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
2827690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper/* Open the file and determine the type.  */
283b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic int
284b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperprocess_file (const char *fname)
285b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
2867690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  int fd = open (fname, O_RDONLY);
2877690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  if (unlikely (fd == -1))
288b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
289e3f9b7db6c7361579ec5cc5eb5e414f7e93baeb6Ulrich Drepper      error (0, errno, gettext ("cannot open '%s'"), fname);
290b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return 1;
291b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
292b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
293b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Now get the ELF descriptor.  */
2947690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
2957690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  if (likely (elf != NULL))
296b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
297b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (elf_kind (elf) == ELF_K_ELF)
298b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
299b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  handle_elf (elf, NULL, fname);
300b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
3017690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper	  if (unlikely (elf_end (elf) != 0))
302b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	    INTERNAL_ERROR (fname);
303b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
3047690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper	  if (unlikely (close (fd) != 0))
305d112ef86686e4f47aad5b30ee38b4618a2bea611Ulrich Drepper	    error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
306b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
307b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  return 0;
308b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
3097690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      else if (likely (elf_kind (elf) == ELF_K_AR))
310ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	{
311ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	  int result = handle_ar (fd, elf, NULL, fname);
312ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper
313ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	  if (unlikely  (close (fd) != 0))
314ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	    error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
315ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper
316ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	  return result;
317ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper	}
318b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
319b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* We cannot handle this type.  Close the descriptor anyway.  */
3207690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      if (unlikely (elf_end (elf) != 0))
321b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	INTERNAL_ERROR (fname);
322b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
323b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
324ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper  if (unlikely (close (fd) != 0))
325ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper    error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
326ccccab08d66be13fe9ff5ca07f46709c069b45a2Ulrich Drepper
327b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  error (0, 0, gettext ("%s: file format not recognized"), fname);
328b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
329b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return 1;
330b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
331b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
332b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
333b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Print the BSD-style header.  This is done exactly once.  */
334b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
335b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperprint_header (Elf *elf)
336b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
337b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  static int done;
338b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
339b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (! done)
340b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
341b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      int ddigits = length_map[gelf_getclass (elf) - 1][radix_decimal];
342b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      int xdigits = length_map[gelf_getclass (elf) - 1][radix_hex];
343b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
344b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s %*s %*s %*s %*s %s\n",
345b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      ddigits - 2, sgettext ("bsd|text"),
346b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      ddigits - 2, sgettext ("bsd|data"),
347b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      ddigits - 2, sgettext ("bsd|bss"),
348b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      ddigits - 2, sgettext ("bsd|dec"),
349b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      xdigits - 2, sgettext ("bsd|hex"),
350b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      sgettext ("bsd|filename"));
351b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
352b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      done = 1;
353b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
354b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
355b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
356b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
357b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic int
358b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperhandle_ar (int fd, Elf *elf, const char *prefix, const char *fname)
359b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
360b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t prefix_len = prefix == NULL ? 0 : strlen (prefix);
361b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t fname_len = strlen (fname) + 1;
362b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char new_prefix[prefix_len + 1 + fname_len];
363b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char *cp = new_prefix;
364b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
365b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Create the full name of the file.  */
366b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (prefix != NULL)
367b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
368b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      cp = mempcpy (cp, prefix, prefix_len);
369b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      *cp++ = ':';
370b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
371b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  memcpy (cp, fname, fname_len);
372b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
373b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Process all the files contained in the archive.  */
3747690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  int result = 0;
3757690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf *subelf;
3767690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf_Cmd cmd = ELF_C_READ_MMAP;
377b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
378b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
379b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* The the header for this element.  */
380b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Elf_Arhdr *arhdr = elf_getarhdr (subelf);
381b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
382b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (elf_kind (subelf) == ELF_K_ELF)
383b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	handle_elf (subelf, new_prefix, arhdr->ar_name);
3847690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      else if (likely (elf_kind (subelf) == ELF_K_AR))
385b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	result |= handle_ar (fd, subelf, new_prefix, arhdr->ar_name);
386b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* else signal error??? */
387b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
388b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* Get next archive element.  */
389b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      cmd = elf_next (subelf);
3907690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      if (unlikely (elf_end (subelf) != 0))
391b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	INTERNAL_ERROR (fname);
392b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
393b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
3947690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  if (unlikely (elf_end (elf) != 0))
395b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    INTERNAL_ERROR (fname);
396b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
397b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return result;
398b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
399b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
400b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
401b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show sizes in SysV format.  */
402b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
403b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppershow_sysv (Elf *elf, const char *prefix, const char *fname,
404b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	   const char *fullname)
405b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
406b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int maxlen = 10;
4077690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  const int digits = length_map[gelf_getclass (elf) - 1][radix];
408b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
409b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Get the section header string table index.  */
4107690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  size_t shstrndx;
411f189493154d0041deced00e6a99cc5426dc9d260Ulrich Drepper  if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0))
412b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    error (EXIT_FAILURE, 0,
413b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	   gettext ("cannot get section header string table index"));
414b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
415b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* First round over the sections: determine the longest section name.  */
4167690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf_Scn *scn = NULL;
417b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  while ((scn = elf_nextscn (elf, scn)) != NULL)
418b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
4197690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      GElf_Shdr shdr_mem;
420b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
421b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
422b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr == NULL)
423b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	INTERNAL_ERROR (fullname);
424b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
425b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* Ignore all sections which are not used at runtime.  */
4265c1a45c2d370e7fd1149fa74a9382e202fbfe8feMark Wielaard      const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
4275c1a45c2d370e7fd1149fa74a9382e202fbfe8feMark Wielaard      if (name != NULL && (shdr->sh_flags & SHF_ALLOC) != 0)
4285c1a45c2d370e7fd1149fa74a9382e202fbfe8feMark Wielaard	maxlen = MAX (maxlen, (int) strlen (name));
429b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
430b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
431b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  fputs_unlocked (fname, stdout);
432b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (prefix != NULL)
433b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (gettext (" (ex %s)"), prefix);
434b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf (":\n%-*s %*s %*s\n",
435b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  maxlen, sgettext ("sysv|section"),
436b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  digits - 2, sgettext ("sysv|size"),
437b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  digits, sgettext ("sysv|addr"));
438b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
439b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Iterate over all sections.  */
4407690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  GElf_Off total = 0;
441b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  while ((scn = elf_nextscn (elf, scn)) != NULL)
442b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
4437690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      GElf_Shdr shdr_mem;
444b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
445b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
446b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* Ignore all sections which are not used at runtime.  */
447b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((shdr->sh_flags & SHF_ALLOC) != 0)
448b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
449f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard	  printf ((radix == radix_hex
450f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard		   ? "%-*s %*" PRIx64 " %*" PRIx64 "\n"
451f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard		   : (radix == radix_decimal
452f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard		      ? "%-*s %*" PRId64 " %*" PRId64 "\n"
453f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard		      : "%-*s %*" PRIo64 " %*" PRIo64 "\n")),
454b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  maxlen, elf_strptr (elf, shstrndx, shdr->sh_name),
455b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  digits - 2, shdr->sh_size,
456b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  digits, shdr->sh_addr);
457b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
458b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  total += shdr->sh_size;
459b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
460b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
461b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
462b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (radix == radix_hex)
463b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf ("%-*s %*" PRIx64 "\n\n\n", maxlen, sgettext ("sysv|Total"),
464b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	    digits - 2, total);
465b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (radix == radix_decimal)
466b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf ("%-*s %*" PRId64 "\n\n\n", maxlen, sgettext ("sysv|Total"),
467b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	    digits - 2, total);
468b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
469b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf ("%-*s %*" PRIo64 "\n\n\n", maxlen, sgettext ("sysv|Total"),
470b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	    digits - 2, total);
471b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
472b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
473b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
474b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show sizes in SysV format in one line.  */
475b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
476b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppershow_sysv_one_line (Elf *elf)
477b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
478b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Get the section header string table index.  */
4797690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  size_t shstrndx;
480f189493154d0041deced00e6a99cc5426dc9d260Ulrich Drepper  if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0))
481b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    error (EXIT_FAILURE, 0,
482b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	   gettext ("cannot get section header string table index"));
483b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
484b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Iterate over all sections.  */
4857690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  GElf_Off total = 0;
4867690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  bool first = true;
4877690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf_Scn *scn = NULL;
488b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  while ((scn = elf_nextscn (elf, scn)) != NULL)
489b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
4907690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      GElf_Shdr shdr_mem;
491b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
492b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
493b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* Ignore all sections which are not used at runtime.  */
494b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((shdr->sh_flags & SHF_ALLOC) == 0)
495b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	continue;
496b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
497b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (! first)
498b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	fputs_unlocked (" + ", stdout);
4997690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      first = false;
500b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
501f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard      printf ((radix == radix_hex ? "%" PRIx64 "(%s)"
502f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard	       : (radix == radix_decimal ? "%" PRId64 "(%s)"
503f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard		  : "%" PRIo64 "(%s)")),
504f48eb6b15fee66e54b488d71738979fc608f25eeMark Wielaard	      shdr->sh_size, elf_strptr (elf, shstrndx, shdr->sh_name));
505b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
506b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      total += shdr->sh_size;
507b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
508b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
509b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (radix == radix_hex)
510b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %#" PRIx64 "\n", total);
511b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (radix == radix_decimal)
512b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %" PRId64 "\n", total);
513b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
514b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %" PRIo64 "\n", total);
515b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
516b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
517b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
518b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Variables to add up the sizes of all files.  */
519b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic uintmax_t total_textsize;
520b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic uintmax_t total_datasize;
521b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic uintmax_t total_bsssize;
522b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
523b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
524b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show sizes in BSD format.  */
525b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
526b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppershow_bsd (Elf *elf, const char *prefix, const char *fname,
527b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  const char *fullname)
528b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
529b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Off textsize = 0;
530b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Off datasize = 0;
531b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Off bsssize = 0;
5327690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  const int ddigits = length_map[gelf_getclass (elf) - 1][radix_decimal];
5337690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  const int xdigits = length_map[gelf_getclass (elf) - 1][radix_hex];
534b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
535b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Iterate over all sections.  */
5367690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  Elf_Scn *scn = NULL;
537b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  while ((scn = elf_nextscn (elf, scn)) != NULL)
538b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
5397690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      GElf_Shdr shdr_mem;
540b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
541b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
542b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr == NULL)
543b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	INTERNAL_ERROR (fullname);
544b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
545b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* Ignore all sections which are not marked as loaded.  */
546b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((shdr->sh_flags & SHF_ALLOC) == 0)
547b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	continue;
548b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
549b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((shdr->sh_flags & SHF_WRITE) == 0)
550b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	textsize += shdr->sh_size;
551b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (shdr->sh_type == SHT_NOBITS)
552b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	bsssize += shdr->sh_size;
553b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
554b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	datasize += shdr->sh_size;
555b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
556b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
557b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*" PRId64 " %*" PRId64 " %*" PRId64 " %*" PRId64 " %*"
558b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  PRIx64 " %s",
559b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, textsize,
560b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, datasize,
561b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, bsssize,
562b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, textsize + datasize + bsssize,
563b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  xdigits - 2, textsize + datasize + bsssize,
564b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  fname);
565b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (prefix != NULL)
566b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (gettext (" (ex %s)"), prefix);
567b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  fputs_unlocked ("\n", stdout);
568b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
569b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  total_textsize += textsize;
570b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  total_datasize += datasize;
571b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  total_bsssize += bsssize;
572b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
573b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  totals_class = MAX (totals_class, gelf_getclass (elf));
574b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
575b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
576b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
577b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show total size.  */
578b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
579b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppershow_bsd_totals (void)
580b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
581b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int ddigits = length_map[totals_class - 1][radix_decimal];
582b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int xdigits = length_map[totals_class - 1][radix_hex];
583b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
584b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*" PRIuMAX " %*" PRIuMAX " %*" PRIuMAX " %*" PRIuMAX " %*"
585b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  PRIxMAX " %s",
586b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, total_textsize,
587b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, total_datasize,
588b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, total_bsssize,
589b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  ddigits - 2, total_textsize + total_datasize + total_bsssize,
590b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  xdigits - 2, total_textsize + total_datasize + total_bsssize,
591b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  gettext ("(TOTALS)\n"));
592b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
593b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
594b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
595b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Show size and permission of loadable segments.  */
596b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
597b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppershow_segments (Elf *elf, const char *fullname)
598b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
599712c8faddc08844fb1f2814c8b6e817f03b0698eMark Wielaard  size_t phnum;
600712c8faddc08844fb1f2814c8b6e817f03b0698eMark Wielaard  if (elf_getphdrnum (elf, &phnum) != 0)
601b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    INTERNAL_ERROR (fullname);
602b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
6037690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  GElf_Off total = 0;
6047690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper  bool first = true;
605712c8faddc08844fb1f2814c8b6e817f03b0698eMark Wielaard  for (size_t cnt = 0; cnt < phnum; ++cnt)
606b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
607b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Phdr phdr_mem;
608b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Phdr *phdr;
609b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
610b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      phdr = gelf_getphdr (elf, cnt, &phdr_mem);
611b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (phdr == NULL)
612b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	INTERNAL_ERROR (fullname);
613b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
614b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (phdr->p_type != PT_LOAD)
615b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	/* Only load segments.  */
616b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	continue;
617b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
618b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (! first)
619b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	fputs_unlocked (" + ", stdout);
6207690fe2db71092a07d2c76169303d72ca4d9518cUlrich Drepper      first = false;
621b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
622b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf (radix == radix_hex ? "%" PRIx64 "(%c%c%c)"
623b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      : (radix == radix_decimal ? "%" PRId64 "(%c%c%c)"
624b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 : "%" PRIo64 "(%c%c%c)"),
625b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      phdr->p_memsz,
626b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      (phdr->p_flags & PF_R) == 0 ? '-' : 'r',
627b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      (phdr->p_flags & PF_W) == 0 ? '-' : 'w',
628b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      (phdr->p_flags & PF_X) == 0 ? '-' : 'x');
629b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
630b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      total += phdr->p_memsz;
631b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
632b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
633b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (radix == radix_hex)
634b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %#" PRIx64 "\n", total);
635b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (radix == radix_decimal)
636b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %" PRId64 "\n", total);
637b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
638b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    printf (" = %" PRIo64 "\n", total);
639b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
640b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
641b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
642b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic void
643b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperhandle_elf (Elf *elf, const char *prefix, const char *fname)
644b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
645b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t prefix_len = prefix == NULL ? 0 : strlen (prefix);
646b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t fname_len = strlen (fname) + 1;
647b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char fullname[prefix_len + 1 + fname_len];
648b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char *cp = fullname;
649b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
650b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Create the full name of the file.  */
651b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (prefix != NULL)
652b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
653b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      cp = mempcpy (cp, prefix, prefix_len);
654b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      *cp++ = ':';
655b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
656b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  memcpy (cp, fname, fname_len);
657b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
658b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (format == format_sysv)
659b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    show_sysv (elf, prefix, fname, fullname);
660b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (format == format_sysv_one_line)
661b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    show_sysv_one_line (elf);
662b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (format == format_segments)
663b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    show_segments (elf, fullname);
664b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
665b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
666b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      print_header (elf);
667b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
668b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      show_bsd (elf, prefix, fname, fullname);
669b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
670b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
6713cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6723cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6733cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper#include "debugpred.h"
674