diff options
author | Florian Weimer <fweimer@redhat.com> | 2014-04-15 16:58:39 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2014-04-24 14:45:41 +0200 |
commit | 2248165d1204035e67245a4bb8d21cf90f8c7d71 (patch) | |
tree | 82e6de45a75aa7a461296612bc4fe6e9eec49b01 | |
parent | 4813dbbcb81a0f5ebbc9756fe6f4ed62d298b011 (diff) | |
download | elfutils-2248165d1204035e67245a4bb8d21cf90f8c7d71.tar.gz |
tests/allfcts.c: Install alternate debug information
This change also adds more error checking and reporting.
Signed-off-by: Florian Weimer <fweimer@redhat.com>
-rw-r--r-- | tests/ChangeLog | 6 | ||||
-rw-r--r-- | tests/allfcts.c | 35 |
2 files changed, 40 insertions, 1 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog index 3e702055..1c30778d 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,11 @@ 2014-04-24 Florian Weimer <fweimer@redhat.com> + * allfcts.c (setup_alt): New function. + (main): Call it. Implementation additional error checking and + reporting. + +2014-04-24 Florian Weimer <fweimer@redhat.com> + * debugaltlink.c, run-debugaltlink.sh: New files. * Makefile.am (check_PROGRAMS): Add debugaltlink. (TESTS): Add run-debugaltlink.sh. diff --git a/tests/allfcts.c b/tests/allfcts.c index 10e0f07b..d3c8d26a 100644 --- a/tests/allfcts.c +++ b/tests/allfcts.c @@ -18,8 +18,10 @@ # include <config.h> #endif +#include <err.h> #include <fcntl.h> #include ELFUTILS_HEADER(dw) +#include ELFUTILS_HEADER(dwelf) #include <stdio.h> #include <unistd.h> @@ -37,6 +39,28 @@ cb (Dwarf_Die *func, void *arg __attribute__ ((unused))) return DWARF_CB_ABORT; } +static Dwarf * +setup_alt (Dwarf *main) +{ + const char *alt_name; + const void *build_id; + ssize_t ret = dwelf_dwarf_gnu_debugaltlink (main, &alt_name, &build_id); + if (ret == 0) + return NULL; + if (ret == -1) + errx (1, "dwelf_dwarf_gnu_debugaltlink: %s", dwarf_errmsg (-1)); + int fd = open (alt_name, O_RDONLY); + if (fd < 0) + err (1, "open (%s)", alt_name); + Dwarf *dbg_alt = dwarf_begin (fd, DWARF_C_READ); + if (dbg_alt == NULL) + errx (1, "dwarf_begin (%s): %s", alt_name, dwarf_errmsg (-1)); + if (elf_cntl (dwarf_getelf (dbg_alt), ELF_C_FDREAD) != 0) + errx (1, "elf_cntl (%s, ELF_C_FDREAD): %s", alt_name, elf_errmsg (-1)); + close (fd); + dwarf_setalt (main, dbg_alt); + return dbg_alt; +} int main (int argc, char *argv[]) @@ -44,6 +68,8 @@ main (int argc, char *argv[]) for (int i = 1; i < argc; ++i) { int fd = open (argv[i], O_RDONLY); + if (fd < 0) + err (1, "open (%s)", argv[i]); Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); if (dbg != NULL) @@ -51,6 +77,7 @@ main (int argc, char *argv[]) Dwarf_Off off = 0; size_t cuhl; Dwarf_Off noff; + Dwarf *dbg_alt = setup_alt (dbg); while (dwarf_nextcu (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0) { @@ -62,14 +89,20 @@ main (int argc, char *argv[]) do { doff = dwarf_getfuncs (die, cb, NULL, doff); + if (dwarf_errno () != 0) + errx (1, "dwarf_getfuncs (%s): %s", + argv[i], dwarf_errmsg (-1)); } - while (doff != 0 && dwarf_errno () == 0); + while (doff != 0); off = noff; } + dwarf_end (dbg_alt); dwarf_end (dbg); } + else + errx (1, "dwarf_begin (%s): %s", argv[i], dwarf_errmsg (-1)); close (fd); } |