lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7219135.9fee.19b8e385eb5.Coremail.kiraskyler@163.com>
Date: Mon, 5 Jan 2026 20:53:37 +0800 (CST)
From: "WanLi Niu" <kiraskyler@....com>
To: "Jose E. Marchesi" <jose.marchesi@...cle.com>
Cc: "Quentin Monnet" <qmo@...nel.org>, "Alexei Starovoitov" <ast@...nel.org>,
	"Daniel Borkmann" <daniel@...earbox.net>,
	"Andrii Nakryiko" <andrii@...nel.org>,
	"Martin KaFai Lau" <martin.lau@...ux.dev>,
	"Eduard Zingerman" <eddyz87@...il.com>, "Song Liu" <song@...nel.org>,
	"Yonghong Song" <yonghong.song@...ux.dev>,
	"John Fastabend" <john.fastabend@...il.com>,
	"KP Singh" <kpsingh@...nel.org>,
	"Stanislav Fomichev" <sdf@...ichev.me>,
	"Hao Luo" <haoluo@...gle.com>, "Jiri Olsa" <jolsa@...nel.org>,
	"Menglong Dong" <menglong8.dong@...il.com>, bpf@...r.kernel.org,
	linux-kernel@...r.kernel.org, "WanLi Niu" <niuwl1@...natelecom.cn>,
	"Menglong Dong" <dongml2@...natelecom.cn>
Subject: Re: [PATCH v4 bpf-next] bpftool: Make skeleton C++ compatible with
 explicit casts

> FWIW I tested the reproducer with gcc-bpf and got no pointer conversion
> warnings (not that I was expecting anything different, but just in
> case):
>
>  $ bpf-unknown-none-gcc -std=gnu11 -I./tools/include -g -O2 -c text.bpf.c -o test.bpf.o
>  $ bpftool gen skeleton test.bpf.o -L > test.bpf.skel.h
>  $ g++ -c test.cpp -I.

Thanks for testing.

The issue only occurs when bpftool gen skeleton is used in use_loader mode (bpftool gen skeleton -L|--use-loader).

Could you double-check if -L was included? I can reproduce the error reliably with it — here’s the full output:

$ rpm -qf `which bpf-unknown-none-gcc`
gcc-bpf-unknown-none-15.2.1-1.fc42.x86_64
$ bpf-unknown-none-gcc -std=gnu11 -I/usr/include -g -O2 -c test.bpf.c -o test.bpf.o
$ bpftool gen skeleton test.bpf.o -L > test.bpf.skel.h
libbpf: elf: skipping section(2) .data (size 0)
libbpf: elf: skipping unrecognized data section(7) .comment
libbpf: prog 'handle': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.
$ g++ -c test.cpp -I.
In file included from test.cpp:4:
test.bpf.skel.h: In function ‘test_bpf* test_bpf__open()’:
test.bpf.skel.h:65:26: error: invalid conversion from ‘void*’ to ‘test_bpf*’ [-fpermissive]
   65 |         skel = skel_alloc(sizeof(*skel));
      |                ~~~~~~~~~~^~~~~~~~~~~~~~~
      |                          |
      |                          void*
test.bpf.skel.h:68:55: error: invalid use of ‘void’
   68 |         skel->ctx.sz = (void *)&skel->links - (void *)skel;
      |                                                       ^~~~
test.bpf.skel.h:73:47: error: invalid conversion from ‘void*’ to ‘test_bpf::test_bpf__bss*’ [-fpermissive]
   73 |                 skel->bss = skel_prep_map_data((void *)data, 4096,
      |                             ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
      |                                               |
      |                                               void*
   74 |                                                 sizeof(data) - 1);
      |                                                 ~~~~~~~~~~~~~~~~~
