libbpf / libbpf-bootstrap

Scaffolding for BPF application development with libbpf and BPF CO-RE

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

(ARM64) Rust Example Tracecon Does Not Compile

7anya opened this issue · comments

When trying to build the examples using cargo build --release, the following errors arise in building tracecon:

error: failed to run custom build command for `tracecon v0.1.0 (/home/tanya/workspace/libbpf-bootstrap/examples/rust/tracecon)`

Caused by:
  process didn't exit successfully: `/home/tanya/workspace/libbpf-bootstrap/examples/rust/target/release/build/tracecon-cbe3e5b4ae219d9a/build-script-build` (exit status: 101)
  --- stderr
  thread 'main' panicked at tracecon/build.rs:22:10:
  bpf compilation failed: Build("Failed to compile obj=/tmp/.tmpevJHx5/tracecon.o with status=exit status: 1
 stdout=
 
 stderr=
 ./src/bpf/tracecon.bpf.c:78:5: error: incomplete definition of type 'struct user_pt_regs'
   78 | int BPF_KPROBE(getaddrinfo_enter, const char *hostname, const char *service,
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   79 |                const struct addrinfo *hints, struct addrinfo **res)
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:469:20: note: expanded from macro 'BPF_KPROBE'
  469 |         return ____##name(___bpf_kprobe_args(args));                        \\
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:449:41: note: expanded from macro '___bpf_kprobe_args'
  449 | #define ___bpf_kprobe_args(args...)     ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args)
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_helpers.h:184:29: note: expanded from macro '___bpf_apply'
  184 | #define ___bpf_apply(fn, n) ___bpf_concat(fn, n)
      |                             ^
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:445:41: note: expanded from macro '___bpf_kprobe_args2'
  445 | #define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx)
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:444:72: note: expanded from macro '___bpf_kprobe_args1'
  444 | #define ___bpf_kprobe_args1(x)          ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx)
      |                                                                        ^~~~~~~~~~~~~~~~~~
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:272:44: note: expanded from macro 'PT_REGS_PARM1'
  272 | #define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)
      |                           ~~~~~~~~~~~~~~~~~^
./src/bpf/tracecon.bpf.c:78:5: note: forward declaration of 'struct user_pt_regs'
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:469:20: note: expanded from macro 'BPF_KPROBE'
  469 |         return ____##name(___bpf_kprobe_args(args));                        \\
      |                           ^
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:449:41: note: expanded from macro '___bpf_kprobe_args'
  449 | #define ___bpf_kprobe_args(args...)     ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args)
      |                                         ^
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_helpers.h:184:29: note: expanded from macro '___bpf_apply'
  184 | #define ___bpf_apply(fn, n) ___bpf_concat(fn, n)
      |                             ^
note: (skipping 5 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:444:72: note: expanded from macro '___bpf_kprobe_args1'
  444 | #define ___bpf_kprobe_args1(x)          ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx)
      |                                                                        ^
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:272:27: note: expanded from macro 'PT_REGS_PARM1'
  272 | #define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)
      |                           ^
/tmp/.tmp44XFnJ/bpf/src/bpf/bpf_tracing.h:168:42: note: expanded from macro '__PT_REGS_CAST'
  168 | #define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x))
      |                                          ^

The above error repeats 9 times.

The source of the error is the missing struct user_pt_regs in the examples/rust/tracecon/src/bpf/vmlinux.h

Placing the following code in the file seems to solve the issue:


/*
 * User structures for general purpose, floating point and debug registers.
 * Taken from /usr/include/asm/ptrace.h 
*/
struct user_pt_regs {
	__u64		regs[31];
	__u64		sp;
	__u64		pc;
	__u64		pstate;
};

As noted, the struct is borrowed from the relevant ptrace header for arm64.

I suspect it may be another instance of the "vendored" vmlinux.h being x86 specific (libbpf/libbpf-rs#615).

I don't have an ARM64 system at hand, but you can try out #248 and see if it fixes the issue @7anya