Commit 08f2b3c6 authored by Brendan Gregg's avatar Brendan Gregg Committed by GitHub

Merge pull request #173 from iovisor/kernel-header-fixes

ClangParser: Don't exit if kernel headers are not found
parents 2a906ebc 66c549b0
......@@ -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).
......
......@@ -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`.
......@@ -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");
}
......@@ -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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment