1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Test program for libdwfl ... foo
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2007 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <config.h>
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <assert.h>
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <inttypes.h>
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <sys/types.h>
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdio.h>
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdio_ext.h>
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdlib.h>
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <string.h>
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <error.h>
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <locale.h>
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <argp.h>
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include ELFUTILS_HEADER(dwfl)
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <dwarf.h>
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstatic int
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chenghandle_address (Dwfl *dwfl, Dwarf_Addr address)
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Module *mod = dwfl_addrmodule (dwfl, address);
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Addr adjusted = address;
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Addr bias;
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Scn *scn = dwfl_module_address_section (mod, &adjusted, &bias);
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  if (scn == NULL)
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      error (0, 0, "%#" PRIx64 ": dwfl_module_address_section: %s",
50cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	     address, dwfl_errmsg (-1));
51cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return 1;
52cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
53cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  printf ("address %#" PRIx64 " => module \"%s\" section %zu + %#" PRIx64 "\n",
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	  address,
55cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	  dwfl_module_info (mod, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	  elf_ndxscn (scn), adjusted);
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return 0;
58cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengint
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengmain (int argc, char **argv)
62cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* We use no threads here which can interfere with handling a stream.  */
64cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);
65cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
66cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Set locale.  */
67cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  (void) setlocale (LC_ALL, "");
68cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
69cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int remaining;
70cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl *dwfl = NULL;
71cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining, &dwfl);
72cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  assert (dwfl != NULL);
73cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
74cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int result = 0;
75cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  for (; remaining < argc; ++remaining)
76cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
77cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      char *endp;
78cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      uintmax_t addr = strtoumax (argv[remaining], &endp, 0);
79cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      if (endp != argv[remaining])
80cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	result |= handle_address (dwfl, addr);
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      else
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	result = 1;
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  dwfl_end (dwfl);
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return result;
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
89