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