test.bpf.skel.h: In function ‘int test_bpf__load(test_bpf*)’:
test.bpf.skel.h:196:43: error: invalid conversion from ‘void*’ to ‘test_bpf::test_bpf__bss*’ [-fpermissive]
  196 |         skel->bss = skel_finalize_map_data(&skel->maps.bss.initial_value,
      |                     ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                           |
      |                                           void*
  197 |                                         4096, PROT_READ | PROT_WRITE, skel->maps.bss.map_fd);
      |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ cat test.bpf.skel.h 
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
#ifndef __TEST_BPF_SKEL_H__
#define __TEST_BPF_SKEL_H__

#include <bpf/skel_internal.h>

struct test_bpf {
        struct bpf_loader_ctx ctx;
        struct {
                struct bpf_map_desc bss;
        } maps;
        struct {
                struct bpf_prog_desc handle;
        } progs;
        struct {
                int handle_fd;
        } links;
        struct test_bpf__bss {
                int val;
        } *bss;
};

static inline int
test_bpf__handle__attach(struct test_bpf *skel)
{
        int prog_fd = skel->progs.handle.prog_fd;
        int fd = skel_raw_tracepoint_open("sched_wakeup_new", prog_fd);

        if (fd > 0)
                skel->links.handle_fd = fd;
        return fd;
}

static inline int
test_bpf__attach(struct test_bpf *skel)
{
        int ret = 0;

        ret = ret < 0 ? ret : test_bpf__handle__attach(skel);
        return ret < 0 ? ret : 0;
}

static inline void
test_bpf__detach(struct test_bpf *skel)
{
        skel_closenz(skel->links.handle_fd);
}
static void
test_bpf__destroy(struct test_bpf *skel)
{
        if (!skel)
                return;
        test_bpf__detach(skel);
        skel_closenz(skel->progs.handle.prog_fd);
        skel_free_map_data(skel->bss, skel->maps.bss.initial_value, 4096);
        skel_closenz(skel->maps.bss.map_fd);
        skel_free(skel);
}
static inline struct test_bpf *
test_bpf__open(void)
{
        struct test_bpf *skel;

        skel = skel_alloc(sizeof(*skel));
        if (!skel)
                goto cleanup;
        skel->ctx.sz = (void *)&skel->links - (void *)skel;
        {
                static const char data[] __attribute__((__aligned__(8))) = "\
\0\0\0\0";

                skel->bss = skel_prep_map_data((void *)data, 4096,
                                                sizeof(data) - 1);
                if (!skel->bss)
                        goto cleanup;
                skel->maps.bss.initial_value = (__u64) (long) skel->bss;
        }
        return skel;
cleanup:
        test_bpf__destroy(skel);
        return NULL;
}

