diff options
author | Roland McGrath <roland@redhat.com> | 2007-04-16 23:13:37 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2007-04-16 23:13:37 +0000 |
commit | 43da9895c6d828ceae65a47f2337e8ef24eb97c1 (patch) | |
tree | 4454878335a5a6f65083a04824b3968702bfcf6b /tests/dwfl-addr-sect.c | |
parent | bf2ee480165faec726d678f189acd2bd54e07573 (diff) | |
download | elfutils-43da9895c6d828ceae65a47f2337e8ef24eb97c1.tar.gz |
libdw/
2007-04-16 Roland McGrath <roland@redhat.com>
* libdw.map (ELFUTILS_0.127): Add dwfl_module_address_section.
libdwfl/
2007-04-16 Roland McGrath <roland@redhat.com>
* derelocate.c (cache_sections): Apply bias to sh_addr.
(compare_secrefs): Fix address comparison to avoid signed overflow.
(find_section): New function, broken out of ...
(dwfl_module_relocate_address): ... here, call it.
(check_module): New function, broken out of ...
(dwfl_module_relocate_address): ... here, call it.
(dwfl_module_address_section): New function.
* libdwfl.h: Declare it.
tests/
2007-04-16 Roland McGrath <roland@redhat.com>
* dwfl-addr-sect.c: New file.
* Makefile.am (noinst_PROGRAMS): Add it.
(dwfl_addr_sect_LDADD): New variable.
Diffstat (limited to 'tests/dwfl-addr-sect.c')
-rw-r--r-- | tests/dwfl-addr-sect.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/dwfl-addr-sect.c b/tests/dwfl-addr-sect.c new file mode 100644 index 00000000..b1f29f7c --- /dev/null +++ b/tests/dwfl-addr-sect.c @@ -0,0 +1,85 @@ +/* Test program for libdwfl ... foo + Copyright (C) 2007 Red Hat, Inc. + This file is part of Red Hat elfutils. + + Red Hat elfutils 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; version 2 of the License. + + Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. + + Red Hat elfutils is an included package of the Open Invention Network. + An included package of the Open Invention Network is a package for which + Open Invention Network licensees cross-license their patents. No patent + license is granted, either expressly or impliedly, by designation as an + included package. Should you wish to participate in the Open Invention + Network licensing program, please visit www.openinventionnetwork.com + <http://www.openinventionnetwork.com>. */ + +#include <config.h> +#include <assert.h> +#include <inttypes.h> +#include <sys/types.h> +#include <stdio.h> +#include <stdio_ext.h> +#include <stdlib.h> +#include <string.h> +#include <error.h> +#include <locale.h> +#include <argp.h> +#include ELFUTILS_HEADER(dwfl) +#include <dwarf.h> + + +static void +handle_address (Dwfl *dwfl, Dwarf_Addr address) +{ + Dwfl_Module *mod = dwfl_addrmodule (dwfl, address); + Dwarf_Addr adjusted = address; + Dwarf_Addr bias; + Elf_Scn *scn = dwfl_module_address_section (mod, &adjusted, &bias); + if (scn == NULL) + error (EXIT_FAILURE, 0, "%#" PRIx64 ": dwfl_module_address_section: %s", + address, dwfl_errmsg (-1)); + printf ("address %#" PRIx64 " => module \"%s\" section %zu + %#" PRIx64 "\n", + address, + dwfl_module_info (mod, NULL, NULL, NULL, NULL, NULL, NULL, NULL), + elf_ndxscn (scn), adjusted); +} + +int +main (int argc, char **argv) +{ + /* We use no threads here which can interfere with handling a stream. */ + (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER); + + /* Set locale. */ + (void) setlocale (LC_ALL, ""); + + int remaining; + Dwfl *dwfl = NULL; + (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining, &dwfl); + assert (dwfl != NULL); + + int result = 0; + for (; remaining < argc; ++remaining) + { + char *endp; + uintmax_t addr = strtoumax (argv[remaining], &endp, 0); + if (endp != argv[remaining]) + handle_address (dwfl, addr); + else + result = 1; + } + + dwfl_end (dwfl); + + return result; +} |