Bug 609636 - Unwinding through prelinked shared library broken (.debug_frame)
Unwinding through prelinked shared library broken (.debug_frame)
Product: Red Hat Enterprise Linux 6
Classification: Red Hat
Component: systemtap (Show other bugs)
All Linux
low Severity medium
: rc
: ---
Assigned To: Frank Ch. Eigler
Depends On: 634995
  Show dependency treegraph
Reported: 2010-06-30 13:46 EDT by Mark Wielaard
Modified: 2011-05-19 09:54 EDT (History)
2 users (show)

See Also:
Fixed In Version: systemtap-1.4-1.el6
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Last Closed: 2011-05-19 09:54:34 EDT
Type: ---
Regression: ---
Mount Type: ---
Documentation: ---
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---

Attachments (Terms of Use)

  None (edit)
Description Mark Wielaard 2010-06-30 13:46:48 EDT
Description of problem:

Unwinding through a CFI that comes from the .debug_frame section in a prelinked shared library is broken (it works fine if the CFI comes from the .eh_frame sections though).

Version-Release number of selected component (if applicable):


How reproducible:

Always on i686 (never on x86_64 - at least not with the default compiler settings).

Steps to Reproduce:
1. make installcheck RUNTESTFLAGS=exelib.exp
Actual results:

# of expected passes            156
# of unexpected failures        32

Expected results:

# of expected passes            188

Additional info:

Upstream fix

commit 0aab7115c0099c0b8d7579befdea8557c25078f9
Author: Mark Wielaard <mjw@redhat.com>
Date:   Wed Jun 30 14:27:05 2010 +0200

    Fix .debug_frame dwarf unwinding through prelinked dynamic libraries.
    This wasn't immediately visible since often we would pick up the .eh_frame
    CFI. But when the would pick up the CFI from the .debug_frame and the
    shared library was prelinked, we would not correctly adjust some addresses.
    * runtime/sym.h (_stp_module): Better explain dwarf_module_base.
    * runtime/unwind.c (adjustStartLoc): Only adjust against dwarf_module_base
      when not eh_frame.
    * translate.cxx (dump_unwindsyms): Adjust dwarf_module_base against dwbias.
Comment 2 RHEL Product and Program Management 2010-06-30 14:03:10 EDT
This request was evaluated by Red Hat Product Management for inclusion in a Red
Hat Enterprise Linux major release.  Product Management has requested further
review of this request by Red Hat Engineering, for potential inclusion in a Red
Hat Enterprise Linux Major release.  This request is not yet committed for
Comment 3 Mark Wielaard 2010-07-07 16:41:47 EDT
There is a more generic update to the upstream patch:

commit 4d83bd9b6f5ccc4abd212ca5d6a6477cb52f78cc
Author: Mark Wielaard <mjw@redhat.com>
Date:   Mon Jul 5 21:14:42 2010 +0200

    Put generated debug_hdr in _stp_section, add sec_load_offset for adjustment.
    Make sure to adjust .debug_frame addresses to section load address.
    Which means keeping track of the (synthetic) .debug_frame_hdr index
    per section. For now keep track of "magic sections". Will need to
    be extended to track all loadable code sections as we do for symbol
    tables. See http://sourceware.org/ml/systemtap/2010-q3/msg00012.html
    * runtime/sym.h (_stp_module): Remove dwarf_module_base. Move debug_hdr
      and debug_hdr_len from here to ...
      (_stp_section): ... here. And add sec_load_offset.
    * runtime/unwind.c (adjustStartLoc): Don't use m->dwarf_module_base,
      use s->sec_load_offset.
      (_stp_search_unwind_hdr): Use s->debug_hdr and s->debug_hdr_len.
    * translate.cxx (create_debug_frame_hdr): Accept and set debug_frame_off.
      (get_unwind_data): Likewise.
      (dump_unwindsyms): Keep track of debug_frame_off. Output debug_frame_hdr
      per _stp_section if section is ".dynamic", ".absolute", ".text", or

This makes it so that user space shared libraries aren't a special case anymore, but are treated similarly to other sections using .debug_frames for unwinding. This fixes a similar issue with unwinding through kernel modules.

An update to the context.exp backtrace.tcl test was also made to check the kernel unwind case:

commit ae38415f9ff7698a3ee39ef1e50ff0360fb2378a
Author: Mark Wielaard <mjw@redhat.com>
Date:   Tue Jul 6 12:24:19 2010 +0200

    Extend context.exp backtrace.tcl test for "perfect" DWARF backtraces.
    * testsuite/systemtap.context/backtrace.stp (yyy_func4): Exit at end to not
      stall expect.
    * testsuite/systemtap.context/backtrace.tcl: Add -d systemtap_test_module1
      and -d kernel for "perfect" backtraces. Keep track of module1 and kernel
      frames. Do not accept (inexact) anymore - the dwarf unwinder is "perfect"
      now. Check stap script did exit (eof).
Comment 6 Frank Ch. Eigler 2010-07-21 07:55:31 EDT
It appears that backporting the fixes into the rhel6 1.2 version is more
difficult than expected.  Let's defer this to a later version.  When/if
we rebase to systemtap-1.3 (due out in days), this will be picked up
automatically.  (Note I'm not requesting a rebase at this point for
RHEL6.0, though we can do so if requested.)

Reassigning to RHEL6.1.
Comment 10 errata-xmlrpc 2011-05-19 09:54:34 EDT
An advisory has been issued which should help the problem
described in this bug report. This report is therefore being
closed with a resolution of ERRATA. For more information
on therefore solution and/or where to find the updated files,
please follow the link below. You may reopen this bug report
if the solution does not work for you.


Note You need to log in before you can comment on or make changes to this bug.