diff options
author | Dodji Seketeli <dodji@seketeli.org> | 2015-08-13 15:59:41 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2015-08-14 16:44:42 +0200 |
commit | b901b5e742e03d781fe9b6ecf030d6d297948018 (patch) | |
tree | 374559ff13e353d2a638177def1e5db30acc10eb /libdwfl/libdwfl.h | |
parent | d950fcd511c79193ff1ed9a994826d6bb61e77c1 (diff) | |
download | elfutils-b901b5e742e03d781fe9b6ecf030d6d297948018.tar.gz |
Fix finding split debug info files not located by the build-id mechanism
[This bug has been found by using elfutils in the context of
libabigail. The initial bug report is
https://sourceware.org/bugzilla/show_bug.cgi?id=18792. The
interesting comments start at is
https://sourceware.org/bugzilla/show_bug.cgi?id=18792#c4]
suppose we have a debug info file that is located at a
/prefix1/usr/lib/debug/prefix2/libfoo.so. Suppose also that the debug
info describes a binary that is located at /prefix1/prefix2/libfoo.so
Suppose the debug_link property inside the binary
/prefix1/prefix2/libfoo.so correctly contains the string "libfoo.so"
that designates the name of the debug info file.
The problem is, when find_debuginfo_in_path() is called with its
file_name parameter set to "/prefix1/prefix2/libfoo.so" and
mod->dwfl->callbacks->debuginfo_path set to
"/prefix1/lib/debug/", it fails to locate the debug
info file libfoo.so under "/prefix1/usr/lib/debug/prefix2/".
This patch fixes the issue by making find_debuginfo_in_path() try all
the sub-strings of "/prefix1/prefix2/libfoo.so "under"
"/prefix1/usr/lib/debug/", to find libfoo.so. That is, it tries, in
order:
- /prefix1/usr/lib/debug/prefix1/prefix2/libfoo.so
- /prefix1/usr/lib/debug/prefix2/libfoo.so <-- and boom, it finds it!
Note that the patch tries the variations between the two candidates
above too.
The patch uses a goto. I dislike gotos like anyone else, but then
here, not using this would imply a bigger change of the logic of that
function. So I am proposing the scheme based on the goto instead.
* libdwfl/find-debuginfo.c (find_debuginfo_in_path): Try to locate
the debug info file named debuglink_file under
mod->dwfl->callbacks->debuginfo_path, by looking at the set of
sub-trees under mod->dwfl->callbacks->debuginfo_path which is
common to the set of non-absolute parent trees of file_name.
https://bugzilla.redhat.com/show_bug.cgi?id=1253367
Signed-off-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Mark Wielaard <mjw@redhat.com>
Diffstat (limited to 'libdwfl/libdwfl.h')
-rw-r--r-- | libdwfl/libdwfl.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index 2bb4f455..1098c833 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -275,12 +275,14 @@ extern int dwfl_module_build_id (Dwfl_Module *mod, In searches for debuginfo by name, if the remainder of the element is empty, the directory containing the main file is tried; if it's an absolute path name, the absolute directory path - containing the main file is taken as a subdirectory of this path; - a relative path name is taken as a subdirectory of the directory - containing the main file. Hence for /bin/ls, the default string - ":.debug:/usr/lib/debug" says to look in /bin, then /bin/.debug, - then /usr/lib/debug/bin, for the file name in the .gnu_debuglink - section (or "ls.debug" if none was found). */ + (and any subdirectory of that path) containing the main file is + taken as a subdirectory of this path; a relative path name is taken + as a subdirectory of the directory containing the main file. + Hence for /usr/bin/ls, the default string ":.debug:/usr/lib/debug" + says to look in /usr/bin, then /usr/bin/.debug, then the path subdirs + under /usr/lib/debug, in the order /usr/lib/debug/usr/bin, then + /usr/lib/debug/bin, and finally /usr/lib/debug, for the file name in + the .gnu_debuglink section (or "ls.debug" if none was found). */ /* Standard find_elf callback function working solely on build ID. This can be tried first by any find_elf callback, to use the |