18a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Print information from ELF file in human-readable form.
2587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard   Copyright (C) 2005, 2006, 2007, 2009, 2011, 2012, 2014, 2015 Red Hat, Inc.
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
48a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 2005.
58a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich 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.
108a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich 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.
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
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/>.  */
188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#ifdef HAVE_CONFIG_H
208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper# include <config.h>
218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#endif
228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <argp.h>
248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <error.h>
258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <fcntl.h>
268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <inttypes.h>
278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <libintl.h>
288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <locale.h>
298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <stdbool.h>
308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <stdio.h>
318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <stdio_ext.h>
328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <stdlib.h>
338a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <string.h>
348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <unistd.h>
358a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <sys/param.h>
368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include <system.h>
388a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#include "../libebl/libeblP.h"
398a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Name and version of program.  */
428a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic void print_version (FILE *stream, struct argp_state *state);
43fdc93e12a77866cafd1aae4463d89cef2c01d9b1Ulrich DrepperARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
458a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Bug report address.  */
46fdc93e12a77866cafd1aae4463d89cef2c01d9b1Ulrich DrepperARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
488a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
498a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Definitions of arguments for argp functions.  */
508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic const struct argp_option options[] =
518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
528a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { NULL, 0, NULL, 0, N_("Mode selection:"), 0 },
538a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { "reloc", 'r', NULL, 0, N_("Display relocation information."), 0 },
548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { "full-contents", 's', NULL, 0,
558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    N_("Display the full contents of all sections requested"), 0 },
568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { "disassemble", 'd', NULL, 0,
578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    N_("Display assembler code of executable sections"), 0 },
588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
59c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  { NULL, 0, NULL, 0, N_("Output content selection:"), 0 },
608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { "section", 'j', "NAME", 0,
618a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    N_("Only display information for section NAME."), 0 },
628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  { NULL, 0, NULL, 0, NULL, 0 }
648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper};
658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Short description of program.  */
678a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic const char doc[] = N_("\
688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich DrepperShow information from FILEs (a.out by default).");
698a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Strings for arguments in help texts.  */
718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic const char args_doc[] = N_("[FILE...]");
728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Prototype for option handler.  */
748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic error_t parse_opt (int key, char *arg, struct argp_state *state);
758a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
76c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper/* Parser children.  */
77c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepperstatic struct argp_child argp_children[] =
78c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  {
79c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    { &color_argp, 0, N_("Output formatting"), 2 },
80c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    { NULL, 0, NULL, 0}
81c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  };
82c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Data structure to communicate with argp functions.  */
84c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepperstatic const struct argp argp =
858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
86c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  options, parse_opt, args_doc, doc, argp_children, NULL, NULL
878a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper};
888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Print symbols in file named FNAME.  */
918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int process_file (const char *fname, bool more_than_one);
928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Handle content of archive.  */
948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int handle_ar (int fd, Elf *elf, const char *prefix, const char *fname,
958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		      const char *suffix);
968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Handle ELF file.  */
988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int handle_elf (Elf *elf, const char *prefix, const char *fname,
998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		       const char *suffix);
1008a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper#define INTERNAL_ERROR(fname) \
103587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard  error (EXIT_FAILURE, 0, gettext ("%s: INTERNAL ERROR %d (%s): %s"),      \
104587c4b3e94c6ef877137d067d5d0f574f69b1391Mark Wielaard	 fname, __LINE__, PACKAGE_VERSION, elf_errmsg (-1))
1058a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1068a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1078a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* List of sections which should be used.  */
1088a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic struct section_list
1098a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
1108a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  bool is_name;
1118a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  union
1128a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  {
1138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    const char *name;
1148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    uint32_t scnndx;
1158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  };
1168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  struct section_list *next;
1178a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper} *section_list;
1188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* If true print archive index.  */
1218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic bool print_relocs;
1228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* If true print full contents of requested sections.  */
1248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic bool print_full_content;
1258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* If true print disassembled output..  */
1278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic bool print_disasm;
1288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
129c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
1308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperint
1318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppermain (int argc, char *argv[])
1328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
1338a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* We use no threads here which can interfere with handling a stream.  */
1348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) __fsetlocking (stdin, FSETLOCKING_BYCALLER);
1358a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);
1368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) __fsetlocking (stderr, FSETLOCKING_BYCALLER);
1378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1388a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Set locale.  */
1398a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) setlocale (LC_ALL, "");
1408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Make sure the message catalog can be found.  */
142b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  (void) bindtextdomain (PACKAGE_TARNAME, LOCALEDIR);
1438a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Initialize the message catalog.  */
145b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  (void) textdomain (PACKAGE_TARNAME);
1468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Parse and process arguments.  */
1488a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int remaining;
1498a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) argp_parse (&argp, argc, argv, 0, &remaining, NULL);
1508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Tell the library which version we are expecting.  */
1528a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  (void) elf_version (EV_CURRENT);
1538a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int result = 0;
1558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (remaining == argc)
1568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    /* The user didn't specify a name so we use a.out.  */
1578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    result = process_file ("a.out", false);
1588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  else
1598a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
1608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      /* Process all the remaining files.  */
1618a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      const bool more_than_one = remaining + 1 < argc;
1628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      do
1648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	result |= process_file (argv[remaining], more_than_one);
1658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      while (++remaining < argc);
1668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
1678a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return result;
1698a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
1708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Print the version information.  */
1738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic void
1748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperprint_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
1758a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
176b0243863149acde9e42b25688c7c2959830e69a9Ulrich Drepper  fprintf (stream, "objdump (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
1778a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  fprintf (stream, gettext ("\
1788a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich DrepperCopyright (C) %s Red Hat, Inc.\n\
1798a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich DrepperThis is free software; see the source for copying conditions.  There is NO\n\
1808a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
1813a64a3087f53ab860c7de04da0e53dabef459520Ulrich Drepper"), "2012");
1828a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
1838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
1848a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1868a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Handle program arguments.  */
1878a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic error_t
1888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperparse_opt (int key, char *arg,
1898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	   struct argp_state *state __attribute__ ((unused)))
1908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
1918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* True if any of the control options is set.  */
1928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  static bool any_control_option;
1938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
1948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  switch (key)
1958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
1968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    case 'j':
1978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      {
1988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	struct section_list *newp = xmalloc (sizeof (*newp));
1998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	char *endp;
2008a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	newp->scnndx = strtoul (arg, &endp, 0);
2018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	if (*endp == 0)
2028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  newp->is_name = false;
2038a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	else
2048a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  {
2058a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    newp->name = arg;
2068a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    newp->is_name = true;
2078a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  }
2088a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	newp->next = section_list;
2098a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	section_list = newp;
2108a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      }
2118a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      any_control_option = true;
2128a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      break;
2138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    case 'd':
2158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      print_disasm = true;
2168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      any_control_option = true;
2178a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      break;
2188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    case 'r':
2208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      print_relocs = true;
2218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      any_control_option = true;
2228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      break;
2238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    case 's':
2258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      print_full_content = true;
2268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      any_control_option = true;
2278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      break;
2288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    case ARGP_KEY_FINI:
2308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (! any_control_option)
2318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
2328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  fputs (gettext ("No operation specified.\n"), stderr);
2335ee720c60a298352b52513d03ede85814ab63ad5Ulrich Drepper	  argp_help (&argp, stderr, ARGP_HELP_SEE,
2348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		     program_invocation_short_name);
2355ee720c60a298352b52513d03ede85814ab63ad5Ulrich Drepper	  exit (EXIT_FAILURE);
2368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
2378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2388a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    default:
2398a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      return ARGP_ERR_UNKNOWN;
2408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
2418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return 0;
2428a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
2438a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2458a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper/* Open the file and determine the type.  */
2468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
2478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperprocess_file (const char *fname, bool more_than_one)
2488a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
2498a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Open the file.  */
2508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int fd = open (fname, O_RDONLY);
2518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (fd == -1)
2528a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
2538a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      error (0, errno, gettext ("cannot open %s"), fname);
2548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      return 1;
2558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
2568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Now get the ELF descriptor.  */
2588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
2598a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (elf != NULL)
2608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
2618a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (elf_kind (elf) == ELF_K_ELF)
2628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
2638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  int result = handle_elf (elf, more_than_one ? "" : NULL,
2648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper				   fname, NULL);
2658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (elf_end (elf) != 0)
2678a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    INTERNAL_ERROR (fname);
2688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2698a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (close (fd) != 0)
2708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    error (EXIT_FAILURE, errno, gettext ("while close `%s'"), fname);
2718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  return result;
2738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
2748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      else if (elf_kind (elf) == ELF_K_AR)
2758a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
2768a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  int result = handle_ar (fd, elf, NULL, fname, NULL);
2778a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2788a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (elf_end (elf) != 0)
2798a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    INTERNAL_ERROR (fname);
2808a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2818a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (close (fd) != 0)
2828a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    error (EXIT_FAILURE, errno, gettext ("while close `%s'"), fname);
2838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2848a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  return result;
2858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
2868a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2878a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      /* We cannot handle this type.  Close the descriptor anyway.  */
2888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (elf_end (elf) != 0)
2898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	INTERNAL_ERROR (fname);
2908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
2918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  error (0, 0, gettext ("%s: File format not recognized"), fname);
2938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return 1;
2958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
2968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
2988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
2998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperhandle_ar (int fd, Elf *elf, const char *prefix, const char *fname,
3008a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	   const char *suffix)
3018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
3028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t fname_len = strlen (fname) + 1;
3038a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t prefix_len = prefix != NULL ? strlen (prefix) : 0;
3048a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  char new_prefix[prefix_len + fname_len + 2];
3058a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t suffix_len = suffix != NULL ? strlen (suffix) : 0;
3068a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  char new_suffix[suffix_len + 2];
3078a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Elf *subelf;
3088a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Elf_Cmd cmd = ELF_C_READ_MMAP;
3098a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int result = 0;
3108a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3118a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  char *cp = new_prefix;
3128a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (prefix != NULL)
3138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    cp = stpcpy (cp, prefix);
3148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  cp = stpcpy (cp, fname);
3158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  stpcpy (cp, "[");
3168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3178a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  cp = new_suffix;
3188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (suffix != NULL)
3198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    cp = stpcpy (cp, suffix);
3208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  stpcpy (cp, "]");
3218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Process all the files contained in the archive.  */
3238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
3248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
3258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      /* The the header for this element.  */
3268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      Elf_Arhdr *arhdr = elf_getarhdr (subelf);
3278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      /* Skip over the index entries.  */
3298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (strcmp (arhdr->ar_name, "/") != 0
3308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  && strcmp (arhdr->ar_name, "//") != 0)
3318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
3328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (elf_kind (subelf) == ELF_K_ELF)
3338a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    result |= handle_elf (subelf, new_prefix, arhdr->ar_name,
3348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper				  new_suffix);
3358a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  else if (elf_kind (subelf) == ELF_K_AR)
3368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    result |= handle_ar (fd, subelf, new_prefix, arhdr->ar_name,
3378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper				 new_suffix);
3388a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  else
3398a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    {
3408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      error (0, 0, gettext ("%s%s%s: file format not recognized"),
3418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		     new_prefix, arhdr->ar_name, new_suffix);
3428a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      result = 1;
3438a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    }
3448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
3458a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      /* Get next archive element.  */
3478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      cmd = elf_next (subelf);
3488a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (elf_end (subelf) != 0)
3498a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	INTERNAL_ERROR (fname);
3508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
3518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3528a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return result;
3538a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
3548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
3568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic void
35795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Dreppershow_relocs_x (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *symdata,
35895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	       Elf_Data *xndxdata, size_t symstrndx, size_t shstrndx,
35995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	       GElf_Addr r_offset, GElf_Xword r_info, GElf_Sxword r_addend)
36095fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper{
36195fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  int elfclass = gelf_getclass (ebl->elf);
36295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  char buf[128];
36395fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
36495fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  printf ("%0*" PRIx64 " %-20s ",
36595fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	  elfclass == ELFCLASS32 ? 8 : 16, r_offset,
36695fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	  ebl_reloc_type_name (ebl, GELF_R_TYPE (r_info), buf, sizeof (buf)));
36795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
36851b3f473b60bfface7ca37912ebc2858d1970cd9Ulrich Drepper  Elf32_Word xndx;
36951b3f473b60bfface7ca37912ebc2858d1970cd9Ulrich Drepper  GElf_Sym symmem;
37051b3f473b60bfface7ca37912ebc2858d1970cd9Ulrich Drepper  GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (r_info),
37151b3f473b60bfface7ca37912ebc2858d1970cd9Ulrich Drepper				    &symmem, &xndx);
37295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
37395fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  if (sym == NULL)
37495fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    printf ("<%s %ld>",
37595fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	    gettext ("INVALID SYMBOL"), (long int) GELF_R_SYM (r_info));
37695fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
37795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    printf ("%s",
37895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	    elf_strptr (ebl->elf, symstrndx, sym->st_name));
37995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  else
38095fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    {
38195fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      GElf_Shdr destshdr_mem;
38295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      GElf_Shdr *destshdr;
38395fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      destshdr = gelf_getshdr (elf_getscn (ebl->elf,
38495fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper					   sym->st_shndx == SHN_XINDEX
38595fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper					   ? xndx : sym->st_shndx),
38695fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper			       &destshdr_mem);
38795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
388d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard      if (shdr == NULL || destshdr == NULL)
38995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	printf ("<%s %ld>",
39095fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper		gettext ("INVALID SECTION"),
39195fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper		(long int) (sym->st_shndx == SHN_XINDEX
39295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper			    ? xndx : sym->st_shndx));
39395fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      else
39495fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	printf ("%s",
39595fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper		elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
39695fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    }
39795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
39895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  if (r_addend != 0)
39995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    {
40095fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      char sign = '+';
40195fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      if (r_addend < 0)
40295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	{
40395fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	  sign = '-';
40495fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	  r_addend = -r_addend;
40595fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	}
40695fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper      printf ("%c%#" PRIx64, sign, r_addend);
40795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper    }
40895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper  putchar ('\n');
40995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper}
41095fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
41195fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper
41295fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepperstatic void
4138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppershow_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
4148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		 Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
4158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		 size_t shstrndx)
4168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
417d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
418d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard  int nentries = shdr->sh_size / sh_entsize;
4198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  for (int cnt = 0; cnt < nentries; ++cnt)
4218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
4228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Rel relmem;
4238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Rel *rel;
4248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      rel = gelf_getrel (data, cnt, &relmem);
4268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (rel != NULL)
42795fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
42895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper		       rel->r_offset, rel->r_info, 0);
4298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
4308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
4318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4338a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic void
4348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppershow_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
4358a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
4368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  size_t shstrndx)
4378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
438d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
439d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard  int nentries = shdr->sh_size / sh_entsize;
4408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  for (int cnt = 0; cnt < nentries; ++cnt)
4428a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
4438a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Rela relmem;
4448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Rela *rel;
4458a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      rel = gelf_getrela (data, cnt, &relmem);
4478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (rel != NULL)
44895fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper	show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
44995fa15e7b3af7321dc70dc453eb9cb0596b5a817Ulrich Drepper		       rel->r_offset, rel->r_info, rel->r_addend);
4508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
4518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
4528a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4538a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic bool
4558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppersection_match (Elf *elf, uint32_t scnndx, GElf_Shdr *shdr, size_t shstrndx)
4568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
4578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (section_list == NULL)
4588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    return true;
4598a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  struct section_list *runp = section_list;
4615c1a45c2d370e7fd1149fa74a9382e202fbfe8feMark Wielaard  const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
4628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  do
4648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
4658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (runp->is_name)
4668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
4675c1a45c2d370e7fd1149fa74a9382e202fbfe8feMark Wielaard	  if (name && strcmp (runp->name, name) == 0)
4688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    return true;
4698a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
4708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      else
4718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
4728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (runp->scnndx == scnndx)
4738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    return true;
4748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
4758a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4768a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      runp = runp->next;
4778a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
4788a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  while (runp != NULL);
4798a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4808a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return false;
4818a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
4828a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4848a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
4858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppershow_relocs (Ebl *ebl, const char *fname, uint32_t shstrndx)
4868a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
4878a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int elfclass = gelf_getclass (ebl->elf);
4888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Elf_Scn *scn = NULL;
4908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
4918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
4928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Shdr shdr_mem;
4938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
4948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (shdr == NULL)
4968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	INTERNAL_ERROR (fname);
4978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
4988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (shdr->sh_type == SHT_REL || shdr->sh_type == SHT_RELA)
4998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
500c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  if  (! section_match (ebl->elf, elf_ndxscn (scn), shdr, shstrndx))
5018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    continue;
5028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5038a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  GElf_Shdr destshdr_mem;
5048a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf,
5058a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper							  shdr->sh_info),
5068a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper					      &destshdr_mem);
507d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard	  if (unlikely (destshdr == NULL))
508d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard	    continue;
5098a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
510f44f0ce23904ad047a4138474b6ad99afdcd7916Ulrich Drepper	  printf (gettext ("\nRELOCATION RECORDS FOR [%s]:\n"
5118a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			   "%-*s TYPE                 VALUE\n"),
5128a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
5138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  elfclass == ELFCLASS32 ? 8 : 16, gettext ("OFFSET"));
5148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  /* Get the data of the section.  */
5168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Data *data = elf_getdata (scn, NULL);
5178a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (data == NULL)
5188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    continue;
5198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  /* Get the symbol table information.  */
5218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
5228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  GElf_Shdr symshdr_mem;
5238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
5248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Data *symdata = elf_getdata (symscn, NULL);
525d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard	  if (unlikely (symshdr == NULL || symdata == NULL))
526d0070a982cfddbff9c3f744b518b4cde539e5e65Mark Wielaard	    continue;
5278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  /* Search for the optional extended section index table.  */
5298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Data *xndxdata = NULL;
5308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Scn *xndxscn = NULL;
5318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  while ((xndxscn = elf_nextscn (ebl->elf, xndxscn)) != NULL)
5328a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    {
5338a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      GElf_Shdr xndxshdr_mem;
5348a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      GElf_Shdr *xndxshdr;
5358a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5368a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      xndxshdr = gelf_getshdr (xndxscn, &xndxshdr_mem);
5378a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      if (xndxshdr != NULL && xndxshdr->sh_type == SHT_SYMTAB_SHNDX
5388a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  && xndxshdr->sh_link == elf_ndxscn (symscn))
5398a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		{
5408a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  /* Found it.  */
5418a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  xndxdata = elf_getdata (xndxscn, NULL);
5428a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  break;
5438a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		}
5448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    }
5458a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (shdr->sh_type == SHT_REL)
5478a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    show_relocs_rel (ebl, shdr, data, symdata, xndxdata,
5488a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			     symshdr->sh_link, shstrndx);
5498a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  else
5508a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    show_relocs_rela (ebl, shdr, data, symdata, xndxdata,
5518a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			      symshdr->sh_link, shstrndx);
552f44f0ce23904ad047a4138474b6ad99afdcd7916Ulrich Drepper
55351b3f473b60bfface7ca37912ebc2858d1970cd9Ulrich Drepper	  putchar ('\n');
5548a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
5558a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
5568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return 0;
5588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
5598a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5618a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
5628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Dreppershow_full_content (Ebl *ebl, const char *fname, uint32_t shstrndx)
5638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
5648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Elf_Scn *scn = NULL;
5658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
5668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    {
5678a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Shdr shdr_mem;
5688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
5698a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (shdr == NULL)
5718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	INTERNAL_ERROR (fname);
5728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper      if (shdr->sh_type == SHT_PROGBITS && shdr->sh_size > 0)
5748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	{
575c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  if  (! section_match (ebl->elf, elf_ndxscn (scn), shdr, shstrndx))
5768a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    continue;
5778a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5788a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  printf (gettext ("Contents of section %s:\n"),
5798a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		  elf_strptr (ebl->elf, shstrndx, shdr->sh_name));
5808a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5818a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  /* Get the data of the section.  */
5828a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  Elf_Data *data = elf_getdata (scn, NULL);
5838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  if (data == NULL)
5848a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    continue;
5858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5868a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  unsigned char *cp = data->d_buf;
5878a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  size_t cnt;
5888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  for (cnt = 0; cnt + 16 < data->d_size; cp += 16, cnt += 16)
5898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    {
5908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      printf (" %04zx ", cnt);
5918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      for (size_t inner = 0; inner < 16; inner += 4)
5938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		printf ("%02hhx%02hhx%02hhx%02hhx ",
5948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			cp[inner], cp[inner + 1], cp[inner + 2],
5958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			cp[inner + 3]);
5968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      fputc_unlocked (' ', stdout);
5978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
5988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      for (size_t inner = 0; inner < 16; ++inner)
5998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		fputc_unlocked (isascii (cp[inner]) && isprint (cp[inner])
6008a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper				? cp[inner] : '.', stdout);
6018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	      fputc_unlocked ('\n', stdout);
6028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    }
6038a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6048a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  printf (" %04zx ", cnt);
6058a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6068a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  size_t remaining = data->d_size - cnt;
6078a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  size_t inner;
6088a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  for (inner = 0; inner + 4 <= remaining; inner += 4)
6098a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    printf ("%02hhx%02hhx%02hhx%02hhx ",
6108a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper		    cp[inner], cp[inner + 1], cp[inner + 2], cp[inner + 3]);
6118a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6128a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  for (; inner < remaining; ++inner)
6138a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    printf ("%02hhx", cp[inner]);
6148a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6158a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  for (inner = 2 * (16 - inner) + (16 - inner + 3) / 4 + 1; inner > 0;
6168a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	       --inner)
6178a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    fputc_unlocked (' ', stdout);
6188a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6198a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  for (inner = 0; inner < remaining; ++inner)
6208a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    fputc_unlocked (isascii (cp[inner]) && isprint (cp[inner])
6218a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper			    ? cp[inner] : '.', stdout);
6228a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  fputc_unlocked ('\n', stdout);
6238a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6248a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  fputc_unlocked ('\n', stdout);
6258a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	}
6268a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    }
6278a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6288a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return 0;
6298a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
6308a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6318a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
6323cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepperstruct disasm_info
6333cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper{
6343cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  GElf_Addr addr;
6353cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  const uint8_t *cur;
6363cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  const uint8_t *last_end;
637c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  const char *address_color;
638c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  const char *bytes_color;
6393cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper};
6403cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6413cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6423cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper// XXX This is not the preferred output for all architectures.  Needs
6433cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper// XXX customization, too.
6448a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
6453cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepperdisasm_output (char *buf, size_t buflen, void *arg)
6468a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
6473cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  struct disasm_info *info = (struct disasm_info *) arg;
6483cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
649c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  if (info->address_color != NULL)
650c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    printf ("%s%8" PRIx64 "%s:   ",
651c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    info->address_color, (uint64_t) info->addr, color_off);
652c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  else
653c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    printf ("%8" PRIx64 ":   ", (uint64_t) info->addr);
654c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
655c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  if (info->bytes_color != NULL)
656c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    fputs_unlocked (info->bytes_color, stdout);
6573cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  size_t cnt;
6583cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  for (cnt = 0; cnt < (size_t) MIN (info->cur - info->last_end, 8); ++cnt)
6593cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    printf (" %02" PRIx8, info->last_end[cnt]);
660c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper  if (info->bytes_color != NULL)
661c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper    fputs_unlocked (color_off, stdout);
662c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
6633cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  printf ("%*s %.*s\n",
6643cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  (int) (8 - cnt) * 3 + 1, "", (int) buflen, buf);
6653cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6663cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  info->addr += cnt;
6673cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6683cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  /* We limit the number of bytes printed before the mnemonic to 8.
6693cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper     Print the rest on a separate, following line.  */
6703cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  if (info->cur - info->last_end > 8)
6713cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    {
672c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper      if (info->address_color != NULL)
673c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	printf ("%s%8" PRIx64 "%s:   ",
674c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper		info->address_color, (uint64_t) info->addr, color_off);
675c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper      else
676c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	printf ("%8" PRIx64 ":   ", (uint64_t) info->addr);
677c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
678c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper      if (info->bytes_color != NULL)
679c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	fputs_unlocked (info->bytes_color, stdout);
6803cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      for (; cnt < (size_t) (info->cur - info->last_end); ++cnt)
6813cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	printf (" %02" PRIx8, info->last_end[cnt]);
682c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper      if (info->bytes_color != NULL)
683c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	fputs_unlocked (color_off, stdout);
6843cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      putchar_unlocked ('\n');
6853cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      info->addr += info->cur - info->last_end - 8;
6863cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    }
6873cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6883cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  info->last_end = info->cur;
6893cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6903cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  return 0;
6913cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper}
6923cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6933cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
6943cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepperstatic int
6953cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Dreppershow_disasm (Ebl *ebl, const char *fname, uint32_t shstrndx)
6963cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper{
6973cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  DisasmCtx_t *ctx = disasm_begin (ebl, ebl->elf, NULL /* XXX TODO */);
6983cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  if (ctx == NULL)
6993cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    error (EXIT_FAILURE, 0, gettext ("cannot disassemble"));
7003cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7013cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  Elf_Scn *scn = NULL;
7023cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
7033cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    {
7043cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      GElf_Shdr shdr_mem;
7053cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
7063cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7073cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      if (shdr == NULL)
7083cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	INTERNAL_ERROR (fname);
7093cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7103cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper      if (shdr->sh_type == SHT_PROGBITS && shdr->sh_size > 0
7113cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  && (shdr->sh_flags & SHF_EXECINSTR) != 0)
7123cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	{
713c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  if  (! section_match (ebl->elf, elf_ndxscn (scn), shdr, shstrndx))
7143cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	    continue;
7153cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7163cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  Elf_Data *data = elf_getdata (scn, NULL);
7173cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  if (data == NULL)
7183cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	    continue;
7193cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7203cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  printf ("Disassembly of section %s:\n\n",
7213cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper		  elf_strptr (ebl->elf, shstrndx, shdr->sh_name));
7223cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7233cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  struct disasm_info info;
7243cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  info.addr = shdr->sh_addr;
7253cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  info.last_end = info.cur = data->d_buf;
726c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  char *fmt;
727c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  if (color_mode)
728c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    {
729c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	      info.address_color = color_address;
730c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	      info.bytes_color = color_bytes;
731c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
732c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	      if (asprintf (&fmt, "%s%%7m %s%%.1o,%s%%.2o,%s%%.3o%%34a %s%%l",
733c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper			    color_mnemonic ?: "",
734c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper			    color_operand1 ?: "",
735c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper			    color_operand2 ?: "",
736c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper			    color_operand3 ?: "",
737c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper			    color_label ?: "") < 0)
738c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper		error (EXIT_FAILURE, errno, _("cannot allocate memory"));
739c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    }
740c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  else
741c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    {
742c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	      info.address_color = info.bytes_color = NULL;
743c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
744c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	      fmt = "%7m %.1o,%.2o,%.3o%34a %l";
745c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    }
7463cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7473cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	  disasm_cb (ctx, &info.cur, info.cur + data->d_size, info.addr,
748c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper		     fmt, disasm_output, &info, NULL /* XXX */);
749c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper
750c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	  if (color_mode)
751c6b3d0c27833c8e0936cb6b8973e8578e3a9421fUlrich Drepper	    free (fmt);
7523cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper	}
7533cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper    }
7543cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
7553cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper  (void) disasm_end (ctx);
7568a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7578a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return 0;
7588a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
7598a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7608a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7618a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperstatic int
7628a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepperhandle_elf (Elf *elf, const char *prefix, const char *fname,
7638a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	    const char *suffix)
7648a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper{
7658a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7668a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Get the backend for this object file type.  */
7678a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  Ebl *ebl = ebl_openbackend (elf);
7688a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
769fd47989094090138b0c857d067ac7ff05e7b6d91Ulrich Drepper  printf ("%s: elf%d-%s\n\n",
7708a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  fname, gelf_getclass (elf) == ELFCLASS32 ? 32 : 64,
7718a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	  ebl_backend_name (ebl));
7728a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7738a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Create the full name of the file.  */
7748a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t prefix_len = prefix == NULL ? 0 : strlen (prefix);
7758a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t suffix_len = suffix == NULL ? 0 : strlen (suffix);
7768a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t fname_len = strlen (fname) + 1;
7778a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  char fullname[prefix_len + 1 + fname_len + suffix_len];
7788a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  char *cp = fullname;
7798a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (prefix != NULL)
7808a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    cp = mempcpy (cp, prefix, prefix_len);
7818a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  cp = mempcpy (cp, fname, fname_len);
7828a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (suffix != NULL)
7838a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    memcpy (cp - 1, suffix, suffix_len + 1);
7848a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7858a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Get the section header string table index.  */
7868a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  size_t shstrndx;
787f189493154d0041deced00e6a99cc5426dc9d260Ulrich Drepper  if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
7888a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    error (EXIT_FAILURE, 0,
7898a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper	   gettext ("cannot get section header string table index"));
7908a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7918a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  int result = 0;
7928a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (print_disasm)
7938a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    result = show_disasm (ebl, fullname, shstrndx);
7948a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (print_relocs && !print_disasm)
7958a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    result = show_relocs (ebl, fullname, shstrndx);
7968a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  if (print_full_content)
7978a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper    result = show_full_content (ebl, fullname, shstrndx);
7988a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
7998a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  /* Close the ELF backend library descriptor.  */
8008a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  ebl_closebackend (ebl);
8018a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper
8028a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper  return result;
8038a68774cdbe5609c50d7ee9dad3b6040e4f5fbe1Ulrich Drepper}
8043cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
8053cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper
8063cbdd387c752999255aea91600b5cfdefbeac7d0Ulrich Drepper#include "debugpred.h"
807