title: Error compiling eBPF C code out of kernel tree
body: <p>I'm trying to build a BPF program written in C into the bpf bytecode needed to load it. I used this post to try to start me off: <a href="https://blogs.oracle.com/linux/notes-on-bpf-4" rel="nofollow noreferrer">https://blogs.oracle.com/linux/notes-on-bpf-4</a></p>
  
  <p>I do not want to use BCC due to the library dependency. I'm using ubuntu 18.04 (Linux bpf-ubuntu 4.15.0-1036-gcp #38-Ubuntu SMP Mon Jun 24 13:49:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux)</p>
  
  <p>My file is super simple (and possibly incorrect) at the moment as I'm still trying to get compiling to work:</p>
  
  <pre class="lang-c prettyprint-override"><code>#include &lt;linux/version.h&gt;
  #include &lt;uapi/linux/bpf.h&gt;
  #include "bpf_helpers.h"
  #include &lt;net/sock.h&gt;
  
  SEC("kprobe/tcp_connect")
  int bpf_prog1(struct pt_regs *ctx) {
          struct sock *sk;
          sk = (struct sock*) PT_REGS_PARM1(ctx);
          bpf_trace_printk("%s\n","Got tcp_connect");
  }
  
  char _license[] SEC("license") = "GPL";
  u32 _version SEC("version") = LINUX_VERSION_CODE;
  </code></pre>
  
  <p>The command being used to build and result is:</p>
  
  <pre><code>clang -nostdinc -isystem `clang -print-file-name=include` \
                  -D__KERNEL__ -D__ASM_SYSREG_H \
                  -Wno-unused-value -Wno-pointer-sign \
                  -Wno-compare-distinct-pointer-types \
                  -Wno-gnu-variable-sized-type-not-at-end \
                  -Wno-address-of-packed-member -Wno-tautological-compare \
                  -Wno-unknown-warning-option \
                  -I../include -I/usr/src/linux-headers-`uname -r`/include -I/usr/src/linux-headers-`uname -r`/arch/x86/include -I/usr/src/linux-headers-`uname -r`/arch/x86/include/uapi -I/usr/src/linux-headers-`uname -r`/arch/x86/include/generated/uapi -I/usr/src/linux-headers-`uname -r`/include/generated/uapi -I/usr/src/linux-headers-`uname -r`/include/uapi \
                  -O2 -emit-llvm -c net_mon_kern.c -o -| llc -march=bpf -filetype=obj -o net_mon_kern.o
  In file included from net_mon_kern.c:7:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/net/sock.h:43:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/hardirq.h:5:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/preempt.h:11:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/list.h:9:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/kernel.h:11:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/bitops.h:18:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/bitops.h:514:
  /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/arch_hweight.h:55:42: error: expected ')'
          asm (ALTERNATIVE("call __sw_hweight64", POPCNT64, X86_FEATURE_POPCNT)
                                                  ^
  /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/arch_hweight.h:55:6: note: to match this '('
          asm (ALTERNATIVE("call __sw_hweight64", POPCNT64, X86_FEATURE_POPCNT)
              ^
  In file included from net_mon_kern.c:7:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/net/sock.h:43:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/hardirq.h:5:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/preempt.h:81:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/preempt.h:7:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/thread_info.h:38:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/thread_info.h:12:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/page.h:14:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/page_32.h:35:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/string.h:19:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/string.h:5:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/string_64.h:6:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/jump_label.h:188:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/atomic.h:5:
  In file included from /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/atomic.h:276:
  /usr/src/linux-headers-4.15.0-1036-gcp/arch/x86/include/asm/atomic64_64.h:20:40: error: unknown type name
        'atomic64_t'; did you mean 'atomic_t'?
  static inline long atomic64_read(const atomic64_t *v)
                                         ^~~~~~~~~~
                                         atomic_t
  /usr/src/linux-headers-4.15.0-1036-gcp/include/linux/types.h:178:3: note: 'atomic_t' declared here
  } atomic_t;
    ^
  
  18 more errors relating to atomic64_t...
  </code></pre>
  
  <p>I'm not really sure how to troubleshoot that. I can only assume the way I'm including the headers is not correct.</p>