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