]> git.ipfire.org Git - thirdparty/elfutils.git/commit
Fix finding split debug info files not located by the build-id mechanism
authorDodji Seketeli <dodji@seketeli.org>
Thu, 13 Aug 2015 13:59:41 +0000 (15:59 +0200)
committerMark Wielaard <mjw@redhat.com>
Fri, 14 Aug 2015 14:44:42 +0000 (16:44 +0200)
commitb901b5e742e03d781fe9b6ecf030d6d297948018
tree374559ff13e353d2a638177def1e5db30acc10eb
parentd950fcd511c79193ff1ed9a994826d6bb61e77c1
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>
libdwfl/ChangeLog
libdwfl/find-debuginfo.c
libdwfl/libdwfl.h