Skip to content

编译构建与字节码资产 ​

相关源文件

以下文件被用作生成此维基页面的上下文:

目的与范围 ​

本页面详细介绍了构建系统、架构变体、CO-RE(一次编译,到处运行)与非 CO-RE 字节码生成策略,以及编译 ecapture 及其核心模块(用于 OpenSSL/BoringSSL 的 tls、用于 Go 原生 TLS 的 gotls 和用于 GnuTLS 的 gnutls)所需的工具链先决条件。它解释了 eBPF C 程序如何被编译成特定架构的对象文件并嵌入到 Go 二进制文件中。

Sources: Makefile:4-16, variables.mk:1-120, docs/compilation.md:1-36


1. 支持的构建环境与先决条件 ​

构建 ecapture 需要现代 Linux 开发环境(通过辅助脚本官方支持 Ubuntu 20.04 或更高版本)以及特定的工具链版本 docs/compilation.md:28-44。

所需工具链版本 ​

  • Golang: 1.26.0 或更高版本 (go.mod:3 [], functions.mk:25-34 [])。
  • Clang/LLVM: 9.0 或更高版本(对于高级架构,建议使用 Clang 14 或 18) docs/compilation.md:34-36。
  • 库与头文件: libelf-dev、pkgconf、linux-tools-common、linux-tools-generic 以及目标内核头文件 docs/compilation.md:52-55。

可以通过提供的引导脚本自动完成环境初始化:

shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/gojue/ecapture/master/builder/init_env.sh)"

该脚本会检测宿主机操作系统发行版 builder/init_env.sh:10-40,安装所需的系统软件包 builder/init_env.sh:73-75,配置 clang、llc 和 llvm-strip 的符号链接 builder/init_env.sh:76-80,并设置 Go 工具链 builder/init_env.sh:95-98。

Sources: builder/init_env.sh:1-108, functions.mk:13-36, docs/compilation.md:24-57


2. 架构变体与工具链映射 ​

构建系统 (variables.mk) 将目标架构规范化为特定的目标三元组、架构构建目录和 C 编译标志 variables.mk:72-120。

目标架构 (TARGET_GOARCH)Linux 内核架构 (LINUX_ARCH)BPF 目标三元组 (BPF_TARGET_TRIPLE)最低内核版本
amd64x86x86_64Linux 4.18+ docs/compilation.md:28
arm64arm64aarch64Linux 5.5+ docs/compilation.md:28
loong64loongarchloongarch64-linux-gnuLinux 6.6+ docs/compilation.md:28

交叉编译与 Loong64 支持 ​

交叉编译通过设置 TARGET_ARCH 环境变量来驱动(例如 TARGET_ARCH=arm64 make) docs/compilation.md:107-112。对于 loong64,有严格的要求:必须在 Ubuntu 24.04 x86_64 上使用 LLVM 18 (CLANG_NUM=18) 进行构建,并且需要 LOONG64_VMLINUX 和内核头文件 variables.mk:91-117, docs/compilation.md:114-131。

Sources: variables.mk:72-120, docs/compilation.md:79-131


3. CO-RE 与非 CO-RE 字节码资产生成 ​

eBPF 字节码由 kern/ 目录下的 C 源文件编译成特定架构的对象文件(_core.o 或非 CO-RE 等效文件),随后通过资产生成过程打包进 Go 源文件 Makefile:174-190。

构建目标 ​

  • make all (或 make build): 编译 CO-RE 和非 CO-RE 字节码资产并构建 ecapture 二进制文件 Makefile:4-6。
  • make core: 仅使用 CO-RE(一次编译,到处运行)资产构建 eCapture Makefile:9-11。
  • make nocore: 仅使用 非 CO-RE 资产构建 eCapture,为旧版本内核绕过 BTF 依赖 Makefile:13-15, docs/compilation.md:69-77。

编译流程 ​

Makefile 针对 kern/ 中匹配 KERN_OBJECTS 的每个源文件,调用 clang 并配合适当的目标标志 (-target bpfel)、调试符号 (-g) 和依赖生成 Makefile:174-185。

Sources: Makefile:1-190, variables.mk:140-176


4. TLS、GoTLS 和 GnuTLS 的构建先决条件 ​

核心 TLS 探针(tls、gotls、gnutls)依赖于静态链接的 libpcap 和 functions.mk 中定义的 CGO 配置 functions.mk:47-57。

CGO 与链接器配置 ​

gobuild 宏定义了传递给 Go 编译器的精确环境变量和构建标志 functions.mk:47-57:

Sources: functions.mk:47-57, variables.mk:52-124

编译构建与字节码资产 has loaded
下载