1ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard/* Copyright (C) 2014 Red Hat, Inc.
2ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   This file is part of elfutils.
3ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
4ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   This file is free software; you can redistribute it and/or modify
5ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   it under the terms of the GNU General Public License as published by
6ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
7ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   (at your option) any later version.
8ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
9ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
10ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   WITHOUT ANY WARRANTY; without even the implied warranty of
11ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   GNU General Public License for more details.
13ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
14ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   You should have received a copy of the GNU General Public License
15ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
17ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#ifdef HAVE_CONFIG_H
18ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard# include <config.h>
19ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#endif
20ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
21ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <errno.h>
22ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <error.h>
23ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <fcntl.h>
24ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <inttypes.h>
25ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <libelf.h>
26ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include ELFUTILS_HEADER(dw)
27ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <stdio.h>
28ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <stdlib.h>
29ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard#include <unistd.h>
30ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
31ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
32ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaardint
33ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaardmain (int argc, char *argv[])
34ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard{
35ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  /* file addr+ */
36ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  int fd = open (argv[1], O_RDONLY);
37ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
38ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  if  (dbg == NULL)
39ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard    error (-1, 0, "dwarf_begin (%s): %s\n", argv[1], dwarf_errmsg (-1));
40ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
41ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  for (int i = 2; i < argc; i++)
42ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard    {
43ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      Dwarf_Addr addr;
44ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      char *endptr;
45ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      Dwarf_Die cudie;
46ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      Dwarf_Line *line;
47ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
48ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      errno = 0;
49ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      addr = strtoull (argv[i], &endptr, 16);
50ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      if (errno != 0)
51ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard	error (-1, errno, "Cannot parrse '%s'", argv[1]);
52ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
53ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      if (dwarf_addrdie (dbg, addr, &cudie) == NULL)
54ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard	error (-1, 0, "dwarf_addrdie (%s): %s", argv[i], dwarf_errmsg (-1));
55ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
56ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      line = dwarf_getsrc_die (&cudie, addr);
57ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      if (line == NULL)
58ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard	error (-1, 0, "dwarf_getsrc_die (%s): %s", argv[i], dwarf_errmsg (-1));
59ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
60ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      const char *f = dwarf_linesrc (line, NULL, NULL);
61ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      int l;
62ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      if (dwarf_lineno (line, &l) != 0)
63ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard	l = 0;
64ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
65ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard      printf ("%s:%d\n", f ?: "???", l);
66ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard    }
67ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
68ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  dwarf_end (dbg);
69ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  close (fd);
70ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard
71ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard  return 0;
72ddbf23a4594b5a6f1b387b15d42312a203075d80Mark Wielaard}
73