从'struct net *'分配到'u32'(又称'unsigned int')的整数转换指针不兼容。

问题描述 投票:0回答:1

我想要什么?

在execsnoop bcc工具中增加一个网络名称空间选项,只追踪指定网络名称空间的日志,就像我们在许多其他bcc工具中的过滤PID选项一样。例如:execsnoop -N "ns_id"

我正在使用linux内核结构来检索命名空间的id net = task->nsproxy->net_ns; 并需要将检索到的 ns 分配给 data.netns 也就是U32 int。

我正在做什么。

int syscall__execve(struct pt_regs *ctx,
    const char __user *filename,
    const char __user *const __user *__argv,
    const char __user *const __user *__envp)
{
    // create data here and pass to submit_arg to save stack space (#555)
    //int ret = PT_REGS_RC(ctx);
    struct data_t data = {};
    struct task_struct *task;
    struct nsproxy *nsproxy;
    struct net *net;
    //struct mnt_namespace *mnt_ns;

    data.pid = bpf_get_current_pid_tgid() >> 32;

    u32 net_ns_inum = 0;
    //net = (struct net *)get_net_ns_by_pid(data.pid); //
       //net_ns_inum = (uintptr_t)net;


    task = (struct task_struct *)bpf_get_current_task();
    // Some kernels, like Ubuntu 4.13.0-generic, return 0
    // as the real_parent->tgid.
    // We use the get_ppid function as a fallback in those cases. (#1883)

    data.ppid = task->real_parent->tgid;

    net = task->nsproxy->net_ns;
    FILTER_NETNS

    data.netns =  (uintptr_t)net; //here have to perform casting

我添加了 #include </usr/include/stdint.h> 但得到 警告 虽说 include <bits/libc-header-start.h> 在于 stdint.h 文件。

In file included from /virtual/main.c:8:
/usr/include/stdint.h:26:10: fatal error: 'bits/libc-header-start.h' file not found
#include <bits/libc-header-start.h>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~

如果我解决了这个文件,它就会一直产生其他缺失的头文件错误。

c pointers casting 64-bit bcc-bpf
1个回答
0
投票

我已经解决了这个问题。

我已经解决了这个问题:不使用 net = task->nsproxy->net_ns; 我用的是 net = task->nsproxy->net_ns->ns.inum; 是无符号的int,我们可以直接从它那里获取命名空间。

这个结构可以在 <linux/ns_common.h> 头文件。

struct ns_common {
    atomic_long_t stashed;
    const struct proc_ns_operations *ops;
    unsigned int inum;
};

要想在execsnoop工具中获得添加了命名空间选项的修改后的代码,请遵循这个链接。https:/github.comSheenam3ebpfblobmasterexecsnoop.py#L143。

© www.soinside.com 2019 - 2024. All rights reserved.