Skip to content

Document compilation options #231

@qmonnet

Description

@qmonnet

Context

I've been looking at why -g -O2 is necessary when compiling from C to eBPF with clang. It's not documented as far as I know, and I haven't been able to find the specific reasons again. I'm sure I saw them on mailing lists in the past, but I can't find it now.

Disclaimer

I realise this may be outside of the scope of this documentation, I note that you don't really mention how to compile with clang, or much of the ecosystem in general. I thought I'd open the issue as a suggestion, anyway - feel free to close if it's not relevant.

Description

So it would be nice to have some documentation about why one needs to pass -g and -O2 to clang when compiling.

For -g it's easy, it's necessary to get 1) debug information about the program, in particular the C source code that we dump with bpftool or llvm-objdump, for inspection, and 2) more importantly for many use case, BTF info.

For -O2 it's more tricky, everybody agrees it's necessary, but it's hard to find out why, precisely. From what I remember - and I may be totally wrong here - it may be related to:

  • more dead code elimination, although the verifier can now suppress dead code for programs loaded by root, but removing it beforehand still reduces the size of the program to validate
  • simplification of the flow graph, meaning again a smaller program to validate
  • loop unrolling, although this is less relevant nowadays
  • more inlining, meaning less stack usage
  • improved register usage, fewer spills to stack
  • something to do with variables relocation, but I can't remember the details
  • ...?

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