diff options
Diffstat (limited to 'src/tests/debugaltlink.c')
-rw-r--r-- | src/tests/debugaltlink.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/tests/debugaltlink.c b/src/tests/debugaltlink.c new file mode 100644 index 00000000..6d97d500 --- /dev/null +++ b/src/tests/debugaltlink.c @@ -0,0 +1,83 @@ +/* Test program for dwelf_dwarf_gnu_debugaltlink, print name and build ID. + Copyright (C) 2014 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/>. */ + +#include <config.h> +#include <assert.h> +#include <inttypes.h> +#include <err.h> +#include <errno.h> +#include ELFUTILS_HEADER(dw) +#include ELFUTILS_HEADER(dwelf) +#include <stdio.h> +#include <error.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + +int +main (int argc, char *argv[]) +{ + if (argc < 2) + error (EXIT_FAILURE, 0, "No input file given"); + + elf_version (EV_CURRENT); + + for (int i = 1; i < argc; i++) + { + const char *file = argv[i]; + int fd = open (file, O_RDONLY); + if (fd < 0) + error (EXIT_FAILURE, errno, "couldn't open file '%s'", file); + + Dwarf *dwarf = dwarf_begin (fd, DWARF_C_READ); + if (dwarf == NULL) + { + printf("%s: dwarf_begin failed: %s\n", file, dwarf_errmsg (-1)); + close (fd); + continue; + } + + const char *name; + const void *build_id; + ssize_t ret = dwelf_dwarf_gnu_debugaltlink + (dwarf, &name, &build_id); + switch (ret) + { + case 0: + printf ("%s: <no .gnu_debugaltlink section>\n", file); + break; + case -1: + errx (1, "dwelf_dwarf_gnu_debugaltlink (%s): %s", + file, dwarf_errmsg (-1)); + default: + printf ("%s: %s, build ID: ", file, name); + const unsigned char *p = build_id; + const unsigned char *end = p + ret; + while (p < end) + printf("%02x", (unsigned)*p++); + putchar('\n'); + } + + dwarf_end (dwarf); + close (fd); + } + + return 0; +} |