bpf-developer-tutorial icon indicating copy to clipboard operation
bpf-developer-tutorial copied to clipboard

我在abc.bpf. c中 需要ring buffer,即使我不需要abc. h这样一个头文件,但是只要abc.bpf. c文件不include abc.h,ecli run就会显示export map named rb found,but no export type is provide。我为什么一定需要自定义一个头文件并且引用?为什么不能将头文件中的结构体类型直接放在. c文件中?否则就不能运行?

Open Starryu opened this issue 1 year ago • 3 comments

主要定义ringbuf的 SEC(". map")就会出错

Starryu avatar Jan 13 '24 05:01 Starryu

Now ecc only supports detecting data struct definition from the header abc.h

Officeyutong avatar Jan 13 '24 07:01 Officeyutong

我们需要对应的类型信息,来确保 ecli 能正确的把对应的信息格式输出到用户态

yunwei37 avatar Jan 13 '24 11:01 yunwei37

我们需要对应的类型信息,来确保 ecli 能正确的把对应的信息格式输出到用户态

是指所有的struct都应该定义在头文件中吗,我在内核态需要强转tracing 函数的入参,强转的结构体需要在. h中定义,还是在. c文件定义也可以。 我现在遇到一个问题,强转的结构体是对照sys/kernel/debug/tracing/events/syscalls/某个系统调用/format里找到定义,假设是例如int a,int b,int c。我现在参考这个定义一个结构体,因为我hook的函数里入参是一个void指针,我需要强转。现在问题来了,及时我定义一样的结构体,解析第一个字段就会出现offset 越界,但是我可以确定我的结构体没有问题,因为我如果将结构体的前几位设置成同样大小的pading,例如int是4位,我设置的强转用的结构体是{pading[8]; int c_formyuse } 那我就可以将c_formyuse解析出来,而如果反过来我定义的是 是{ int a_formyuse pading[8]; } 那就会提示a_formyuse出错,似乎是越界。这是为什么?

Starryu avatar Jan 13 '24 13:01 Starryu