static inline int
test_bpf__load(struct test_bpf *skel)
{
        struct bpf_load_and_run_opts opts = {};
        int err;
        static const char opts_data[] __attribute__((__aligned__(8))) = "\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9f\xeb\x01\0\
\x18\0\0\0\0\0\0\0\x64\0\0\0\x64\0\0\0\x41\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\
\x18\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\
\x02\0\0\0\0\x13\0\0\0\0\0\0\x0e\x02\0\0\0\x01\0\0\0\x0c\0\0\0\x01\0\0\x0c\x01\
\0\0\0\x3c\0\0\0\x01\0\0\x0f\x04\0\0\0\x04\0\0\0\0\0\0\0\x04\0\0\0\0\x68\x61\
\x6e\x64\x6c\x65\0\x69\x6e\x74\0\x68\x61\x6e\x64\x6c\x65\0\x76\x61\x6c\0\0\x63\
\x74\x78\0\x72\x61\x77\x5f\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\
\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x5f\x6e\x65\x77\0\x2e\x62\x73\x73\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\
\0\x04\0\0\0\x04\0\0\0\x01\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x74\x65\x73\x74\x5f\
\x62\x70\x66\x2e\x62\x73\x73\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\
\0\0\0\0\0\0\0\0\x05\0\0\0\x11\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x68\x61\x6e\x64\x6c\x65\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\x10\0\0\0\0\0\0\0";
        static const char opts_insn[] __attribute__((__aligned__(8))) = "\
\xbf\x16\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x78\xff\xff\xff\xb7\x02\0\
\0\x88\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x05\0\x11\0\0\0\0\0\x61\
\xa1\x78\xff\0\0\0\0\xd5\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa1\x7c\xff\
\0\0\0\0\xd5\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa1\x80\xff\0\0\0\0\xd5\
\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\
\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\
\xbf\x70\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\x60\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\
\0\0\0\0\0\xd8\x05\0\0\x63\x01\0\0\0\0\0\0\x61\x60\x0c\0\0\0\0\0\x18\x61\0\0\0\
\0\0\0\0\0\0\0\xd4\x05\0\0\x63\x01\0\0\0\0\0\0\x79\x60\x10\0\0\0\0\0\x18\x61\0\
\0\0\0\0\0\0\0\0\0\xc8\x05\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\
\0\x05\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xc0\x05\0\0\x7b\x01\0\0\0\0\0\0\xb7\x01\
\0\0\x12\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\xc0\x05\0\0\xb7\x03\0\0\x1c\0\0\0\
\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\xd7\xff\0\0\0\0\x63\x7a\x78\
\xff\0\0\0\0\x61\xa0\x78\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x10\x06\0\0\
\x63\x01\0\0\0\0\0\0\x61\x60\x1c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\
\0\0\0\0\0\0\xec\x05\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\
\0\0\0\0\0\0\0\xe0\x05\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\
\0\0\0\0\0\xc5\x07\xc6\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\x71\
\0\0\0\0\0\0\x79\x63\x20\0\0\0\0\0\x15\x03\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\
\0\0\0\x28\x06\0\0\xb7\x02\0\0\x04\0\0\0\x61\x60\x04\0\0\0\0\0\x45\0\x02\0\x01\
\0\0\0\x85\0\0\0\x94\0\0\0\x05\0\x01\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x18\x62\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\x61\x20\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x38\
\x06\0\0\x63\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x30\x06\0\0\x18\x61\0\
\0\0\0\0\0\0\0\0\0\x40\x06\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\
\x28\x06\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x48\x06\0\0\x7b\x01\0\0\0\0\0\0\xb7\
\x01\0\0\x02\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\x38\x06\0\0\xb7\x03\0\0\x20\0\0\
\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\xa2\xff\0\0\0\0\x18\x60\0\0\
\0\0\0\0\0\0\0\0\x58\x06\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x88\x06\0\0\x7b\x01\0\
\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x60\x06\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
\x80\x06\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x70\x06\0\0\x18\
\x61\0\0\0\0\0\0\0\0\0\0\xc8\x06\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\
\0\0\0\x78\x06\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xd8\x06\0\0\x7b\x01\0\0\0\0\0\0\
\x18\x60\0\0\0\0\0\0\0\0\0\0\x78\x06\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xf8\x06\0\
\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\
\0\0\0\0\xf0\x06\0\0\x7b\x01\0\0\0\0\0\0\x61\x60\x08\0\0\0\0\0\x18\x61\0\0\0\0\
\0\0\0\0\0\0\x90\x06\0\0\x63\x01\0\0\0\0\0\0\x61\x60\x0c\0\0\0\0\0\x18\x61\0\0\
\0\0\0\0\0\0\0\0\x94\x06\0\0\x63\x01\0\0\0\0\0\0\x79\x60\x10\0\0\0\0\0\x18\x61\
\0\0\0\0\0\0\0\0\0\0\x98\x06\0\0\x7b\x01\0\0\0\0\0\0\x61\xa0\x78\xff\0\0\0\0\
\x18\x61\0\0\0\0\0\0\0\0\0\0\xc0\x06\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\x05\0\
\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\x78\x06\0\0\xb7\x03\0\0\x8c\0\0\0\x85\0\0\0\
\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\x6d\xff\0\0\0\0\x63\x7a\x80\xff\0\0\0\0\
\x61\xa1\x78\xff\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\
\xa8\0\0\0\x61\xa0\x80\xff\0\0\0\0\x63\x06\x28\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x18\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\
\0\0\0\0\0\0\0";
        opts.ctx = (struct bpf_loader_ctx *)skel;
        opts.data_sz = sizeof(opts_data) - 1;
        opts.data = (void *)opts_data;
        opts.insns_sz = sizeof(opts_insn) - 1;
        opts.insns = (void *)opts_insn;

        err = bpf_load_and_run(&opts);
        if (err < 0)
                return err;
        skel->bss = skel_finalize_map_data(&skel->maps.bss.initial_value,
                                        4096, PROT_READ | PROT_WRITE, skel->maps.bss.map_fd);
        if (!skel->bss)
                return -ENOMEM;
        return 0;
}

