On Thu, Oct 03, 2024 at 02:03:07PM GMT, Eduard Zingerman wrote: > 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 #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: c9a83e76b5a9 ("selftests/bpf: Fix compile if backtrace support missing in libc") > > CC: Tony Ambardar <tony.ambardar@xxxxxxxxx> > Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> > --- > tools/testing/selftests/bpf/test_progs.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c > index 7846f7f98908..005ff506b527 100644 > --- a/tools/testing/selftests/bpf/test_progs.c > +++ b/tools/testing/selftests/bpf/test_progs.c > @@ -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; > > -- > 2.46.1 > > Acked-by: Daniel Xu <dxu@xxxxxxxxx>