From 86f6ca43c9ff8361d1d0ac95ccf610bb8d7c073a Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 15 Oct 2018 20:24:20 +0200 Subject: [PATCH] Support resolving cgroupid only if name_to_handle_at exists Currently used image of alpine has a version of musl libc that does not have name_to_handle_at function that is required to resolve the cgroup id. In such case we just use an implementation that says that resolving cgroupid is not supported. --- CMakeLists.txt | 5 +++++ src/CMakeLists.txt | 3 +++ src/bpftrace.cpp | 11 +++++++++++ tests/CMakeLists.txt | 3 +++ tests/codegen.cpp | 4 ++++ 5 files changed, 26 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index eae850a827ce..18875ffa3273 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,11 @@ add_flex_bison_dependency(flex_lexer bison_parser) add_library(parser ${BISON_bison_parser_OUTPUTS} ${FLEX_flex_lexer_OUTPUTS}) target_include_directories(parser PUBLIC src src/ast ${CMAKE_BINARY_DIR}) +include(CheckSymbolExists) +set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE) +check_symbol_exists(name_to_handle_at "sys/types.h;sys/stat.h;fcntl.h" HAVE_NAME_TO_HANDLE_AT) +set(CMAKE_REQUIRED_DEFINITIONS) + find_package(LLVM REQUIRED) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 070007ffe5f2..9fb877df6bf2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,6 +13,9 @@ add_executable(bpftrace list.cpp ) +if(HAVE_NAME_TO_HANDLE_AT) + target_compile_definitions(bpftrace PRIVATE HAVE_NAME_TO_HANDLE_AT=1) +endif(HAVE_NAME_TO_HANDLE_AT) target_link_libraries(bpftrace arch ast parser resources) ExternalProject_Get_Property(bcc source_dir binary_dir) diff --git a/src/bpftrace.cpp b/src/bpftrace.cpp index 6dd765995949..27cc79d579cd 100644 --- a/src/bpftrace.cpp +++ b/src/bpftrace.cpp @@ -1287,6 +1287,8 @@ uint64_t BPFtrace::resolve_kname(const std::string &name) return addr; } +#ifdef HAVE_NAME_TO_HANDLE_AT + namespace { @@ -1333,6 +1335,15 @@ uint64_t BPFtrace::resolve_cgroupid(const std::string &path) return cfh.cgid; } +#else + +uint64_t BPFtrace::resolve_cgroupid(const std::string &path) +{ + throw std::runtime_error("cgroupid is not supported on this system"); +} + +#endif + uint64_t BPFtrace::resolve_uname(const std::string &name, const std::string &path) { uint64_t addr = 0; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c283efa83069..a3cb5aa44c8d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,6 +24,9 @@ add_executable(bpftrace_test ${CMAKE_SOURCE_DIR}/src/types.cpp ) +if(HAVE_NAME_TO_HANDLE_AT) + target_compile_definitions(bpftrace_test PRIVATE HAVE_NAME_TO_HANDLE_AT=1) +endif(HAVE_NAME_TO_HANDLE_AT) target_link_libraries(bpftrace_test arch ast parser resources) ExternalProject_Get_Property(bcc source_dir binary_dir) diff --git a/tests/codegen.cpp b/tests/codegen.cpp index 0a6a9b2f1a47..89d8569f75f8 100644 --- a/tests/codegen.cpp +++ b/tests/codegen.cpp @@ -1128,6 +1128,8 @@ TEST(codegen, call_uaddr) // TODO: test uaddr() } +#ifdef HAVE_NAME_TO_HANDLE_AT + TEST(codegen, call_cgroup) { test("tracepoint:syscalls:sys_enter_openat /cgroup == 0x100000001/ { @x = cgroup }", @@ -1172,6 +1174,8 @@ attributes #1 = { argmemonly nounwind } )EXPECTED"); } +#endif + TEST(codegen, call_hist) { test("kprobe:f { @x = hist(pid) }",