using std::string;
using std::vector;
-KBuildHelper::KBuildHelper() {
+KBuildHelper::KBuildHelper(const std::string &kdir) : kdir_(kdir) {
}
// read the flags from cache or learn
cflags->push_back("-nostdinc");
cflags->push_back("-isystem");
cflags->push_back("/virtual/lib/clang/include");
+
+ // some module build directories split headers between source/ and build/
+ if (KERNEL_HAS_SOURCE_DIR) {
+ cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include");
+ cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi");
+ cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated");
+ cflags->push_back("-I" + kdir_ + "/build/include");
+ cflags->push_back("-I" + kdir_ + "/build/./arch/"+arch+"/include/uapi");
+ cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi");
+ cflags->push_back("-I" + kdir_ + "/build/include/uapi");
+ cflags->push_back("-I" + kdir_ + "/build/include/generated/uapi");
+ }
+
cflags->push_back("-I./arch/"+arch+"/include");
cflags->push_back("-Iarch/"+arch+"/include/generated/uapi");
cflags->push_back("-Iarch/"+arch+"/include/generated");
cflags->push_back("-D__KERNEL__");
cflags->push_back("-Wno-unused-value");
cflags->push_back("-Wno-pointer-sign");
+
return 0;
}
// Helper with pushd/popd semantics
class DirStack {
public:
- explicit DirStack(const char *dst) : ok_(false) {
+ explicit DirStack(const std::string &dst) : ok_(false) {
if (getcwd(cwd_, sizeof(cwd_)) == NULL) {
::perror("getcwd");
return;
}
- if (::chdir(dst)) {
- fprintf(stderr, "chdir(%s): %s\n", dst, strerror(errno));
+ if (::chdir(dst.c_str())) {
+ fprintf(stderr, "chdir(%s): %s\n", dst.c_str(), strerror(errno));
return;
}
ok_ = true;
// case we eventually support non-root user programs, cache in $HOME.
class KBuildHelper {
public:
- KBuildHelper();
+ explicit KBuildHelper(const std::string &kdir);
int get_flags(const char *uname_machine, std::vector<std::string> *cflags);
+ private:
+ std::string kdir_;
};
} // namespace ebpf
unique_ptr<llvm::MemoryBuffer> main_buf;
struct utsname un;
uname(&un);
- char kdir[256];
- snprintf(kdir, sizeof(kdir), "%s/%s/%s", KERNEL_MODULES_DIR, un.release, KERNEL_MODULES_SUFFIX);
+ string kdir = string(KERNEL_MODULES_DIR) + "/" + un.release;
// clang needs to run inside the kernel dir
- DirStack dstack(kdir);
+ DirStack dstack(kdir + "/" + KERNEL_MODULES_SUFFIX);
if (!dstack.ok())
return -1;
"-Wno-gnu-variable-sized-type-not-at-end",
"-x", "c", "-c", abs_file.c_str()});
- KBuildHelper kbuild_helper;
+ KBuildHelper kbuild_helper(kdir);
vector<string> kflags;
if (kbuild_helper.get_flags(un.machine, &kflags))
return -1;
- // some module build directories split headers between source/ and build/
- if (KERNEL_HAS_SOURCE_DIR) {
- kflags.push_back("-isystem");
- kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include");
- kflags.push_back("-isystem");
- kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include/generated/uapi");
- }
kflags.push_back("-include");
kflags.push_back("/virtual/include/bcc/helpers.h");
kflags.push_back("-isystem");