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