14894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek/* Copyright (C) 2011 Red Hat, Inc.
2de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
34894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek   Written by Marek Polacek <mpolacek@redhat.com>, 2011.
44894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of the GNU General Public License as published by
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   (at your option) any later version.
94894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
114894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek   WITHOUT ANY WARRANTY; without even the implied warranty of
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   GNU General Public License for more details.
144894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received a copy of the GNU General Public License
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
174894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
184894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#ifdef HAVE_CONFIG_H
194894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek# include <config.h>
204894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#endif
214894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
224894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include ELFUTILS_HEADER(dwfl)
234894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <assert.h>
244894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <dwarf.h>
254894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <fcntl.h>
264894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <stdio.h>
274894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <unistd.h>
284894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
294894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
304894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacekint
314894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacekmain (int argc, char *argv[])
324894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek{
334894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek  int cnt;
344894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
354894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek  for (cnt = 1; cnt < argc; ++cnt)
364894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek    {
374894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      Dwarf_Off offset = 0;
384894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      size_t len;
394894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
403425454a10d307fae891fb667cf7969e945cde79Josh Stone      int fd = open (argv[cnt], O_RDONLY);
414894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      if (fd == -1)
424894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	{
434894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  printf ("cannot open '%s': %m\n", argv[cnt]);
444894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  return 1;
454894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	}
464894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
474894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
484894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      if (dbg == NULL)
494894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	{
504894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1));
514894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  close (fd);
524894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  return 1;
534894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	}
544894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
554894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      /* Try to use NULL Dwarf object.  */
564894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      const char *str = dwarf_getstring (NULL, offset, &len);
574894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      assert (str == NULL);
584894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
594894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      /* Use insane offset.  */
604894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      str = dwarf_getstring (dbg, ~0UL, &len);
614894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      assert (str == NULL);
624894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
634894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      /* Now do some real work.  */
644894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      for (int i = 0; i < 100; ++i)
654894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	{
664894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  str = dwarf_getstring (dbg, offset, &len);
674894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  puts (str);
684894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
694894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  /* Advance.  */
704894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	  offset += len + 1;
714894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek	}
724894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
73a1372e06a04bad29e8c3c79d95497a8e381f823fMark Wielaard      dwarf_end (dbg);
744894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek      close (fd);
754894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek    }
764894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek
774894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek  return 0;
784894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek}
79