execve_hook/Makefile

255 lines
7.4 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ==========================================
# 编译选项(在文件开头定义)
# ==========================================
DEBUG ?= 0
HOOK ?= 0
NO_CONFIG_CHECK ?= 0
LZ4 ?= 0
# ==========================================
# 架构检测与交叉编译配置
# ==========================================
ARCH ?= $(shell uname -m)
ifeq ($(ARCH),arm64)
CC = aarch64-linux-gnu-gcc
TARGET_SUFFIX = _arm64
else ifeq ($(ARCH),aarch64)
CC = aarch64-linux-gnu-gcc
TARGET_SUFFIX = _arm64
ARCH = arm64
else ifeq ($(ARCH),arm)
CC = arm-linux-gnueabihf-gcc
TARGET_SUFFIX = _arm
else ifeq ($(ARCH),x86_64)
CC = gcc
TARGET_SUFFIX = _x86_64
else
CC = gcc
TARGET_SUFFIX = _x86_64
endif
# ==========================================
# 目录配置
# ==========================================
BUILD_DIR = build
SRC_DIR = src
TESTS_DIR = tests
# ==========================================
# LZ4 压缩支持检测(必须在使用前完成)
# ==========================================
LZ4_CFLAGS =
LZ4_LDFLAGS =
HAVE_LZ4 = 0
ifeq ($(LZ4),1)
LZ4_AVAILABLE := $(shell pkg-config --exists liblz4 2>/dev/null && echo 1 || echo 0)
ifeq ($(LZ4_AVAILABLE),1)
LZ4_CFLAGS := -DHAVE_LZ4 $(shell pkg-config --cflags liblz4)
LZ4_LDFLAGS := $(shell pkg-config --libs liblz4)
HAVE_LZ4 = 1
else
LZ4_DIRECT := $(shell echo 'int LZ4_compress_default(void);int main(){return 0;}' | $(CC) -x c - -llz4 -o /dev/null 2>/dev/null && echo 1 || echo 0)
ifeq ($(LZ4_DIRECT),1)
LZ4_CFLAGS := -DHAVE_LZ4
LZ4_LDFLAGS := -llz4
HAVE_LZ4 = 1
endif
endif
endif
# ==========================================
# 编译标志
# ==========================================
CFLAGS_BASE = -Wall -Wextra -Werror -fno-strict-aliasing -fno-omit-frame-pointer -fno-stack-protector
CFLAGS_SHARED = -shared -fPIC -Wl,-z,relro,-z,now
LDFLAGS_BASE = -ldl
# 条件编译标志
ifeq ($(DEBUG),1)
CFLAGS_BASE += -DDEBUG -g
endif
ifeq ($(HOOK),1)
CFLAGS_BASE += -DHOOK
endif
ifeq ($(NO_CONFIG_CHECK),1)
CFLAGS_BASE += -DNO_CONFIG_CHECK
endif
# 添加 LZ4 标志
CFLAGS_BASE += $(LZ4_CFLAGS)
LDFLAGS_BASE += $(LZ4_LDFLAGS)
# 最终编译标志
CFLAGS = $(CFLAGS_BASE) $(CFLAGS_SHARED)
LDFLAGS = $(LDFLAGS_BASE)
# 测试程序编译标志(不需要 -shared
TEST_CFLAGS = $(CFLAGS_BASE) -pthread
TEST_LDFLAGS = $(LZ4_LDFLAGS)
# ==========================================
# 源文件与目标文件
# ==========================================
TARGET_NAME = libbash_smart$(TARGET_SUFFIX).so
TARGET = $(BUILD_DIR)/$(TARGET_NAME)
# 条件编译的 compression.o
ifeq ($(HAVE_LZ4),1)
COMPRESSION_OBJ = $(BUILD_DIR)/compression.o
else
COMPRESSION_OBJ =
endif
# 源文件(排除 compression.c它是条件编译的
SRC = $(filter-out $(SRC_DIR)/compression.c, $(wildcard $(SRC_DIR)/*.c))
OBJ = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC)) $(COMPRESSION_OBJ)
# ==========================================
# 测试程序配置
# ==========================================
# 公共依赖
TEST_COMMON_DEPS = $(BUILD_DIR)/client.o $(BUILD_DIR)/socket_protocol.o $(BUILD_DIR)/debug.o $(COMPRESSION_OBJ)
# 测试客户端
TEST_CLIENT = $(BUILD_DIR)/test_client
TEST_CLIENT_SRC = $(TESTS_DIR)/test_client.c
# 并发测试客户端
TEST_CONCURRENT_CLIENT = $(BUILD_DIR)/test_concurrent_client
TEST_CONCURRENT_CLIENT_SRC = $(TESTS_DIR)/test_concurrent_client.c
# Socket通信测试客户端
TEST_SOCKET_CLIENT = $(BUILD_DIR)/test_socket_client
TEST_SOCKET_CLIENT_SRC = $(TESTS_DIR)/test_socket_client.c
# ==========================================
# 伪目标声明
# ==========================================
.PHONY: all clean debug hook rebuild pre_build \
test_client test_concurrent_client test_socket_client \
arm64 arm install-cross-tools install-lz4
# ==========================================
# 主要构建目标
# ==========================================
all: pre_build $(TARGET)
# 快捷方式:交叉编译到 ARM64
arm64:
$(MAKE) ARCH=arm64
# 快捷方式:交叉编译到 ARM32
arm:
$(MAKE) ARCH=arm
# ==========================================
# 测试程序构建
# ==========================================
test_client: pre_build $(TEST_CLIENT)
test_concurrent_client: pre_build $(TEST_CONCURRENT_CLIENT)
test_socket_client: pre_build $(TEST_SOCKET_CLIENT)
# ==========================================
# 预构建信息输出
# ==========================================
pre_build:
@echo "=========================================="
@echo "编译配置:"
@echo " 架构: $(ARCH)"
@echo " 编译器: $(CC)"
@echo " 目标文件: $(TARGET_NAME)"
@echo " DEBUG: $(DEBUG)"
@echo " HOOK: $(HOOK)"
@echo " NO_CONFIG_CHECK: $(NO_CONFIG_CHECK)"
@echo " LZ4: $(LZ4) (可用: $(HAVE_LZ4))"
@echo "=========================================="
# ==========================================
# 编译规则
# ==========================================
# 通用 .o 文件编译规则
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(BUILD_DIR)
$(CC) $(CFLAGS) -c $< -o $@
# 主目标链接
$(TARGET): $(OBJ)
@mkdir -p $(BUILD_DIR)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
@rm -f $(OBJ)
# 测试程序编译
$(TEST_CLIENT): $(TEST_CLIENT_SRC) $(TEST_COMMON_DEPS)
@mkdir -p $(BUILD_DIR)
$(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS)
$(TEST_CONCURRENT_CLIENT): $(TEST_CONCURRENT_CLIENT_SRC) $(TEST_COMMON_DEPS)
@mkdir -p $(BUILD_DIR)
$(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS)
$(TEST_SOCKET_CLIENT): $(TEST_SOCKET_CLIENT_SRC) $(TEST_COMMON_DEPS)
@mkdir -p $(BUILD_DIR)
$(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS)
# ==========================================
# 清理与重建
# ==========================================
clean:
rm -rf $(BUILD_DIR)
rebuild: clean all
# 快捷方式debug 模式重建
debug:
$(MAKE) clean
$(MAKE) DEBUG=1
# 快捷方式hook 模式重建
hook:
$(MAKE) clean
$(MAKE) HOOK=1
# ==========================================
# 工具安装
# ==========================================
# 安装交叉编译工具链
install-cross-tools:
@echo "安装 ARM 交叉编译工具链..."
@if ! command -v aarch64-linux-gnu-gcc > /dev/null 2>&1; then \
echo "正在安装 gcc-aarch64-linux-gnu..."; \
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu || \
(echo "安装失败,尝试不更新源..." && sudo apt-get install -y --no-update gcc-aarch64-linux-gnu g++-aarch64-linux-gnu); \
else \
echo "aarch64-linux-gnu-gcc 已安装"; \
fi
@if ! command -v arm-linux-gnueabihf-gcc > /dev/null 2>&1; then \
echo "正在安装 gcc-arm-linux-gnueabihf..."; \
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf || \
(echo "安装失败,尝试不更新源..." && sudo apt-get install -y --no-update gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf); \
else \
echo "arm-linux-gnueabihf-gcc 已安装"; \
fi
@echo "交叉编译工具链安装完成!"
# 安装 LZ4 库
install-lz4:
@echo "安装 LZ4 压缩库..."
@if command -v apt-get > /dev/null 2>&1; then \
sudo apt-get install -y liblz4-dev; \
elif command -v yum > /dev/null 2>&1; then \
sudo yum install -y lz4-devel; \
elif command -v pacman > /dev/null 2>&1; then \
sudo pacman -S --noconfirm lz4; \
elif command -v brew > /dev/null 2>&1; then \
brew install lz4; \
else \
echo "无法自动安装,请手动安装 liblz4-dev"; \
exit 1; \
fi
@echo "LZ4 安装完成!"