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