diff --git a/.gitignore b/.gitignore index 091e28958b8..892d5a579f5 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ target/ /agent/src/ebpf/kernel/*.ll /agent/src/ebpf/kernel/*.objdump /agent/src/ebpf/kernel/*.elf +/agent/src/ebpf/.output/ /agent/src/ebpf/user/socket_trace_bpf_5_2.c /agent/src/ebpf/user/socket_trace_bpf_core.c /agent/src/ebpf/user/socket_trace_bpf_common.c @@ -53,6 +54,3 @@ target/ /agent/src/ebpf/samples/rust/socket-tracer/src/ebpf.rs /agent/src/ebpf/.flamegraph.pl /agent/src/ebpf/kernel/*.tmp - - - diff --git a/agent/.gitignore b/agent/.gitignore index 1bf7d1898dd..aa6bd20623e 100644 --- a/agent/.gitignore +++ b/agent/.gitignore @@ -12,6 +12,7 @@ src/flow_generator/protocol_logs/mq/pulsar.proto.rs src/ebpf/data src/ebpf/.data_done src/ebpf/libtrace.a +src/ebpf/.output/ src/ebpf/deepflow-ebpfctl src/ebpf/kernel/*.elf.tmp src/ebpf/kernel/socket_trace.ll diff --git a/agent/build.md b/agent/build.md index 2c18c27102b..fa8be32f7d4 100644 --- a/agent/build.md +++ b/agent/build.md @@ -94,3 +94,8 @@ git clone --recursive https://github.com/deepflowio/deepflow.git cd deepflow/agent cargo build ``` + +## Build Speed Tips + +- Force rebuild eBPF/C artifacts: `DF_EBPF_CLEAN=1 cargo build --release` +- eBPF `*.objdump` is generated by default; disable to speed up: `DF_EBPF_OBJDUMP=0 cargo build --release` diff --git a/agent/build.rs b/agent/build.rs index ef535be5446..86ac270d1ad 100644 --- a/agent/build.rs +++ b/agent/build.rs @@ -15,7 +15,7 @@ */ use std::{ - env, + env, fs, path::{Path, PathBuf}, process::Command, str, @@ -90,7 +90,7 @@ fn set_build_info() -> Result<()> { // // rerun build script when one of the following file changes // - C source files, except for -// - generated bpf bytecode files (socket_trace_*.c / perf_profiler_*.c) +// - generated bpf bytecode files (`*_bpf_*.c`, e.g. socket_trace_bpf_*.c / perf_profiler_bpf_*.c) // - java agent so files and jattach bin // - Header files // - `src/ebpf/mod.rs` (to exclude rust sources in `samples` folder) @@ -101,6 +101,9 @@ fn set_libtrace_rerun_files() -> Result<()> { match ext { "c" => { if let Some(name) = path.file_name().and_then(|s| s.to_str()) { + if name.contains("_bpf_") { + return false; + } if name.starts_with("socket_trace_") || name.starts_with("perf_profiler_") { return false; } @@ -136,26 +139,110 @@ fn set_libtrace_rerun_files() -> Result<()> { } println!("cargo:rerun-if-changed={}", relative_path.display()); } + + // eBPF/C code also includes headers from trace-utils. + for entry in WalkDir::new(base_dir.join("crates/trace-utils/src")) { + let entry = entry?; + if !entry.file_type().is_file() { + continue; + } + let path = entry.path(); + if path.extension().and_then(|s| s.to_str()) != Some("h") { + continue; + } + let relative_path = path.strip_prefix(&base_dir)?; + println!("cargo:rerun-if-changed={}", relative_path.display()); + } Ok(()) } fn set_build_libtrace() -> Result<()> { set_libtrace_rerun_files()?; - let output = match env::var("CARGO_CFG_TARGET_ENV")?.as_str() { - "gnu" => Command::new("sh").arg("-c") - .arg("cd src/ebpf && make clean && make --no-print-directory && make tools --no-print-directory") - .output()?, - "musl" => Command::new("sh").arg("-c") - .arg("cd src/ebpf && make clean && CC=musl-gcc CLANG=musl-clang make --no-print-directory && CC=musl-gcc CLANG=musl-clang make tools --no-print-directory") - .output()?, - _ => panic!("Unsupported target"), + println!("cargo:rerun-if-env-changed=DF_EBPF_CLEAN"); + println!("cargo:rerun-if-env-changed=DF_EBPF_OBJDUMP"); + + let target_env = env::var("CARGO_CFG_TARGET_ENV")?; + + let target_id = format!( + "{}-{}-{}", + env::var("CARGO_CFG_TARGET_OS").unwrap_or_default(), + env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default(), + target_env + ); + let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); + let state_file = root.join("src/ebpf/.output/.last_ebpf_build_target"); + if let Some(parent) = state_file.parent() { + fs::create_dir_all(parent)?; + } + let previous_target = fs::read_to_string(&state_file) + .ok() + .map(|s| s.trim().to_owned()); + + let force_clean = match env::var("DF_EBPF_CLEAN") { + Ok(s) => !s.is_empty() && s != "0" && s.to_lowercase() != "false", + Err(_) => false, + }; + let need_clean = force_clean + || previous_target + .as_deref() + .map(|t| t != target_id) + .unwrap_or(false); + + // NOTE: + // Keep default behavior consistent with historical builds: always generate `*.objdump`. + // Override with `DF_EBPF_OBJDUMP=0/false` to disable. + let objdump_enabled = match env::var("DF_EBPF_OBJDUMP") { + Ok(s) => { + let v = s.trim().to_lowercase(); + !(v == "0" || v == "false" || v == "off" || v == "no") + } + Err(_) => true, + }; + let objdump_value = if objdump_enabled { "1" } else { "0" }; + let ebpf_output_dir = format!(".output/{}", target_id); + let kernel_output_dir = format!("../{}/kernel", ebpf_output_dir); + + let cargo_makeflags = env::var("CARGO_MAKEFLAGS").ok(); + let num_jobs = env::var("NUM_JOBS").ok(); + + let run_make = |targets: &[&str]| -> Result<()> { + let mut cmd = Command::new("make"); + cmd.current_dir(root.join("src/ebpf")); + if let Some(makeflags) = &cargo_makeflags { + cmd.env("MAKEFLAGS", makeflags); + } else if let Some(jobs) = &num_jobs { + cmd.arg(format!("-j{}", jobs)); + } + cmd.arg("--no-print-directory"); + cmd.arg(format!("VMLINUX_OBJDUMP={}", objdump_value)); + cmd.arg(format!("KERNEL_OUTPUT_DIR={}", kernel_output_dir)); + cmd.arg(format!("OBJDIR={}", ebpf_output_dir)); + match target_env.as_str() { + "gnu" => {} + "musl" => { + cmd.env("CC", "musl-gcc"); + cmd.env("CLANG", "musl-clang"); + } + _ => panic!("Unsupported target"), + } + cmd.args(targets); + + let output = cmd.output()?; + if !output.status.success() { + eprintln!("{}", str::from_utf8(&output.stderr)?); + eprintln!("{}", str::from_utf8(&output.stdout)?); + panic!("compile libtrace.a error!"); + } + Ok(()) }; - if !output.status.success() { - eprintln!("{}", str::from_utf8(&output.stderr)?); - panic!("compile libtrace.a error!"); + + if need_clean { + run_make(&["clean"])?; } + run_make(&["build", "tools"])?; + fs::write(&state_file, format!("{}\n", target_id))?; + let library_name = "trace"; - let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); let library_dir = dunce::canonicalize(root.join("src/ebpf/"))?; println!("cargo:rustc-link-lib=static={}", library_name); println!( diff --git a/agent/build_cn.md b/agent/build_cn.md index 78d65b38ba2..4ec57aea1d4 100644 --- a/agent/build_cn.md +++ b/agent/build_cn.md @@ -93,3 +93,8 @@ git clone --recursive https://github.com/deepflowio/deepflow.git cd deepflow/agent cargo build ``` + +## 构建提速建议 + +- 强制重新生成 eBPF/C 相关产物:`DF_EBPF_CLEAN=1 cargo build --release` +- eBPF 的 `*.objdump` 默认生成,如需提速可关闭:`DF_EBPF_OBJDUMP=0 cargo build --release` diff --git a/agent/src/ebpf/Makefile b/agent/src/ebpf/Makefile index 3462a8c8a25..06b7282612c 100644 --- a/agent/src/ebpf/Makefile +++ b/agent/src/ebpf/Makefile @@ -35,24 +35,27 @@ CLANG ?= /usr/bin/clang CC ?= gcc GNU_CC ?= gcc MUSL_CC ?= musl-gcc -OBJDIR ?= . +LLVM_STRIP ?= /usr/bin/llvm-strip +LLVM_OBJDUMP ?= /usr/bin/llvm-objdump +VMLINUX_OBJDUMP ?= 1 +OBJDIR ?= .output STATIC_OBJDIR := $(OBJDIR)/staticobjs +KERNEL_OUTPUT_DIR ?= ../.output/kernel -include user/extended/feature.top.mk -define compile_socket_trace_elf - @echo " COMPILE ELF kernel version $(1)" - @cd kernel && make clean --no-print-directory && make socket_trace.bpf.elf $(2) --no-print-directory && cd ../ - @echo " Generate file user/socket_trace_bpf_$(strip $1).c" - @./tools/bintobuffer kernel/socket_trace.bpf.elf user/socket_trace_bpf_$(strip $1).c socket_trace_$(strip $1)_ebpf_data -endef +VMLINUX_VARIANT_ARGS_common := +VMLINUX_VARIANT_ARGS_3_10_0 := LINUX_VER_3_10_0=1 +VMLINUX_VARIANT_ARGS_5_2_plus := LINUX_VER_5_2_PLUS=1 +VMLINUX_VARIANT_ARGS_kfunc := LINUX_VER_KFUNC=1 +VMLINUX_VARIANT_ARGS_kylin := LINUX_VER_KYLIN=1 +VMLINUX_VARIANT_ARGS_rt := LINUX_VER_RT=1 +VMLINUX_VARIANT_ARGS_kprobe := LINUX_VER_KPROBE=1 -define compile_perf_profiler_elf - @echo " COMPILE ELF kernel version $(1)" - @cd kernel && make clean --no-print-directory && make perf_profiler.bpf.elf $(2) --no-print-directory && cd ../ - @echo " Generate file user/perf_profiler_bpf_$(strip $1).c" - @./tools/bintobuffer kernel/perf_profiler.bpf.elf user/perf_profiler_bpf_$(strip $1).c perf_profiler_$(strip $1)_ebpf_data -endef +VMLINUX_KERNEL_BPF_SRCS := $(wildcard kernel/*.bpf.c) +VMLINUX_KERNEL_HDRS := kernel/config.h $(wildcard kernel/include/*.h) +TRACE_UTILS_HDRS := $(wildcard ../../crates/trace-utils/src/*.h) +VMLINUX_KERNEL_BUILD_DEPS := kernel/Makefile $(VMLINUX_KERNEL_BPF_SRCS) $(VMLINUX_KERNEL_HDRS) $(TRACE_UTILS_HDRS) define check_gcc_version @GCC_VER=`gcc --version | grep ^gcc | cut -f3 -d' '|cut -f1-2 -d.`; \ @@ -111,6 +114,7 @@ JAVA_AGENT_MACROS := -DAGENT_LIB_NAME="\"$(JAVA_AGENT_GNU_SO)\"" -DAGENT_MUSL_LI STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS)) CFLAGS ?= -std=gnu99 -g -O2 -ffunction-sections -fdata-sections -fPIC -Wall -Wno-strict-aliasing -Wno-sign-compare -Wno-unused-parameter -Wno-missing-field-initializers -I/usr/include/bcc -I../../../crates/trace-utils/src/ +DEPFLAGS ?= -MMD -MP # '-Wformat-truncation' : The warning was added in gcc7.1 GCC_VER_GTE71 := $(shell echo `gcc --version | grep ^gcc | cut -f3 -d' '|cut -f1-2 -d.` \>= 7.1 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE71),1) @@ -167,41 +171,91 @@ define check_clang @rm -rf data endef -user/socket_trace_bpf_common.c: tools/bintobuffer kernel/socket_trace.bpf.c +kernel/$(KERNEL_OUTPUT_DIR)/%/socket_trace.bpf.elf.debug: $(VMLINUX_KERNEL_BUILD_DEPS) $(call check_clang) - $(call compile_socket_trace_elf, common) + $(call msg,BPF,$@) + $(Q)$(MAKE) -C kernel --no-print-directory \ + OUTPUT=$(KERNEL_OUTPUT_DIR)/$* \ + $(VMLINUX_VARIANT_ARGS_$*) \ + $(KERNEL_OUTPUT_DIR)/$*/socket_trace.bpf.elf.debug -user/socket_trace_bpf_3_10_0.c: tools/bintobuffer kernel/socket_trace.bpf.c +kernel/$(KERNEL_OUTPUT_DIR)/%/perf_profiler.bpf.elf.debug: $(VMLINUX_KERNEL_BUILD_DEPS) $(call check_clang) - $(call compile_socket_trace_elf, 3_10_0, LINUX_VER_3_10_0=1) + $(call msg,BPF,$@) + $(Q)$(MAKE) -C kernel --no-print-directory \ + OUTPUT=$(KERNEL_OUTPUT_DIR)/$* \ + $(VMLINUX_VARIANT_ARGS_$*) \ + $(KERNEL_OUTPUT_DIR)/$*/perf_profiler.bpf.elf.debug -user/socket_trace_bpf_5_2_plus.c: tools/bintobuffer kernel/socket_trace.bpf.c - $(call check_clang) - $(call compile_socket_trace_elf, 5_2_plus, LINUX_VER_5_2_PLUS=1) +kernel/$(KERNEL_OUTPUT_DIR)/%/socket_trace.bpf.elf: kernel/$(KERNEL_OUTPUT_DIR)/%/socket_trace.bpf.elf.debug + $(call msg,STRIP,$@) + $(Q)cp $< $@ + $(Q)$(LLVM_STRIP) -g $@ -user/socket_trace_bpf_kfunc.c: tools/bintobuffer kernel/socket_trace.bpf.c - $(call check_clang) - $(call compile_socket_trace_elf, kfunc, LINUX_VER_KFUNC=1) +kernel/$(KERNEL_OUTPUT_DIR)/%/perf_profiler.bpf.elf: kernel/$(KERNEL_OUTPUT_DIR)/%/perf_profiler.bpf.elf.debug + $(call msg,STRIP,$@) + $(Q)cp $< $@ + $(Q)$(LLVM_STRIP) -g $@ -user/socket_trace_bpf_kylin.c: tools/bintobuffer kernel/socket_trace.bpf.c - $(call check_clang) - $(call compile_socket_trace_elf, kylin, LINUX_VER_KYLIN=1) +kernel/$(KERNEL_OUTPUT_DIR)/%/socket_trace.bpf.objdump: kernel/$(KERNEL_OUTPUT_DIR)/%/socket_trace.bpf.elf.debug + $(call msg,OBJDUMP,$@) + $(Q)$(LLVM_OBJDUMP) --source --debug-vars --line-numbers --symbol-description $< > $@ -user/socket_trace_bpf_rt.c: tools/bintobuffer kernel/socket_trace.bpf.c - $(call check_clang) - $(call compile_socket_trace_elf, rt, LINUX_VER_RT=1) +kernel/$(KERNEL_OUTPUT_DIR)/%/perf_profiler.bpf.objdump: kernel/$(KERNEL_OUTPUT_DIR)/%/perf_profiler.bpf.elf.debug + $(call msg,OBJDUMP,$@) + $(Q)$(LLVM_OBJDUMP) --source --debug-vars --line-numbers --symbol-description $< > $@ -user/socket_trace_bpf_kprobe.c: tools/bintobuffer kernel/socket_trace.bpf.c - $(call check_clang) - $(call compile_socket_trace_elf, kprobe, LINUX_VER_KPROBE=1) +VMLINUX_SOCKET_TRACE_VARIANTS := common 3_10_0 5_2_plus kfunc kylin rt kprobe +VMLINUX_PERF_PROFILER_VARIANTS := common 5_2_plus -user/perf_profiler_bpf_common.c: tools/bintobuffer kernel/perf_profiler.bpf.c - $(call check_clang) - $(call compile_perf_profiler_elf, common) +VMLINUX_SOCKET_TRACE_ELF_DEBUGS := $(addprefix kernel/$(KERNEL_OUTPUT_DIR)/,$(addsuffix /socket_trace.bpf.elf.debug,$(VMLINUX_SOCKET_TRACE_VARIANTS))) +VMLINUX_PERF_PROFILER_ELF_DEBUGS := $(addprefix kernel/$(KERNEL_OUTPUT_DIR)/,$(addsuffix /perf_profiler.bpf.elf.debug,$(VMLINUX_PERF_PROFILER_VARIANTS))) -user/perf_profiler_bpf_5_2_plus.c: tools/bintobuffer kernel/perf_profiler.bpf.c - $(call check_clang) - $(call compile_perf_profiler_elf, 5_2_plus, LINUX_VER_5_2_PLUS=1) +VMLINUX_SOCKET_TRACE_OBJDUMPS := $(VMLINUX_SOCKET_TRACE_ELF_DEBUGS:.elf.debug=.objdump) +VMLINUX_PERF_PROFILER_OBJDUMPS := $(VMLINUX_PERF_PROFILER_ELF_DEBUGS:.elf.debug=.objdump) + +.SECONDARY: $(VMLINUX_SOCKET_TRACE_ELF_DEBUGS) $(VMLINUX_PERF_PROFILER_ELF_DEBUGS) + +VMLINUX_KERNEL_OBJDUMP_FILES = +ifneq ($(VMLINUX_OBJDUMP),0) +VMLINUX_KERNEL_OBJDUMP_FILES += $(VMLINUX_SOCKET_TRACE_OBJDUMPS) $(VMLINUX_PERF_PROFILER_OBJDUMPS) +endif + +user/socket_trace_bpf_common.c: kernel/$(KERNEL_OUTPUT_DIR)/common/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_common_ebpf_data + +user/socket_trace_bpf_3_10_0.c: kernel/$(KERNEL_OUTPUT_DIR)/3_10_0/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_3_10_0_ebpf_data + +user/socket_trace_bpf_5_2_plus.c: kernel/$(KERNEL_OUTPUT_DIR)/5_2_plus/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_5_2_plus_ebpf_data + +user/socket_trace_bpf_kfunc.c: kernel/$(KERNEL_OUTPUT_DIR)/kfunc/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_kfunc_ebpf_data + +user/socket_trace_bpf_kylin.c: kernel/$(KERNEL_OUTPUT_DIR)/kylin/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_kylin_ebpf_data + +user/socket_trace_bpf_rt.c: kernel/$(KERNEL_OUTPUT_DIR)/rt/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_rt_ebpf_data + +user/socket_trace_bpf_kprobe.c: kernel/$(KERNEL_OUTPUT_DIR)/kprobe/socket_trace.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ socket_trace_kprobe_ebpf_data + +user/perf_profiler_bpf_common.c: kernel/$(KERNEL_OUTPUT_DIR)/common/perf_profiler.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ perf_profiler_common_ebpf_data + +user/perf_profiler_bpf_5_2_plus.c: kernel/$(KERNEL_OUTPUT_DIR)/5_2_plus/perf_profiler.bpf.elf tools/bintobuffer + @echo " Generate file $@" + @./tools/bintobuffer $< $@ perf_profiler_5_2_plus_ebpf_data $(STATIC_OBJDIR) $(SHARED_OBJDIR): $(call msg,MKDIR,$@) @@ -210,15 +264,15 @@ $(STATIC_OBJDIR) $(SHARED_OBJDIR): $(STATIC_OBJDIR)/user/socket.o: user/socket.c $(SOCKET_TRACE_ELFS) | $(STATIC_OBJDIR) $(call msg,CC,$@) - $(Q)$(CC) $(CFLAGS) -c $< -o $@ + $(Q)$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -MT $@ -c $< -o $@ $(STATIC_OBJDIR)/user/profile/perf_profiler.o: user/profile/perf_profiler.c $(PERF_PROFILER_ELFS) | $(STATIC_OBJDIR) $(call msg,CC,$@) - $(Q)$(CC) $(CFLAGS) -c $< -o $@ + $(Q)$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -MT $@ -c $< -o $@ $(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR) $(call msg,CC,$@) - $(Q)$(CC) $(CFLAGS) -c $< -o $@ + $(Q)$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -MT $@ -c $< -o $@ $(LIBTRACE): $(STATIC_OBJS) $(call msg,AR,$@) @@ -236,7 +290,7 @@ $(JAVA_AGENT_MUSL_SO): tools/bintobuffer $(JAVA_AGENT_SRC) @rm -rf user/profile/java_agent_so_musl.c @./tools/bintobuffer ./$@ user/profile/java_agent_so_musl.c java_agent_so_musl -build: $(ELFFILES) $(JAVA_TOOL) $(LIBTRACE) +build: $(ELFFILES) $(JAVA_TOOL) $(LIBTRACE) $(VMLINUX_KERNEL_OBJDUMP_FILES) tools: $(LIBTRACE) $(call msg,TOOLS,deepflow-ebpfctl) @@ -254,6 +308,7 @@ libs/jattach/build/libjattach.a: $(Q)$(MAKE) -sC libs/jattach dll --no-print-directory -include user/extended/feature.bottom.mk +-include $(STATIC_OBJS:.o=.d) rust-sample: .socket-tracer .profiler socket-tracer: .socket-tracer @@ -326,6 +381,8 @@ clean: $(Q)$(MAKE) -C test clean --no-print-directory $(Q)$(MAKE) -C libs/jattach clean --no-print-directory $(Q)rm -rf $(ELFFILES) data deepflow-ebpfctl $(STATIC_OBJDIR) $(LIBTRACE) *.a + $(Q)rm -rf kernel/$(KERNEL_OUTPUT_DIR) + $(Q)rm -rf .output $(Q)rm -rf .profiler .socket-tracer $(Q)rm -rf samples/rust/socket-tracer/target $(Q)rm -rf samples/rust/profiler/target diff --git a/agent/src/ebpf/kernel/Makefile b/agent/src/ebpf/kernel/Makefile index 92c0a795732..8630cc08505 100644 --- a/agent/src/ebpf/kernel/Makefile +++ b/agent/src/ebpf/kernel/Makefile @@ -16,11 +16,14 @@ LLC ?= /usr/bin/llc CLANG ?= /usr/bin/clang LLVM_STRIP ?= /usr/bin/llvm-strip LLVM_OBJDUMP ?= /usr/bin/llvm-objdump +OUTPUT ?= . +VMLINUX_OBJDUMP ?= 1 CC ?= gcc TAEGET_KERN_SRC := socket_trace.bpf.c perf_profiler.bpf.c TAEGET_KERN_SRC += $(KERN_SRC_EXTRA) -TAEGET_KERN_LL = $(TAEGET_KERN_SRC:c=ll) -TAEGET_KERN_ELF = $(TAEGET_KERN_SRC:c=elf) +OUTPUT_PREFIX := $(if $(filter .,$(OUTPUT)),,$(OUTPUT)/) +TAEGET_KERN_LL = $(addprefix $(OUTPUT_PREFIX),$(TAEGET_KERN_SRC:c=ll)) +TAEGET_KERN_ELF = $(addprefix $(OUTPUT_PREFIX),$(TAEGET_KERN_SRC:c=elf)) ifeq ($(V),1) Q = msg = @@ -47,34 +50,54 @@ else ifeq ($(LINUX_VER_KPROBE),1) EXTRA_EBPF_CLAGS = -DSUPPORTS_KPROBE_ONLY endif -FINAL_TARGET = -emit-llvm -D__TARGET_ARCH_$(ARCH) -o ${@:.elf=.ll} -c $^ && $(LLC) -march=bpf -filetype=obj -mcpu=v2 -o $@ ${@:.elf=.ll} +VMLINUX_DEPFLAGS ?= -MMD -MP -all: $(TAEGET_KERN_ELF) +VMLINUX_OBJDUMP_TARGETS = +ifneq ($(VMLINUX_OBJDUMP),0) +VMLINUX_OBJDUMP_TARGETS = $(TAEGET_KERN_ELF:.elf=.objdump) +endif + +all: $(TAEGET_KERN_ELF) $(VMLINUX_OBJDUMP_TARGETS) EBPF_CLAGS ?= -I. -Ivmlinux -Iinclude -I../../../crates/trace-utils/src \ -D__BPF_TRACING__ -D GROUP_LEADER_OFFSET_OVERRIDE=0 \ -DSTART_BOOTTIME_OFFSET_OVERRIDE=0 \ -DSTART_BOOTTIME_VARNAME=real_start_time -%.elf: %.c - $(call msg,BPF,$@,$(CORE)) - $(Q)$(CLANG) $(EBPF_CLAGS) $(EXTRA_EBPF_CLAGS) -DCOMPILE_MUSL=$(C_USE_STATIC) -std=gnu99 -Wimplicit-function-declaration \ - -ffreestanding -fno-builtin -Wall \ - -Wno-deprecated-declarations \ - -Wno-gnu-variable-sized-type-not-at-end \ - -Wno-pragma-once-outside-header \ - -Wno-address-of-packed-member \ - -Wno-unknown-warning-option \ - -fno-color-diagnostics \ - -fno-unwind-tables \ - -fno-stack-protector \ - -fno-asynchronous-unwind-tables -g -O2 $(FINAL_TARGET) - $(Q)$(LLVM_OBJDUMP) --source --debug-vars --line-numbers --symbol-description $@ > ${@:.elf=.objdump} +VMLINUX_CLANG_CFLAGS = $(EBPF_CLAGS) $(EXTRA_EBPF_CLAGS) -DCOMPILE_MUSL=$(C_USE_STATIC) -std=gnu99 -Wimplicit-function-declaration \ + -ffreestanding -fno-builtin -Wall \ + -Wno-deprecated-declarations \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-pragma-once-outside-header \ + -Wno-address-of-packed-member \ + -Wno-unknown-warning-option \ + -fno-color-diagnostics \ + -fno-unwind-tables \ + -fno-stack-protector \ + -fno-asynchronous-unwind-tables -g -O2 + +VMLINUX_LLC_FLAGS = -march=bpf -filetype=obj -mcpu=v2 + +$(OUTPUT_PREFIX)%.elf.debug: %.c + $(call msg,BPF,$@,$(CORE)) + $(Q)mkdir -p $(dir $@) + $(Q)$(CLANG) $(VMLINUX_CLANG_CFLAGS) $(VMLINUX_DEPFLAGS) -MF ${@:.elf.debug=.d} -MT $@ \ + -emit-llvm -D__TARGET_ARCH_$(ARCH) -o ${@:.elf.debug=.ll} -c $< + $(Q)$(LLC) $(VMLINUX_LLC_FLAGS) -o $@ ${@:.elf.debug=.ll} + +$(OUTPUT_PREFIX)%.elf: $(OUTPUT_PREFIX)%.elf.debug + $(call msg,STRIP,$@) + $(Q)cp $< $@ $(Q)$(LLVM_STRIP) -g $@ # strip useless DWARF info +$(OUTPUT_PREFIX)%.objdump: $(OUTPUT_PREFIX)%.elf.debug + $(call msg,OBJDUMP,$@) + $(Q)$(LLVM_OBJDUMP) --source --debug-vars --line-numbers --symbol-description $< > $@ + clean: @rm -f ../user/extended/bpf/*.bpf.elf ../user/extended/bpf/*.bpf.ll - @rm $(TAEGET_KERN_ELF) $(TARGET) ${TAEGET_KERN_ELF:.elf=.ll} *.S *.objdump -rf + @rm -rf $(TAEGET_KERN_ELF) $(TAEGET_KERN_ELF:.elf=.elf.debug) $(TAEGET_KERN_LL) $(TAEGET_KERN_ELF:.elf=.d) $(TAEGET_KERN_ELF:.elf=.objdump) $(OUTPUT_PREFIX)*.S $(OUTPUT_PREFIX)*.tmp .PHONY: all clean +-include $(TAEGET_KERN_ELF:.elf=.d)