[cfe-dev] BPF: question in regard to .rodata.cst32

Vincent Li via cfe-dev cfe-dev at lists.llvm.org
Fri Jan 28 10:21:27 PST 2022


Hi,

Hope this is the right place to ask questions, I ran into an issue in
https://github.com/cilium/cilium/issues/18616 where I have defined
macro in header file node_config.h like below:

grep 'VTEP' /var/run/cilium/state/globals/node_config.h

#define ENABLE_VTEP 1
#define VTEP_ENDPOINT (__u32[]){ 0xeb48a90a, 0xec48a90a, 0xed48a90a,
0xee48a90a, }
#define VTEP_MAC (__u64[]){ 0x562e984c3682, 0x552e984c3682,
0x542e984c3682, 0x532e984c3682, }
#define VTEP_NUMS 4

then the cilium bpf/bpf_lxc.c file include the node_config.h file and
code to use above macro like below:

#ifdef ENABLE_VTEP

        {
                int i;
                for (i = 0; i < VTEP_NUMS; i++) {
                        if (tunnel_endpoint == VTEP_ENDPOINT[i]) {
                                vtep_mac = VTEP_MAC[i];
                                break;
                       }
                }

                if (vtep_mac && tunnel_endpoint) {
                        if (eth_store_daddr(ctx, (__u8 *)&vtep_mac, 0) < 0)
                                return DROP_WRITE_ERROR;
                        return __encap_and_redirect_with_nodeid(ctx,
tunnel_endpoint,

 WORLD_ID, monitor);
                }
        }
#endif

cilium will invoke clang to compile the bpf_lxc.o like below:

clang ...CUT... -DENABLE_VTEP=1
-I/home/go/src/github.com/f5devcentral/cilium/bpf/include
-I/home/go/src/github.com/f5devcentral/cilium/bpf -D__NR_CPUS__=2 -O2
-g -target bpf -std=gnu89 -nostdinc -emit-llvm -Wall -Wextra -Werror
-Wshadow -Wno-address-of-packed-member -Wno-unknown-warning-option
-Wno-gnu-variable-sized-type-not-at-end -Wdeclaration-after-statement
-Wimplicit-int-conversion -Wenum-conversion -c bpf_lxc.c -o bpf_lxc.ll

llc -march=bpf -mattr=dwarfris -mcpu=v2 -filetype=obj -o bpf_lxc.o bpf_lxc.ll

the bpf_lxc.o file ended up with a .rodata.cst32 section like below

readelf -x .rodata.cst32 /var/run/cilium/state/1378_next_fail/bpf_lxc.o

Hex dump of section '.rodata.cst32':
  0x00000000 82364c98 2e560000 82364c98 2e550000 .6L..V...6L..U..
  0x00000010 82364c98 2e540000 82364c98 2e530000 .6L..T...6L..S..

as you can see the .rodata.cst32 contains the VTEP_MAC data.

but if I reduce the VTEP_ENDPOINT/VTEP_MAC member to 2 like below, no
any .rodata generated from the clang compiler

grep 'VTEP' /var/run/cilium/state/globals/node_config.h
#define ENABLE_VTEP 1
#define VTEP_ENDPOINT (__u32[]){ 0xeb48a90a, 0xec48a90a, }
#define VTEP_MAC (__u64[]){ 0x562e984c3682, 0x552e984c3682, }
#define VTEP_NUMS 2

readelf -e  /var/run/cilium/state/1378/bpf_lxc.o | grep 'rodata', nothing

The problem I have is cilium/ebpf fail to recognize .rodata.cst32 and
lead cilium to fail.

My question is why clang creates .rodata.cst32 when
VTEP_ENDPOINT/VTEP_MAC exceed 2 members, and why no rodata when the
member <= 2.

I assume cilium/ebpf project will likely to address the issue to
recognize .rodata.cst32, I am just wondering if there is anything from
clang BPF side that needs to be addressed.

Thank you for you patience to read this email :-)

Regards,

Vincent


More information about the cfe-dev mailing list