summaryrefslogtreecommitdiffstats
path: root/tests/line2addr.c
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2015-09-24 15:42:30 -0700
committerChih-hung Hsieh <chh@google.com>2015-09-24 23:25:36 +0000
commit5eafdf0f9bfd9a3c5f93414ac16bb399b6da0b7f (patch)
tree7d9031ee3d5796de4a1825892fc6e04ba6e36ae2 /tests/line2addr.c
parentd03895cf5f8b77c6a85abcd84ea0d80ff56be846 (diff)
downloadandroid_external_elfutils-5eafdf0f9bfd9a3c5f93414ac16bb399b6da0b7f.tar.gz
android_external_elfutils-5eafdf0f9bfd9a3c5f93414ac16bb399b6da0b7f.tar.bz2
android_external_elfutils-5eafdf0f9bfd9a3c5f93414ac16bb399b6da0b7f.zip
Move files up to match upstream source structure.
To create an upstream-master branch later and keep track of upstream changes. * src/Android.mk file is deleted because ./Android.mk is identical and serves the same purpose. * ./Makefile.am is moved from old src/Makefile.am, and new src/Makefile.am is from old src/src/Makefile.am. Similarly, ./ChangeLog is moved from old src/ChangeLog, and new src/ChangeLog is from old src/src/ChangeLog. * Remove unnecessary files that were generated by autoconf or configure. Change-Id: Iafc67d1e80f9d7ad2a74bc851bf9ca9e87205336
Diffstat (limited to 'tests/line2addr.c')
-rw-r--r--tests/line2addr.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/tests/line2addr.c b/tests/line2addr.c
new file mode 100644
index 00000000..e0d65d3d
--- /dev/null
+++ b/tests/line2addr.c
@@ -0,0 +1,148 @@
+/* Copyright (C) 2005 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <assert.h>
+#include ELFUTILS_HEADER(dwfl)
+#include <argp.h>
+#include <stdio.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+
+
+static void
+print_address (Dwfl_Module *mod, Dwarf_Addr address)
+{
+ int n = dwfl_module_relocations (mod);
+ if (n < 0)
+ error (0, 0, "dwfl_module_relocations: %s", dwfl_errmsg (-1));
+ else if (n > 0)
+ {
+ int i = dwfl_module_relocate_address (mod, &address);
+ if (i < 0)
+ error (0, 0, "dwfl_module_relocate_address: %s", dwfl_errmsg (-1));
+ else
+ {
+ const char *modname = dwfl_module_info (mod, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL);
+ const char *secname = dwfl_module_relocation_info (mod, i, NULL);
+ if (n > 1 || secname[0] != '\0')
+ printf ("%s(%s)+%#" PRIx64, modname, secname, address);
+ else
+ printf ("%s+%#" PRIx64, modname, address);
+ return;
+ }
+ }
+
+ printf ("%#" PRIx64, address);
+}
+
+
+struct args
+{
+ const char *arg;
+ char *file;
+ int line;
+};
+
+static int
+handle_module (Dwfl_Module *mod __attribute__ ((unused)),
+ void **udata __attribute__ ((unused)),
+ const char *modname, Dwarf_Addr base __attribute__ ((unused)),
+ Dwarf *dbg __attribute__ ((unused)),
+ Dwarf_Addr bias __attribute__ ((unused)), void *arg)
+{
+ const struct args *const a = arg;
+
+ Dwfl_Line **lines = NULL;
+ size_t nlines = 0;
+
+ if (dwfl_module_getsrc_file (mod, a->file, a->line, 0, &lines, &nlines) == 0)
+ {
+ for (size_t inner = 0; inner < nlines; ++inner)
+ {
+ Dwarf_Addr addr;
+ int line = a->line, col = 0;
+ const char *file = dwfl_lineinfo (lines[inner], &addr, &line, &col,
+ NULL, NULL);
+ if (file != NULL)
+ {
+ printf ("%s -> ", a->arg);
+ print_address (mod, addr);
+ if (modname[0] != '\0')
+ printf (" (%s:", modname);
+ if (strcmp (file, a->file) || line != a->line || col != 0)
+ printf (" %s%s:%d", modname[0] != '\0' ? "" : "(",
+ file, line);
+ if (col != 0)
+ printf (":%d", col);
+ if (modname[0] != '\0'
+ || strcmp (file, a->file) || line != a->line || col != 0)
+ puts (")");
+ else
+ puts ("");
+ }
+ }
+ free (lines);
+ }
+
+ return DWARF_CB_OK;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int cnt;
+
+ /* Set locale. */
+ (void) setlocale (LC_ALL, "");
+
+ Dwfl *dwfl = NULL;
+ (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &cnt, &dwfl);
+ assert (dwfl != NULL);
+
+ for (; cnt < argc; ++cnt)
+ {
+ struct args a = { .arg = argv[cnt] };
+
+ switch (sscanf (a.arg, "%m[^:]:%d", &a.file, &a.line))
+ {
+ default:
+ case 0:
+ printf ("ignored %s\n", argv[cnt]);
+ continue;
+ case 1:
+ a.line = 0;
+ break;
+ case 2:
+ break;
+ }
+
+ (void) dwfl_getdwarf (dwfl, &handle_module, &a, 0);
+
+ free (a.file);
+ }
+
+ dwfl_end (dwfl);
+
+ return 0;
+}