[PATCH 3/6] sysroot: debuginfo lookup with sysroot case do not remove sysroot from file_name
Victor Kamensky
kamensky@cisco.com
Fri Mar 9 20:20:00 GMT 2018
On Thu, 8 Mar 2018, Victor Kamensky wrote:
> Hi David,
>
> On Thu, 8 Mar 2018, David Smith wrote:
>
>> Hmm, the problem I have here is the code your patch wants to delete
>> was added to fix a sysroot problem in the following commit:
>>
>> ====
>> commit df932a3175284fa75a4c6bdb3aa7af1a34c15cd6
>> Author: Torsten Polle <Torsten.Polle@gmx.de>
>> Date: Thu Mar 6 21:38:49 2014 +0100
>>
>> Fix: Debug links are not found if the sysroot is used.
>>
>> Signed-off-by: Torsten Polle <Torsten.Polle@gmx.de>
>> ====
>
> Thank you for bring my attention to it. Unfortunately above
> commit message is too terse, and it is not clear what was the
> use case that did not work.
>
> But I looked closely into it again, and I think I know what
> is happening:
>
> It boils down to three different types of entries that
> SYSTEMTAP_DEBUGINFO_PATH environment (or its default) may have.
> SYSTEMTAP_DEBUGINFO_PATH value is passed through debuginfo_usr_path
> to mod->dwfl->callbacks.debuginfo_path and that is passed
> to dwfl_standard_find_debuginfo function of elfutils.
>
> Note fila_name passed to function may have sysroot stripped
> from it (current code), or may include sysroot as it was
> before df932a3175284 and after my fix.
>
> debuginfo_path may contain the following entries, each
> may preceeded by optional "+" or "-"
>
> 1) empty entry, in this case fila_name passed to the function
> is checked directly. If file_name does not have sysroot in
> it dwfl_standard_find_debuginfo will try to look for file
> in current root. Which is clearly very wrong thing to do in
> case of sysroot build, since it may pick up file with the
> same name in host. Current code with default debuginfo_path
> has this issue
>
> 2) Local path like ".debug". In this case function will look
> for `dirname file_name`/.debug/`basename file_name'. Again
> if file_name does not have sysroot in it, host files system
> will be looked and it is wrong. That is actually my case,
> in for /bin/mkdir.coreutils in my sysroot there is
> /bin/.debug/mkdir.coreutils with symbols. So if file_name
> does have sysroot in it, correct symbols file is picked and
> that is what I made this fix.
>
> 3) Absolute path like '/<sysroot>/usr/lib/debug'. In this
> case function will look at
> '/<sysroot>/usr/lib/debug'/file_name or
> '/<sysroot>/usr/lib/debug'/`basename file_name`. And in
> this case if file_name contains sysroot it will not work.
> I believe it is what df932a317528 has fixed and that is
> what my fix would break again. But note df932a317528 broke
> lookup for case 2).
I've tried to implement fix as per my understanding
above, but I discovered
that I missed important piece yesterday wrt how
dwfl_standard_find_debuginfo function handles absolute
entries. It turns out if function receives file_name it
will try one by one chipping of directories from the front of
file_name so eventually it comes to short name within
sysroot. I.e it gets file_name as /my/sys/root/bin/hello.debug
it will try:
<absolute_debuginfo>/my/sys/root/bin/hello.debug
<absolute_debuginfo>/sys/root/bin/hello.debug
<absolute_debuginfo>/root/bin/hello.debug
<absolute_debuginfo>/bin/hello.debug
<absolute_debuginfo>/hello.debug
So now, I stand by my original patch - df932a317528 should be
reverted. And reverted case works for all debuginof_path entries
types. I've unit tested either local or absolute entries all
work with my originally proposed patch.
df932a317528 was done in 'Thu Mar 6 21:38:49 2014' but
dwfl_standard_find_debuginfo logic to explore all sub-subdirs
for absolute entries was added in elfutils in 2015-08-13
by b901b5e7. I think that explains it.
Please merge my original patch or revert df932a317528.
Here is snipet from 'git blame ./libdwfl/find-debuginfo.c'
around explore all sub-subdirs in dwfl_standard_find_debuginfo code
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 268)
subdir = file_dirname;
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 269) /*
We want to explore all sub-subdirs. Chop off one slash
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 270)
at a time. */
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 271)
explore_dir:
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 272)
subdir = strchr (subdir, '/');
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 273) if
(subdir != NULL)
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 274)
subdir = subdir + 1;
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 275) if
(subdir && *subdir == 0)
b901b5e7 (Dodji Seketeli 2015-08-13 15:59:41 +0200 276)
continue;
Thanks,
Victor
> I am not sure how to fix it to work in all cases. I will
> think about it tomorrow. Any suggestions are welcome.
>
> For now it is clear in sysroot case, passing empty entry
> is wrong. Instead sysroot itself should be passed.
>
> Local path and absolute path debuginfo_path contradict
> each other wrt expectation whether file_name contains
> sysroot or not. Maybe debuginfo_path in case of
> non-empty sysroot should be split into two diferent
> sets: one with absolute entries and other with local entries
> and dwfl_standard_find_debuginfo should be called twice
> with different variants of file_name.
>
> If interseted please find below my gdb session that
> illustrates behavior of dwfl_standard_find_debuginfo described
> above. Gdb session has run against current code.
>
> Thanks,
> Victor
>
> In this example /bin/hello executable compiled in such way that it's
> .gnu_debuglink has value hello.debug, so it could be distingushable
> from executable itself.
>
> (gdb) show args
> Argument list to give program being debugged when it is started is
> "--sysroot=/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs
> -a x86_64 -r
> /home/wd8/yocto/20180128/build_x86_64/tmp/work/corei7-64-intel-common-poky-linux/linux-yocto/4.9.78+gitAUTOINC+ef2f5d9a0a_f7a6d45fff-r0/linux-corei7-64-intel-common-standard-build
> -B
> CROSS_COMPILE=/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/bin/x86_64-poky-linux-
> --sysenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin
> --sysenv=LD_LIBRARY_PATH=/lib:/usr/lib -v -l
> 'process("/bin/hello").function("*")'".
> ...
>
> (gdb) bt
> #0 find_debuginfo_in_path (mod=mod@entry=0x62d6950,
> file_name=file_name@entry=0x62d6bf2 "/bin/hello",
> debuglink_file=debuglink_file@entry=0x7ffff7fed044 "hello.debug",
> debuglink_crc=debuglink_crc@entry=611974856,
> debuginfo_file_name=debuginfo_file_name@entry=0x62d69a8) at
> find-debuginfo.c:165
> #1 0x00007ffff7bb2855 in dwfl_standard_find_debuginfo (mod=0x62d6950,
> userdata=<optimized out>, modname=<optimized out>, base=<optimized out>,
> file_name=0x62d6bf2 "/bin/hello",
> debuglink_file=0x7ffff7fed044 "hello.debug", debuglink_crc=611974856,
> debuginfo_file_name=0x62d69a8) at find-debuginfo.c:383
> #2 0x0000000000657719 in internal_find_debuginfo (mod=0x62d6950,
> userdata=0x62d6960,
> modname=0x62d6af0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/hello",
> base=65536,
> file_name=0x62d6bf2 "/bin/hello", debuglink_file=0x7ffff7fed044
> "hello.debug", debuglink_crc=611974856, debuginfo_file_name=0x62d69a8) at
> ../systemtap/setupdwfl.cxx:645
> #3 0x00007ffff7bb0153 in find_debuginfo (mod=0x62d6950) at
> dwfl_module_getdwarf.c:539
> #4 0x00007ffff7bb1393 in find_dw (mod=0x62d6950) at
> dwfl_module_getdwarf.c:1400
> #5 dwfl_module_getdwarf (mod=0x62d6950, bias=0x7fffffff79d8) at
> dwfl_module_getdwarf.c:1434
> #6 0x0000000000530b2c in validate_module_elf (mod=0x62d6950,
> name=0x62d6af0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/hello",
> q=0x7fffffff8110)
> at ../systemtap/tapsets.cxx:2471
> #7 0x000000000053169e in query_module (mod=0x62d6950,
> name=0x62d6af0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/hello",
> addr=65536, q=0x7fffffff8110)
> at ../systemtap/tapsets.cxx:2605
> #8 0x00007ffff7baed71 in dwfl_getmodules (dwfl=0x62d5020, callback=0x53137c
> <query_module(Dwfl_Module*, void**, char const*, Dwarf_Addr, base_query*)>,
> arg=0x7fffffff8110, offset=0)
> at dwfl_getmodules.c:86
> #9 0x0000000000623215 in dwflpp::iterate_over_modules<void> (this=0x62d4b80,
> callback=0x53137c <query_module(Dwfl_Module*, void**, char const*,
> Dwarf_Addr, base_query*)>,
> data=0x7fffffff8110) at ../systemtap/dwflpp.cxx:409
> #10 0x000000000058b7a3 in dwflpp::iterate_over_modules<base_query>
> (this=0x62d4b80, callback=0x53137c <query_module(Dwfl_Module*, void**, char
> const*, Dwarf_Addr, base_query*)>,
> data=0x7fffffff8110) at ../systemtap/dwflpp.h:238
> #11 0x00000000005664f7 in dwarf_builder::build (this=0x62c7960, sess=...,
> base=0x4b538d0, location=0x1028eb0, parameters=std::map with 2 elements =
> {...},
> finished_results=std::vector of length 0, capacity 0) at
> ../systemtap/tapsets.cxx:8616
> #12 0x000000000049dcbf in match_node::find_and_build (this=0x62cc660, s=...,
> p=0x4b538d0, loc=0x1028eb0, pos=2, results=std::vector of length 0, capacity
> 0, builders=std::set with 0 elements)
> at ../systemtap/elaborate.cxx:474
> #13 0x000000000049ee12 in match_node::find_and_build (this=0x4b4d920, s=...,
> p=0x4b538d0, loc=0x1028eb0, pos=1, results=std::vector of length 0, capacity
> 0, builders=std::set with 0 elements)
> at ../systemtap/elaborate.cxx:648
> #14 0x000000000049ee12 in match_node::find_and_build (this=0xa1b2d0, s=...,
> p=0x4b538d0, loc=0x1028eb0, pos=0, results=std::vector of length 0, capacity
> 0, builders=std::set with 0 elements)
> at ../systemtap/elaborate.cxx:648
> #15 0x00000000004a0ca5 in derive_probes (s=..., p=0x4b538d0, dps=std::vector
> of length 0, capacity 0, optional=false, rethrow_errors=false) at
> ../systemtap/elaborate.cxx:1022
> #16 0x00000000004a4332 in semantic_pass_symbols (s=...) at
> ../systemtap/elaborate.cxx:1890
> #17 0x00000000004a88c5 in semantic_pass (s=...) at
> ../systemtap/elaborate.cxx:2441
> #18 0x0000000000413a48 in passes_0_4 (s=...) at ../systemtap/main.cxx:914
> #19 0x00000000004161a8 in main (argc=13, argv=0x7fffffffdd68) at
> ../systemtap/main.cxx:1381
> (gdb) p *mod
> $43 = {dwfl = 0x62d5020, next = 0x0, userdata = 0x0,
> name = 0x62d6af0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/hello",
> low_addr = 65536, high_addr = 2166840,
> main = {name = 0x62d6b80
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/hello",
> fd = -1, valid = false,
> relocated = false, elf = 0x62d50b0, vaddr = 0, address_sync = 2304},
> debug = {name = 0x0, fd = 0, valid = false, relocated = false, elf = 0x0,
> vaddr = 0, address_sync = 0}, aux_sym = {
> name = 0x0, fd = 0, valid = false, relocated = false, elf = 0x0, vaddr =
> 0, address_sync = 0}, main_bias = 65536, ebl = 0x0, e_type = 3, elferr =
> DWFL_E_NOERROR, reloc_info = 0x0,
> symfile = 0x0, symdata = 0x0, aux_symdata = 0x0, syments = 0, aux_syments =
> 0, first_global = 0, aux_first_global = 0, symstrdata = 0x0, aux_symstrdata =
> 0x0, symxndxdata = 0x0,
> aux_symxndxdata = 0x0, dw = 0x0, alt = 0x0, alt_fd = 0, alt_elf = 0x0,
> symerr = DWFL_E_NOERROR, dwerr = DWFL_E_NO_DWARF, first_cu = 0x0, cu = 0x0,
> lazy_cu_root = 0x0, aranges = 0x0,
> build_id_bits = 0x62d4b60, build_id_vaddr = 66180, build_id_len = 20, ncu =
> 0, lazycu = 0, naranges = 0, dwarf_cfi = 0x0, eh_cfi = 0x0, segment = 0, gc =
> false, is_executable = false}
> (gdb) p *mod->dwfl->callbacks
> $44 = {find_elf = 0x0, find_debuginfo = 0x657103
> <internal_find_debuginfo(Dwfl_Module*, void**, char const*, unsigned long,
> char const*, char const*, unsigned int, char**)>,
> section_address = 0x0, debuginfo_path = 0xa07db8 <debuginfo_usr_path>}
> (gdb) p debuginfo_usr_path
> $45 = 0xa28bc0
> "+:.debug:/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug:/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug"
> (gdb) c
>
> Breakpoint 5, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $46 = 0x62d9320 "/bin/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0xa28e42 ".debug",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0xa28e42 ".debug",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $47 = 0x62d9320 "/bin/.debug/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (dir=dir@entry=0x62d8c50 "/bin",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>, main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $48 = 0x62d9320 "/bin/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (dir=dir@entry=0xa28e49
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug",
> subdir=subdir@entry=0x62d8c51 "bin",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (dir=dir@entry=0xa28e49
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug",
> subdir=subdir@entry=0x62d8c51 "bin",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $49 = 0x62d9fd0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug/bin/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (dir=dir@entry=0xa28e49
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug", debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (dir=dir@entry=0xa28e49
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug", debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $50 = 0x62d9fd0
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/usr/lib/debug/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (
> dir=dir@entry=0xa28eca
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug",
> subdir=subdir@entry=0x62d8c51 "bin",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (
> dir=dir@entry=0xa28eca
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug",
> subdir=subdir@entry=0x62d8c51 "bin",
> debuglink=debuglink@entry=0x7ffff7fed044 "hello.debug",
> debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $51 = 0x62d9e90
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug/bin/hello.debug"
> (gdb) c
> Continuing.
>
> Breakpoint 5, try_open (
> dir=dir@entry=0xa28eca
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug", debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:44
> 44 try_open (const struct stat *main_stat,
> (gdb) c
> Continuing.
>
> Breakpoint 6, try_open (
> dir=dir@entry=0xa28eca
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug",
> subdir=subdir@entry=0x0, debuglink=debuglink@entry=0x7ffff7fed044
> "hello.debug", debuginfo_file_name=debuginfo_file_name@entry=0x7fffffff7340,
> main_stat=<optimized out>,
> main_stat=<optimized out>) at find-debuginfo.c:61
> 61 int fd = TEMP_FAILURE_RETRY (open (fname, O_RDONLY));
> (gdb) p fname
> $52 = 0x62da070
> "/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/var/cache/abrt-di/usr/lib/debug/hello.debug"
>
>
>> Torsten, have you tried using --sysroot recently?
>>
>> On Mon, Mar 5, 2018 at 11:37 AM, Victor Kamensky <kamensky@cisco.com>
>> wrote:
>>> If sysroot option is passed, and debug symbols reside in sysroot along
>>> with executable <foo> in <foo_dir>/.debug/<foo_file> directory, stap
>>> fails to find debuginfo because it strips out sysroot path from file_name
>>> so dwfl_standard_find_debuginfo ends up looking at host
>>> <foo_dir>/.debug/<foo_file> rather then checking
>>> <sysroot>/<foo_dir>/.debug/<foo_file>.
>>>
>>> Note in cross compile environment, it is good idea to set and export
>>> proper SYSTEMTAP_DEBUGINFO_PATH variable because usual built defaults that
>>> work for native distros very often not applicable to cross sysroot
>>> based environment. For example for yocto poky/OE build the following
>>> setting seems proper "+:.debug:build".
>>>
>>> Here are steps how to reproduce the issue. Note <sysroot> is produced by
>>> yocto poky build.
>>>
>>> [kamensky@coreos-lnx2 tests]$ ls
>>> /home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/mkdir.coreutils
>>> /home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/mkdir.coreutils
>>> [kamensky@coreos-lnx2 tests]$ ls
>>> /home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/.debug/mkdir.coreutils
>>> /home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs/bin/.debug/mkdir.coreutils
>>> [kamensky@coreos-lnx2 tests]$
>>> /home/wd8/systemtap/20180208_2/packages/bin/stap
>>> --sysroot=/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs
>>> -a x86_64 -r 4.9.78-yocto-standard -B CROSS_COMPILE=x86_64-poky-linux-
>>> --sysenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin
>>> --sysenv=LD_LIBRARY_PATH=/lib:/usr/lib -v -l
>>> 'process("/bin/mkdir.coreutils").function("*")'
>>> Pass 1: parsed user script and 480 library scripts using
>>> 230184virt/93416res/5344shr/88612data kb, in 350usr/30sys/378real ms.
>>> process("/bin/mkdir.coreutils").function("_fini")
>>> process("/bin/mkdir.coreutils").function("_init")
>>> process("/bin/mkdir.coreutils").function("fts_children")
>>> process("/bin/mkdir.coreutils").function("fts_close")
>>> process("/bin/mkdir.coreutils").function("fts_open")
>>> process("/bin/mkdir.coreutils").function("fts_read")
>>> process("/bin/mkdir.coreutils").function("fts_set")
>>> Pass 2: analyzed script: 7 probes, 0 functions, 0 embeds, 0 globals using
>>> 233484virt/97928res/6212shr/91912data kb, in 20usr/0sys/26real ms.
>>>
>>> running above example under strace shows that stap tries to access
>>> /bin/.debug/mkdir.coreutils on host, rather then sysroot
>>>
>>> 13064 openat(AT_FDCWD, "/bin/mkdir.coreutils", O_RDONLY) = -1 ENOENT (No
>>> such file or directory)
>>> 13064 openat(AT_FDCWD, "/bin/.debug/mkdir.coreutils", O_RDONLY) = -1
>>> ENOENT (No such file or directory)
>>> 13064 openat(AT_FDCWD, "/bin/mkdir.coreutils", O_RDONLY) = -1 ENOENT (No
>>> such file or directory)
>>> 13064 openat(AT_FDCWD, "/bin/build/mkdir.coreutils", O_RDONLY) = -1 ENOENT
>>> (No such file or directory)
>>> 13064 openat(AT_FDCWD, "/bin/mkdir.coreutils", O_RDONLY) = -1 ENOENT (No
>>> such file or directory)
>>>
>>> After fix applied stap is able to find /bin/.debug/mkdir.coreutils under
>>> sysroot:
>>>
>>> [kamensky@coreos-lnx2 tests]$
>>> /home/wd8/systemtap/20180208_2/packages/bin/stap
>>> --sysroot=/home/wd8/yocto/20180128/build_x86_64/tmp/work/intel_corei7_64-poky-linux/kdevel-console-devel-image/1.0-r0/rootfs
>>> -a x86_64 -r 4.9.78-yocto-standard -B CROSS_COMPILE=x86_64-poky-linux-
>>> --sysenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin
>>> --sysenv=LD_LIBRARY_PATH=/lib:/usr/lib -v -l
>>> 'process("/bin/mkdir.coreutils").function("*")' | wc
>>> Pass 1: parsed user script and 480 library scripts using
>>> 230184virt/93440res/5368shr/88612data kb, in 330usr/40sys/371real ms.
>>> Pass 2: analyzed script: 401 probes, 0 functions, 0 embeds, 0 globals
>>> using 235092virt/99484res/6256shr/93520data kb, in 30usr/0sys/35real ms.
>>> 249 249 29671
>>>
>>> Also verified on target that script like example below, once compiled
>>> against sysroot on host and copied back on target can trace 'mkdir'
>>> invocation functions:
>>>
>>> [kamensky@coreos-lnx2 tests]$ cat mkdir1.stp
>>> probe process("/bin/mkdir.coreutils").function("*").call {
>>> printf ("%s -> %s\n", thread_indent(1), ppfunc())
>>> }
>>> probe process("/bin/mkdir.coreutils").function("*").return {
>>> printf ("%s <- %s\n", thread_indent(-1), ppfunc())
>>> }
>>>
>>> Signed-off-by: Victor Kamensky <kamensky@cisco.com>
>>> ---
>>> setupdwfl.cxx | 12 ------------
>>> 1 file changed, 12 deletions(-)
>>>
>>> diff --git a/setupdwfl.cxx b/setupdwfl.cxx
>>> index f00cf755b..e5bfa28f0 100644
>>> --- a/setupdwfl.cxx
>>> +++ b/setupdwfl.cxx
>>> @@ -637,18 +637,6 @@ internal_find_debuginfo (Dwfl_Module *mod,
>>>
>>> call_dwfl_standard_find_debuginfo:
>>>
>>> - if (current_session_for_find_debuginfo)
>>> - {
>>> - string sysroot = current_session_for_find_debuginfo->sysroot +
>>> "/*";
>>> - int found = fnmatch(sysroot.c_str(), file_name, 0);
>>> -
>>> - if (found)
>>> - {
>>> - file_name = file_name
>>> - + current_session_for_find_debuginfo->sysroot.length() - 1;
>>> - }
>>> - }
>>> -
>>> /* Call the original dwfl_standard_find_debuginfo */
>>> return dwfl_standard_find_debuginfo(mod, userdata, modname, base,
>>> file_name, debuglink_file,
>>> --
>>> 2.14.3
>>>
>>
>>
>>
>> --
>> David Smith
>> Associate Manager
>> Red Hat
>>
>
More information about the Systemtap
mailing list