使用linux内核提供的c接口来加载bpf程序

有时候可能,你使用不了bcc等库。
这个时候就需要自己使用纯c来编译和load bpf程序,
在探索的过程中,遇到了各种文件找不到的情况。根据编译提示,最终在内核源码树中都找到了对应的文件和函数。所以,在自己使用纯c来加载bpf程序的时候,需要下载一份内核源码.以下为demo

#include <linux/bpf.h>
#define SEC(NAME) __attribute__((section(NAME), used))

static int (*bpf_trace_printk)(const char *fmt, int fmt_size,
                               ...) = (void *)BPF_FUNC_trace_printk;

SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx) {
  char msg[] = "Hello, BPF World!";
  bpf_trace_printk(msg, sizeof(msg));
  return 0;
}

SEC("socket")
int socket_prog(struct __sk_buff *skb) {
  return 0;
}

char _license[] SEC("license") = "GPL";

loader.c

#include "bpf_load.h"
#include <stdio.h>

int main(int argc, char **argv)
{
  if (load_bpf_file("bpf_program.o") != 0)
  {
    printf("The kernel didn't load the BPF program\n");
    return -1;
  }

  read_trace_pipe();

  return 0;
}

Makefile

CLANG = clang
EXECABLE = bpfload

BPFLOADER_C = /usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf/bpf_load.c  #link load_bpf_file symbol
CCINCLUDE += -I/usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf # bpf_load.h
CCINCLUDE += -I/usr/src/linux-source-4.15.0/linux-source-4.15.0/tools/lib # bpf/bpf.h
CCINCLUDE += -I/usr/src/linux-source-4.15.0/linux-source-4.15.0/tools/perf # perf-sys.h
CCINCLUDE += -I/usr/src/linux-source-4.15.0/linux-source-4.15.0/tools/include # <linux/compiler.h>

# -lelf 会默认去找 ./usr/lib/x86_64-linux-gnu/libelf.so 
# -lbpf 会默认去找 ./lib/x86_64-linux-gnu/libbpf.so

all:
	# -I 指定的路径是因为bpf程序需要asm/types.h
	$(CLANG) -O2 -target bpf -c bpf_program.c  -I /usr/include/x86_64-linux-gnu/  -o bpf_program.o 
	$(CLANG) -o $(EXECABLE)  \
		$(CCINCLUDE)\
		-lelf \
		-lbpf \
		loader.c \
		$(BPFLOADER_C)

clean:
	rm -f *.o *.so $(EXECABLE)

make之后,直接执行./bpfload,在执行新的进程时会看到

        bash-4680  [001] .... 29701.949067: 0x00000001: Hello, BPF World!
            bash-4681  [003] .... 29702.996513: 0x00000001: Hello, BPF World!
            cron-4690  [003] .... 29995.076190: 0x00000001: Hello, BPF World!
              sh-4691  [000] .... 29995.077007: 0x00000001: Hello, BPF World!
      debian-sa1-4691  [000] .... 29995.077569: 0x00000001: Hello, BPF World!
             sa1-4691  [000] .... 29995.078165: 0x00000001: Hello, BPF World!
            cron-4695  [003] .... 30115.089880: 0x00000001: Hello, BPF World!
              sh-4696  [000] .... 30115.090561: 0x00000001: Hello, BPF World!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值