Skip to content

Commit

Permalink
Merge pull request #173 from iovisor/kernel-header-fixes
Browse files Browse the repository at this point in the history
ClangParser: Don't exit if kernel headers are not found
  • Loading branch information
brendangregg committed Oct 16, 2018
2 parents 2a906eb + 66c549b commit 08f2b3c
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 27 deletions.
7 changes: 0 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,6 @@ BPFtrace is a high-level tracing language for Linux enhanced Berkeley Packet Fil

To learn more about BPFtrace, see the [Reference Guide](docs/reference_guide.md) and [One-Liner Tutorial](docs/tutorial_one_liners.md).

BPFTrace depends on the kernel headers which are searched for by default in:

```bash
/lib/modules/$(uname -r)
```
The default search directory could be overridden using the environment variable BPFTRACE_KERNEL_HEADERS.

## Install

For build and install instructions, see [INSTALL.md](INSTALL.md).
Expand Down
10 changes: 10 additions & 0 deletions docs/reference_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -1778,3 +1778,13 @@ BPF programs that operate on many data items may hit this limit. There are a num
1. Split your program over multiple probes.
1. Check the status of the BPF stack limit in Linux (it may be increased in the future, maybe as a tuneabe).
1. (advanced): Run -d and examine the LLVM IR, and look for ways to optimize src/ast/codegen_llvm.cpp.

## 2. Kernel headers not found

bpftrace requires kernel headers for certain features, which are searched for by default in:

```bash
/lib/modules/$(uname -r)
```

The default search directory can be overridden using the environment variable `BPFTRACE_KERNEL_SOURCE`.
31 changes: 11 additions & 20 deletions src/clang_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ static bool is_dir(const std::string& path)
static std::pair<bool, std::string> get_kernel_path_info(const std::string kdir)
{
if (is_dir(kdir + "/build") && is_dir(kdir + "/source"))
return std::make_pair (true, "source");
return std::make_pair(true, "source");
return std::make_pair(false, "build");
}

Expand Down Expand Up @@ -160,32 +160,23 @@ void ClangParser::parse(ast::Program *program, StructMap &structs)

struct utsname utsname;
uname(&utsname);
const char* env_kernel_modules_dir = ::getenv("BPFTRACE_KERNEL_HEADERS");
std::string kernel_modules_dir = env_kernel_modules_dir?
std::string(env_kernel_modules_dir):
std::string("/lib/modules/") +
utsname.release;
const char *kpath_env = ::getenv("BPFTRACE_KERNEL_SOURCE");
std::string kdir = kpath_env ?
std::string(kpath_env) :
std::string("/lib/modules/") + utsname.release;

if (!is_dir(kernel_modules_dir)){
std::cerr << "WARNING: ("
<< kernel_modules_dir << ") is not a valid dir" << std::endl;
std::cerr << "Use environment variable BPFTRACE_KERNEL_HEADERS to setup"
" a valid directory for kernel headers." << std::endl;
exit(EXIT_FAILURE);
}

auto kpath_info = get_kernel_path_info(kernel_modules_dir);
auto kpath = env_kernel_modules_dir?
kernel_modules_dir :
kernel_modules_dir + "/" + kpath_info.second;
bool has_kpath_source = env_kernel_modules_dir? true:kpath_info.first;
auto kpath_info = get_kernel_path_info(kdir);
auto kpath = kpath_env ?
kdir :
kdir + "/" + kpath_info.second;
bool has_kpath_source = kpath_env ? false : kpath_info.first;

std::vector<std::string> kflags;

ebpf::DirStack dstack(kpath);
if (dstack.ok())
{
ebpf::KBuildHelper kbuild_helper(kpath, has_kpath_source);
ebpf::KBuildHelper kbuild_helper(kdir, has_kpath_source);
kbuild_helper.get_flags(utsname.machine, &kflags);
}

Expand Down

0 comments on commit 08f2b3c

Please sign in to comment.