Re: [PATCH bpf] selftests/bpf: fix backtrace printing for selftests crashes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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>




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux