Signed-off-by: Florian Weimer <fwei...@redhat.com> --- libdw/ChangeLog | 2 + libdw/libdw.map | 1 + libdwelf/ChangeLog | 8 ++++ libdwelf/Makefile.am | 2 +- libdwelf/dwelf_dwarf_gnu_debugaltlink.c | 57 ++++++++++++++++++++++++ libdwelf/libdwelf.h | 11 +++++ libdwelf/libdwelfP.h | 1 + tests/ChangeLog | 7 +++ tests/Makefile.am | 5 ++- tests/debugaltlink.c | 77 +++++++++++++++++++++++++++++++++ tests/run-debugaltlink.sh | 34 +++++++++++++++ 11 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 libdwelf/dwelf_dwarf_gnu_debugaltlink.c create mode 100644 tests/debugaltlink.c create mode 100755 tests/run-debugaltlink.sh
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 1ecdb02..3097880 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -13,6 +13,8 @@ declarations. * libdw.map (ELFUTILS_0.159): Export the two new functions. + * libdw.map (ELFUTILS_0.159): Export dwelf_dwarf_gnu_debugaltlink. + 2014-04-11 Mark Wielaard <m...@redhat.com> * libdw.map (ELFUTILS_0.159): New. Add dwelf_elf_gnu_debuglink. diff --git a/libdw/libdw.map b/libdw/libdw.map index 71247e3..3529980 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -297,5 +297,6 @@ ELFUTILS_0.159 { global: dwarf_getalt; dwarf_setalt; + dwelf_dwarf_gnu_debugaltlink; dwelf_elf_gnu_debuglink; } ELFUTILS_0.158; diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog index caf1c5d..7a3cd03 100644 --- a/libdwelf/ChangeLog +++ b/libdwelf/ChangeLog @@ -1,3 +1,11 @@ +2014-04-15 Florian Weimer <fwei...@redhat.com> + + * dwelf_dwarf_gnu_debugaltlink.c: New file. + * Makefile.am (libdwelf_a_SOURCES): Add it. + * libdwelf.h (dwelf_dwarf_gnu_debugaltlink): Declare new function. + * libdwelfP.h (dwelf_dwarf_gnu_debugaltlink): Add internal + declaration. + 2014-04-11 Mark Wielaard <m...@redhat.com> * Makefile.am: New file. diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am index 0f684d4..1ca3a5c 100644 --- a/libdwelf/Makefile.am +++ b/libdwelf/Makefile.am @@ -38,7 +38,7 @@ noinst_LIBRARIES = libdwelf.a libdwelf_pic.a pkginclude_HEADERS = libdwelf.h noinst_HEADERS = libdwelfP.h -libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c +libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c libdwelf = $(libdw) diff --git a/libdwelf/dwelf_dwarf_gnu_debugaltlink.c b/libdwelf/dwelf_dwarf_gnu_debugaltlink.c new file mode 100644 index 0000000..fe473ab --- /dev/null +++ b/libdwelf/dwelf_dwarf_gnu_debugaltlink.c @@ -0,0 +1,57 @@ +/* Returns the file name and build ID stored in the .gnu_altdebuglink if found. + 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 either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + 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 copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libdwelfP.h" + +const char * +dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf, const void **build_idp, + size_t *build_id_lenp) +{ + Elf_Data *data = dwarf->sectiondata[IDX_gnu_debugaltlink]; + if (data == NULL) + { + /* Missing data is not actually an error. */ + __libdw_seterrno (0); + return NULL; + } + + const void *ptr = memchr (data->d_buf, '\0', data->d_size); + if (ptr == NULL) + { + __libdw_seterrno (DWARF_E_INVALID_ELF); + return NULL; + } + *build_idp = ptr + 1; + *build_id_lenp = data->d_size - (ptr - data->d_buf + 1); + return data->d_buf; +} +INTDEF(dwelf_dwarf_gnu_debugaltlink) diff --git a/libdwelf/libdwelf.h b/libdwelf/libdwelf.h index 5d636d1..fbf7f2e 100644 --- a/libdwelf/libdwelf.h +++ b/libdwelf/libdwelf.h @@ -47,6 +47,17 @@ extern "C" { section or some other error occured. */ extern const char *dwelf_elf_gnu_debuglink (Elf *elf, GElf_Word *crc); +/* Returns the name of the alternate debug information file from the + .gnu_debugaltlink section if found in the ELF. On success, writes + a pointer to the build ID to *BUILD_IDP, and its length to + *BUILD_ID_LENP. Returns NULL if the ELF file didn't have a + .gnu_debuglink section (and sets the dwarf_errcode error code to + 0), had malformed data in the section or some other error occured. + The returned pointers are valid while the ELF handle is valid. */ +extern const char *dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf, + const void **build_idp, + size_t *build_id_lenp); + #ifdef __cplusplus } #endif diff --git a/libdwelf/libdwelfP.h b/libdwelf/libdwelfP.h index bdadc8b..c00a834 100644 --- a/libdwelf/libdwelfP.h +++ b/libdwelf/libdwelfP.h @@ -36,5 +36,6 @@ /* Avoid PLT entries. */ INTDECL (dwelf_elf_gnu_debuglink) +INTDECL (dwelf_dwarf_gnu_debugaltlink) #endif /* libdwelfP.h */ diff --git a/tests/ChangeLog b/tests/ChangeLog index f6d6fd6..a5fc945 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,10 @@ +2014-04-15 Florian Weimer <fwei...@redhat.com> + + * debugaltlink.c, run-debugaltlink.sh: New files. + * Makefile.am (check_PROGRAMS): Add debugaltlink. + (TESTS): Add run-debugaltlink.sh. + (debugaltlink_LDADD): New variable. + 2014-04-11 Mark Wielaard <m...@redhat.com> * Makefile.am (AM_CPPFLAGS): Add -I libdwelf. diff --git a/tests/Makefile.am b/tests/Makefile.am index 39dbcfc..f139c65 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -53,7 +53,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ alldts md5-sha1-test typeiter typeiter2 low_high_pc \ test-elf_cntl_gelf_getshdr dwflsyms dwfllines \ dwfl-report-elf-align varlocs backtrace backtrace-child \ - backtrace-data backtrace-dwarf debuglink + backtrace-data backtrace-dwarf debuglink debugaltlink asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ asm-tst6 asm-tst7 asm-tst8 asm-tst9 @@ -90,7 +90,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-readelf-macro.sh run-readelf-loc.sh \ run-readelf-aranges.sh run-readelf-line.sh \ run-native-test.sh run-bug1-test.sh \ - run-debuglink.sh \ + run-debuglink.sh run-debugaltlink.sh \ dwfl-bug-addr-overflow run-addrname-test.sh \ dwfl-bug-fd-leak dwfl-bug-report \ run-dwfl-bug-offline-rel.sh run-dwfl-addr-sect.sh \ @@ -413,6 +413,7 @@ backtrace_data_LDADD = $(libdw) $(libelf) $(libmudflap) backtrace_dwarf_CFLAGS = -Wno-unused-parameter backtrace_dwarf_LDADD = $(libdw) $(libelf) $(libmudflap) debuglink_LDADD = $(libdw) $(libelf) +debugaltlink_LDADD = $(libdw) $(libelf) if GCOV check: check-am coverage diff --git a/tests/debugaltlink.c b/tests/debugaltlink.c new file mode 100644 index 0000000..f75cc6e --- /dev/null +++ b/tests/debugaltlink.c @@ -0,0 +1,77 @@ +/* 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 <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 void *build_id; + size_t build_id_len; + const char *name = dwelf_dwarf_gnu_debugaltlink + (dwarf, &build_id, &build_id_len); + if (name == NULL) + printf ("%s: <no .gnu_debugaltlink section>\n", file); + else + { + printf ("%s: %s, build ID: ", file, name); + const unsigned char *p = build_id; + const unsigned char *end = p + build_id_len; + while (p < end) + printf("%02x", (unsigned)*p++); + putchar('\n'); + } + + dwarf_end (dwarf); + close (fd); + } + + return 0; +} diff --git a/tests/run-debugaltlink.sh b/tests/run-debugaltlink.sh new file mode 100755 index 0000000..fa7dd26 --- /dev/null +++ b/tests/run-debugaltlink.sh @@ -0,0 +1,34 @@ +#! /bin/sh +# 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/>. + +. $srcdir/test-subr.sh + +# Just some random testfiles, four with, one without .gnu_debugaltlink +testfiles testfile42 testfile_multi_main testfile-dwzstr \ + test-offset-loop libtestfile_multi_shared.so + +testrun_compare ${abs_builddir}/debugaltlink testfile42 \ + testfile_multi_main testfile-dwzstr \ + test-offset-loop libtestfile_multi_shared.so <<\EOF +testfile42: <no .gnu_debugaltlink section> +testfile_multi_main: testfile_multi.dwz, build ID: a0d6c06e0d912d74033b6fe2808753cae8f6f594 +testfile-dwzstr: testfile-dwzstr.multi, build ID: 6da22627dae55c1d62cf9122827c665e240a056b +test-offset-loop: test-offset-loop.alt, build ID: 066bbf1a7bc5676f5015ee1966a088f23bdb83ae +libtestfile_multi_shared.so: testfile_multi.dwz, build ID: a0d6c06e0d912d74033b6fe2808753cae8f6f594 +EOF + +exit 0 -- 1.9.0