Skip to content

Commit

Permalink
selftests/bpf: fix backtrace printing for selftests crashes
Browse files Browse the repository at this point in the history
test_progs uses glibc specific functions backtrace() and
backtrace_symbols_fd() to print backtrace in case of SIGSEGV.

Recent commit (see fixes) updated test_progs.c to define stub versions
of the same functions with attriubte "weak" in order to allow linking
test_progs against musl libc. Unfortunately this broke the backtrace
handling for glibc builds.

As it turns out, glibc defines backtrace() and backtrace_symbols_fd()
as weak:

  $ llvm-readelf --symbols /lib64/libc.so.6 \
     | grep -P '( backtrace_symbols_fd| backtrace)$'
  4910: 0000000000126b40   161 FUNC    WEAK   DEFAULT    16 backtrace
  6843: 0000000000126f90   852 FUNC    WEAK   DEFAULT    16 backtrace_symbols_fd

So does test_progs:

 $ llvm-readelf --symbols test_progs \
    | grep -P '( backtrace_symbols_fd| backtrace)$'
  2891: 00000000006ad190    15 FUNC    WEAK   DEFAULT    13 backtrace
 11215: 00000000006ad1a0    41 FUNC    WEAK   DEFAULT    13 backtrace_symbols_fd

In such situation dynamic linker is not obliged to favour glibc
implementation over the one defined in test_progs.

Compiling with the following simple modification to test_progs.c
demonstrates the issue:

  $ git diff
  ...
  --- a/tools/testing/selftests/bpf/test_progs.c
  +++ b/tools/testing/selftests/bpf/test_progs.c
  @@ -1817,6 +1817,7 @@ int main(int argc, char **argv)
          if (err)
                  return err;

  +       *(int *)0xdeadbeef  = 42;
          err = cd_flavor_subdir(argv[0]);
          if (err)
                  return err;

  $ ./test_progs
  [0]: Caught signal kernel-patches#11!
  Stack trace:
  <backtrace not supported>
  Segmentation fault (core dumped)

Resolve this by hiding stub definitions behind __GLIBC__ macro check
instead of using "weak" attribute.

Fixes: c9a83e7 ("selftests/bpf: Fix compile if backtrace support missing in libc")

CC: Tony Ambardar <[email protected]>
Signed-off-by: Eduard Zingerman <[email protected]>
  • Loading branch information
eddyz87 committed Oct 3, 2024
1 parent 9502a7d commit 9f16319
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions tools/testing/selftests/bpf/test_progs.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,23 @@

#include "network_helpers.h"

/* backtrace() and backtrace_symbols_fd() are glibc specific,
* use header file when glibc is available and provide stub
* implementations when another libc implementation is used.
*/
#ifdef __GLIBC__
#include <execinfo.h> /* backtrace */
#endif

/* Default backtrace funcs if missing at link */
__weak int backtrace(void **buffer, int size)
#else
int backtrace(void **buffer, int size)
{
return 0;
}

__weak void backtrace_symbols_fd(void *const *buffer, int size, int fd)
void backtrace_symbols_fd(void *const *buffer, int size, int fd)
{
dprintf(fd, "<backtrace not supported>\n");
}
#endif /*__GLIBC__ */

int env_verbosity = 0;

Expand Down

0 comments on commit 9f16319

Please sign in to comment.