static inline struct test_bpf *
test_bpf__open_and_load(void)
{
        struct test_bpf *skel;

        skel = test_bpf__open();
        if (!skel)
                return NULL;
        if (test_bpf__load(skel)) {
                test_bpf__destroy(skel);
                return NULL;
        }
        return skel;
}

__attribute__((unused)) static void
test_bpf__assert(struct test_bpf *s __attribute__((unused)))
{
#ifdef __cplusplus
#define _Static_assert static_assert
#endif
        _Static_assert(sizeof(s->bss->val) == 4, "unexpected size of 'val'");
#ifdef __cplusplus
#undef _Static_assert
#endif
}

#endif /* __TEST_BPF_SKEL_H__ */

At 2026-01-05 19:50:25, "Jose E. Marchesi" <jose.marchesi@...cle.com> wrote:
>
>FWIW I tested the reproducer with gcc-bpf and got no pointer conversion
>warnings (not that I was expecting anything different, but just in
>case):
>
> $ bpf-unknown-none-gcc -std=gnu11 -I./tools/include -g -O2 -c text.bpf.c -o test.bpf.o
> $ bpftool gen skeleton test.bpf.o -L > test.bpf.skel.h
> $ g++ -c test.cpp -I.
>
>> From: WanLi Niu <niuwl1@...natelecom.cn>
>>
>> Fix C++ compilation errors in generated skeleton by adding explicit
>> pointer casts and using integer subtraction for offset calculation.
>>
>> Use struct outer::inner syntax under __cplusplus to access nested skeleton map
>> structs, ensuring C++ compilation compatibility while preserving C support
>>
>> error: invalid conversion from 'void*' to '<obj_name>*' [-fpermissive]
>>       |         skel = skel_alloc(sizeof(*skel));
>>       |                ~~~~~~~~~~^~~~~~~~~~~~~~~
>>       |                          |
>>       |                          void*
>>
>> error: arithmetic on pointers to void
>>       |         skel->ctx.sz = (void *)&skel->links - (void *)skel;
>>       |                        ~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~
>>
>> error: assigning to 'struct <obj_name>__<ident> *' from incompatible type 'void *'
>>       |                 skel-><ident> = skel_prep_map_data((void *)data, 4096,
>>       |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>       |                                                 sizeof(data) - 1);
>>       |                                                 ~~~~~~~~~~~~~~~~~
>>
>> error: assigning to 'struct <obj_name>__<ident> *' from incompatible type 'void *'
>>       |         skel-><ident> = skel_finalize_map_data(&skel->maps.<ident>.initial_value,
>>       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>       |                                         4096, PROT_READ | PROT_WRITE, skel->maps.<ident>.map_fd);
>>       |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> Minimum reproducer:
>>
>> 	$ cat test.bpf.c
>> 	int val; // placed in .bss section
>>
>> 	#include "vmlinux.h"
>> 	#include <bpf/bpf_helpers.h>
>>
>> 	SEC("raw_tracepoint/sched_wakeup_new") int handle(void *ctx) { return 0; }
>>
>> 	$ cat test.cpp
>> 	#include <cerrno>
>>
>> 	extern "C" {
>> 	#include "test.bpf.skel.h"
>> 	}
>>
>> 	$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
>> 	$ clang -g -O2 -target bpf -c test.bpf.c -o test.bpf.o
>> 	$ bpftool gen skeleton test.bpf.o -L  > test.bpf.skel.h
>> 	$ g++ -c test.cpp -I.
>>
>> Signed-off-by: WanLi Niu <niuwl1@...natelecom.cn>
>> Co-developed-by: Menglong Dong <dongml2@...natelecom.cn>
>> Signed-off-by: Menglong Dong <dongml2@...natelecom.cn>
>> ---
>> changelog:
>> v4:
>> - Add a minimum reproducer to demonstrate the issue, as suggested by Yonghong Song
>>
>> v3: https://lore.kernel.org/all/20260104021402.2968-1-kiraskyler@163.com/
>> - Fix two additional <obj_name>__<ident> type mismatches as suggested by Yonghong Song
>>
>> v2: https://lore.kernel.org/all/20251231102929.3843-1-kiraskyler@163.com/
>> - Use generic (struct %1$s *) instead of project-specific (struct trace_bpf *)
>>
>> v1: https://lore.kernel.org/all/20251231092541.3352-1-kiraskyler@163.com/
>> ---
>>  tools/bpf/bpftool/gen.c | 16 ++++++++++++----
>>  1 file changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c
>> index 993c7d9484a4..010861b7d0ea 100644
>> --- a/tools/bpf/bpftool/gen.c
>> +++ b/tools/bpf/bpftool/gen.c
>> @@ -731,10 +731,10 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
>>  		{							    \n\
>>  			struct %1$s *skel;				    \n\
>>  									    \n\
>> -			skel = skel_alloc(sizeof(*skel));		    \n\
>> +			skel = (struct %1$s *)skel_alloc(sizeof(*skel));    \n\
>>  			if (!skel)					    \n\
>>  				goto cleanup;				    \n\
>> -			skel->ctx.sz = (void *)&skel->links - (void *)skel; \n\
>> +			skel->ctx.sz = (__u64)&skel->links - (__u64)skel;   \n\
>>  		",
>>  		obj_name, opts.data_sz);
>>  	bpf_object__for_each_map(map, obj) {
>> @@ -755,13 +755,17 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
>>  		\n\
>>  		\";							    \n\
>>  									    \n\
>> +		#ifdef __cplusplus                                          \n\
>> +				skel->%1$s = (struct %3$s::%3$s__%1$s *)skel_prep_map_data((void *)data, %2$zd,\n\
>> +		#else                                                       \n\
>>  				skel->%1$s = skel_prep_map_data((void *)data, %2$zd,\n\
>> +		#endif							    \n\
>>  								sizeof(data) - 1);\n\
>>  				if (!skel->%1$s)			    \n\
>>  					goto cleanup;			    \n\
>>  				skel->maps.%1$s.initial_value = (__u64) (long) skel->%1$s;\n\
>>  			}						    \n\
>> -			", ident, bpf_map_mmap_sz(map));
>> +			", ident, bpf_map_mmap_sz(map), obj_name);
>>  	}
>>  	codegen("\
>>  		\n\
>> @@ -857,12 +861,16 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
>>  
>>  		codegen("\
>>  		\n\
>> +		#ifdef __cplusplus					    \n\
>> +			skel->%1$s = (struct %4$s::%4$s__%1$s *)skel_finalize_map_data(&skel->maps.%1$s.initial_value,\n\
>> +		#else							    \n\
>>  			skel->%1$s = skel_finalize_map_data(&skel->maps.%1$s.initial_value,  \n\
>> +		#endif							    \n\
>>  							%2$zd, %3$s, skel->maps.%1$s.map_fd);\n\
>>  			if (!skel->%1$s)				    \n\
>>  				return -ENOMEM;				    \n\
>>  			",
>> -		       ident, bpf_map_mmap_sz(map), mmap_flags);
>> +		       ident, bpf_map_mmap_sz(map), mmap_flags, obj_name);
>>  	}
>>  	codegen("\
>>  		\n\

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