1058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard/* Test program for elf_strptr function. 2058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard Copyright (C) 2015 Red Hat, Inc. 3058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard This file is part of elfutils. 4058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 5058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard This file is free software; you can redistribute it and/or modify 6058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard it under the terms of the GNU General Public License as published by 7058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard the Free Software Foundation; either version 3 of the License, or 8058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard (at your option) any later version. 9058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 10058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard elfutils is distributed in the hope that it will be useful, but 11058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard WITHOUT ANY WARRANTY; without even the implied warranty of 12058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard GNU General Public License for more details. 14058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 15058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard You should have received a copy of the GNU General Public License 16058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 18058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#ifdef HAVE_CONFIG_H 19058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard# include <config.h> 20058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#endif 21058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 22058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <errno.h> 23058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <fcntl.h> 24058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <inttypes.h> 25058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <stdio.h> 26058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <stdlib.h> 27058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <string.h> 28058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <unistd.h> 29058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 30058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include ELFUTILS_HEADER(elf) 31058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard#include <gelf.h> 32058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 33058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaardint 34058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaardmain (int argc, char *argv[]) 35058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard{ 36058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (argc != 2) 37058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 38058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("No ELF file given as argument"); 39058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 40058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 41058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 42058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard const char *fname = argv[1]; 43058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 44058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard // Initialize libelf. 45058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard elf_version (EV_CURRENT); 46058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 47058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard /* Read the ELF from disk now. */ 48058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard int fd = open (fname, O_RDONLY); 49058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (fd == -1) 50058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 51058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno)); 52058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 53058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 54058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 55058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard Elf *elf = elf_begin (fd, ELF_C_READ, NULL); 56058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (elf == NULL) 57058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 58058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1)); 59058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 60058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 61058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 62058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard size_t ndx; 63058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (elf_getshdrstrndx (elf, &ndx) != 0) 64058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 65058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("cannot get section header table index: %s\n", elf_errmsg (-1)); 66058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 67058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 68058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 69058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (ndx == SHN_UNDEF) 70058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 71058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("ELF file `%s' doesn't have a section header table index", fname); 72058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 73058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 74058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 75058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("Strings in section %zd:\n", ndx); 76058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 77058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard size_t off = 0; 78058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard const char *str = elf_strptr (elf, ndx, off); 79058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard while (str != NULL) 80058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 81058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("[%zx] '%s'\n", off, str); 82058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard off += strlen (str) + 1; 83058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard str = elf_strptr (elf, ndx, off); 84058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 85058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 86058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard if (elf_end (elf) != 0) 87058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard { 88058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard printf ("failure in elf_end: %s\n", elf_errmsg (-1)); 89058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard exit (1); 90058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard } 91058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 92058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard close (fd); 93058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard 94058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard return 0; 95058ae7b4d5bdfa0f39312b056ee9cadc4c3ffeb9Mark Wielaard} 96