Skip to content

examples/c build fails with newer compilers (clang 21+) #368

@yachie-kicchou

Description

@yachie-kicchou

The following error is observed when building the C examples on Fedora 44 (clang 22) and Ubuntu 26.04 (clang 21):

root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap# git reset --hard --recurse-submodules
HEAD is now at 3859543 build(deps): bump libbpf-rs from 0.26.0 to 0.26.2 in /examples/rust
root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap# cd examples/c
root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap/examples/c# make
  LIB      libbpf.a
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/bpf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf.o
libbpf.c: In function 'kallsyms_cb':
libbpf.c:8191:13: error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
 8191 |         res = strstr(sym_name, ".llvm.");
      |             ^
libbpf.c: In function 'avail_kallsyms_cb':
libbpf.c:11470:31: error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
11470 |                 if (!(sym_sfx = strstr(sym_name, ".llvm.")))
      |                               ^
libbpf.c: In function 'resolve_full_path':
libbpf.c:12072:35: error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
12072 |                         next_path = strchr(s, ':');
      |                                   ^
At top level:
cc1: note: unrecognized command-line option '-Wno-unknown-warning-option' may have been intended to silence earlier diagnostics
cc1: all warnings being treated as errors
make[1]: *** [Makefile:137: /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf.o] Error 1
make: *** [Makefile:87: /host-share/432670/libbpf-bootstrap/examples/c/.output/libbpf.a] Error 2
root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap/examples/c# clang --version
Ubuntu clang version 21.1.8 (6ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-21/bin
root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap/examples/c# 

The build works fine on Ubuntu 24.04 (clang 18):

root@scuffed-noble:/host-share/432670/libbpf-bootstrap# cd examples/c/
root@scuffed-noble:/host-share/432670/libbpf-bootstrap/examples/c# make
  LIB      libbpf.a
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf_errno.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/netlink.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/nlattr.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/str_error.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf_probes.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/bpf_prog_linfo.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_dump.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/hashmap.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/ringbuf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/strset.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/linker.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/gen_loader.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/relo_core.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/usdt.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/zip.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/elf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/features.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_iter.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_relocate.o
  AR       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.a
  INSTALL  bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h bpf_helpers.h bpf_helper_defs.h bpf_tracing.h bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h usdt.bpf.h
  INSTALL  /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.pc
  INSTALL  /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.a 
  BPF      .output/minimal.bpf.o
  GEN-SKEL .output/minimal.skel.h
  CC       .output/minimal.o
  BINARY   minimal
  BPF      .output/minimal_legacy.bpf.o
  GEN-SKEL .output/minimal_legacy.skel.h
  CC       .output/minimal_legacy.o
  BINARY   minimal_legacy
  BPF      .output/minimal_ns.bpf.o
  GEN-SKEL .output/minimal_ns.skel.h
  CC       .output/minimal_ns.o
  BINARY   minimal_ns
  BPF      .output/bootstrap.bpf.o
  GEN-SKEL .output/bootstrap.skel.h
  CC       .output/bootstrap.o
  BINARY   bootstrap
  BPF      .output/bootstrap_legacy.bpf.o
  GEN-SKEL .output/bootstrap_legacy.skel.h
  CC       .output/bootstrap_legacy.o
  BINARY   bootstrap_legacy
  BPF      .output/uprobe.bpf.o
  GEN-SKEL .output/uprobe.skel.h
  CC       .output/uprobe.o
  BINARY   uprobe
  BPF      .output/kprobe.bpf.o
  GEN-SKEL .output/kprobe.skel.h
  CC       .output/kprobe.o
  BINARY   kprobe
  BPF      .output/fentry.bpf.o
  GEN-SKEL .output/fentry.skel.h
  CC       .output/fentry.o
  BINARY   fentry
  BPF      .output/usdt.bpf.o
  GEN-SKEL .output/usdt.skel.h
  CC       .output/usdt.o
  BINARY   usdt
  BPF      .output/sockfilter.bpf.o
  GEN-SKEL .output/sockfilter.skel.h
  CC       .output/sockfilter.o
  BINARY   sockfilter
  BPF      .output/tc.bpf.o
  GEN-SKEL .output/tc.skel.h
  CC       .output/tc.o
  BINARY   tc
  BPF      .output/ksyscall.bpf.o
  GEN-SKEL .output/ksyscall.skel.h
  CC       .output/ksyscall.o
  BINARY   ksyscall
  BPF      .output/task_iter.bpf.o
  GEN-SKEL .output/task_iter.skel.h
  CC       .output/task_iter.o
  BINARY   task_iter
  BPF      .output/lsm.bpf.o
  GEN-SKEL .output/lsm.skel.h
  CC       .output/lsm.o
  BINARY   lsm
root@scuffed-noble:/host-share/432670/libbpf-bootstrap/examples/c# clang --version
Ubuntu clang version 18.1.3 (1ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
root@scuffed-noble:/host-share/432670/libbpf-bootstrap/examples/c# 

A workaround is to append -Wno-discarded-qualifiers to CFLAGS:

root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap/examples/c# CFLAGS+=-Wno-discarded-qualifiers make
  MKDIR    .output
  MKDIR    .output/libbpf
  LIB      libbpf.a
  MKDIR    /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/bpf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf.o
libbpf.c: In function 'kallsyms_cb':
libbpf.c:8191:13: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
 8191 |         res = strstr(sym_name, ".llvm.");
      |             ^
libbpf.c: In function 'avail_kallsyms_cb':
libbpf.c:11470:31: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
11470 |                 if (!(sym_sfx = strstr(sym_name, ".llvm.")))
      |                               ^
libbpf.c: In function 'resolve_full_path':
libbpf.c:12072:35: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
12072 |                         next_path = strchr(s, ':');
      |                                   ^
At top level:
cc1: note: unrecognized command-line option '-Wno-unknown-warning-option' may have been intended to silence earlier diagnostics
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf_errno.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/netlink.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/nlattr.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/str_error.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/libbpf_probes.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/bpf_prog_linfo.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_dump.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/hashmap.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/ringbuf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/strset.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/linker.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/gen_loader.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/relo_core.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/usdt.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/zip.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/elf.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/features.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_iter.o
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/staticobjs/btf_relocate.o
  AR       /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.a
  INSTALL  bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h bpf_helpers.h bpf_helper_defs.h bpf_tracing.h bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h usdt.bpf.h
  INSTALL  /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.pc
  INSTALL  /host-share/432670/libbpf-bootstrap/examples/c/.output//libbpf/libbpf.a 
  MKDIR    bpftool
  BPFTOOL  bpftool/bootstrap/bpftool
...                        libbfd: [ OFF ]
...               clang-bpf-co-re: [ on  ]
...                          llvm: [ on  ]
...                        libcap: [ OFF ]
mkdir -p /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/libbpf/include/bpf
mkdir -p /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/
mkdir -p /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/libbpf/
  MKDIR    /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/libbpf/staticobjs
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/libbpf/staticobjs/bpf.o
bpf.c: In function 'alloc_zero_tailing_info':
bpf.c:219:23: warning: comparison of integer expressions of different signedness: 'int' and '__u32' {aka 'unsigned int'} [-Wsign-compare]
  219 |         for (i = 0; i < cnt; i++) {
      |                       ^
At top level:
cc1: note: unrecognized command-line option '-Wno-unknown-warning-option' may have been intended to silence earlier diagnostics
  CC       /host-share/432670/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/libbpf/staticobjs/btf.o
btf.c: In function 'btf_type_by_id':
btf.c:625:21: warning: comparison of integer expressions of different signedness: '__u32' {aka 'unsigned int'} and 'int' [-Wsign-compare]
  625 |         if (type_id < btf->start_id)
      |                     ^
btf.c: In function 'determine_ptr_size':
btf.c:672:31: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
  672 |                 for (j = 0; j < ARRAY_SIZE(long_aliases); j++) {
      |                               ^
btf.c: In function 'btf_ptr_sz':
btf.c:685:51: warning: operand of '?:' changes signedness from 'int' to 'long unsigned int' due to unsignedness of other operand [-Wsign-compare]
  685 |         return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
      |                                                   ^~~~~~~~~~~
btf.c: In function 'btf_parse_raw':
btf.c:1266:35: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'long int' [-Wsign-compare]
 1266 |         if (fread(data, 1, sz, f) < sz) {
      |                                   ^
btf.c: In function 'btf_get_raw_data':
btf.c:1442:31: warning: comparison of integer expressions of different signedness: 'int' and '__u32' {aka 'unsigned int'} [-Wsign-compare]
 1442 |                 for (i = 0; i < btf->nr_types; i++) {
      |                               ^
btf.c: In function 'btf__str_by_offset':
btf.c:1489:20: warning: comparison of integer expressions of different signedness: '__u32' {aka 'unsigned int'} and 'int' [-Wsign-compare]
 1489 |         if (offset < btf->start_str_off)
      |                    ^
btf.c: In function 'validate_type_id':
btf.c:2004:26: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
 2004 |         if (id < 0 || id > BTF_MAX_NR_TYPES)
      |                          ^
btf.c: In function 'btf_dedup_clear_hypot_map':
btf.c:3337:23: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
 3337 |         for (i = 0; i < d->hypot_cnt; i++)
      |                       ^

[warnings continue but build completes successfully]

  BINARY   tc
  BPF      .output/ksyscall.bpf.o
  GEN-SKEL .output/ksyscall.skel.h
  CC       .output/ksyscall.o
  BINARY   ksyscall
  BPF      .output/task_iter.bpf.o
  GEN-SKEL .output/task_iter.skel.h
  CC       .output/task_iter.o
  BINARY   task_iter
  BPF      .output/lsm.bpf.o
  GEN-SKEL .output/lsm.skel.h
  CC       .output/lsm.o
  BINARY   lsm
root@scuffed-ubuntu:/host-share/432670/libbpf-bootstrap/examples/c# clang --version
Ubuntu clang version 21.1.8 (6ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-21/bin

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions