Skip to content

Instantly share code, notes, and snippets.

@SeeFlowerX
Created October 27, 2022 02:39
Show Gist options
  • Save SeeFlowerX/bf8c14b96cd0dc0aa219e2771d96a892 to your computer and use it in GitHub Desktop.
Save SeeFlowerX/bf8c14b96cd0dc0aa219e2771d96a892 to your computer and use it in GitHub Desktop.
尝试在linux x86_64上使用ndk交叉编译eBPF程序,以及混合go程序...
.PHONY: all
all: ebpf assets build
@echo $(shell date)
.ONESHELL:
SHELL = /bin/bash
# export PATH=/home/kali/Desktop/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
# export PATH=/home/kali/Desktop/android-ndk-r23c/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
GOARCH = arm64
GOOS = android
# CGO_ENABLED = 1
# NDK_ROOT = /home/kali/Desktop/android-ndk-r25b
CMD_CLANG = aarch64-linux-android29-clang
CMD_GO ?= go
CMD_LLC ?= llc-13
CMD_AWK ?= awk
CMD_SED ?= sed
CMD_TR ?= tr
CMD_CUT ?= cut
CMD_TOUCH ?= touch
CMD_RM ?= rm
.check_%:
#
@command -v $* >/dev/null
if [ $$? -ne 0 ]; then
echo "edemo Makefile: missing required tool $*"
exit 1
else
touch $@ # avoid target rebuilds due to inexistent file
fi
UNAME_M := $(shell uname -m)
UNAME_R := $(shell uname -r)
ARCH = arm64
LINUX_ARCH = arm64
GO_ARCH = arm64
BPFHEADER = -I ./kern \
-I ./kern/bpf/arm64
KERN_BUILD_PATH ?= /home/kali/Desktop/ebpf/kheaders
KERN_SRC_PATH ?= /home/kali/Desktop/ebpf/kheaders
#
# tools version
#
CLANG_VERSION = 14
# clang 编译器版本检测,llvm检测,
.checkver_$(CMD_CLANG): \
| .check_$(CMD_CLANG)
#
@echo $(shell date)
@if [ ${CLANG_VERSION} -lt 12 ]; then
echo -n "you MUST use clang 12 or newer, "
echo "your current clang version is ${CLANG_VERSION}"
exit 1
fi
$(CMD_TOUCH) $@ # avoid target rebuilds over and over due to inexistent file
GO_VERSION = $(shell $(CMD_GO) version 2>/dev/null | $(CMD_AWK) '{print $$3}' | $(CMD_SED) 's:go::g' | $(CMD_CUT) -d. -f1,2)
GO_VERSION_MAJ = $(shell echo $(GO_VERSION) | $(CMD_CUT) -d'.' -f1)
GO_VERSION_MIN = $(shell echo $(GO_VERSION) | $(CMD_CUT) -d'.' -f2)
# golang 版本检测 1.17 以上
.checkver_$(CMD_GO): \
| .check_$(CMD_GO)
#
@if [ ${GO_VERSION_MAJ} -eq 1 ]; then
if [ ${GO_VERSION_MIN} -lt 17 ]; then
echo -n "you MUST use golang 1.17 or newer, "
echo "your current golang version is ${GO_VERSION}"
exit 1
fi
fi
touch $@
KERN_SOURCES = kern/open.c
KERN_OBJECTS = ${KERN_SOURCES:.c=.o}
.PHONY: clean assets build ebpf
.PHONY: clean
clean:
$(CMD_RM) -f user/bytecode/*.d
$(CMD_RM) -f user/bytecode/*.o
$(CMD_RM) -f assets/ebpf_probe.go
$(CMD_RM) -f bin/edemo
$(CMD_RM) -f .check*
.PHONY: ebpf
ebpf: ${KERN_OBJECTS}
.PHONY: $(KERN_OBJECTS)
$(KERN_OBJECTS): .checkver_$(CMD_CLANG) \
.checkver_$(CMD_GO)
$(CMD_CLANG) \
--target=bpf \
$(BPFHEADER) \
-I $(KERN_SRC_PATH)/arch/$(LINUX_ARCH)/include \
-I $(KERN_SRC_PATH)/arch/$(LINUX_ARCH)/include/uapi \
-I $(KERN_BUILD_PATH)/arch/$(LINUX_ARCH)/include/generated \
-I $(KERN_BUILD_PATH)/arch/$(LINUX_ARCH)/include/generated/uapi \
-I $(KERN_BUILD_PATH)/include \
-I $(KERN_SRC_PATH)/include/uapi \
-I $(KERN_BUILD_PATH)/include/generated \
-I $(KERN_BUILD_PATH)/include/generated/uapi \
-O1 -emit-llvm -S \
-D__BPF_TRACING__ \
-D__KERNEL__ \
-c -o user/bytecode/open.o kern/open.c
.PHONY: assets
assets: \
.checkver_$(CMD_GO)
#
$(CMD_GO) run github.com/shuLhan/go-bindata/cmd/go-bindata -pkg assets -o "assets/ebpf_probe.go" $(wildcard ./user/bytecode/*.o)
.PHONY: build
build: \
.checkver_$(CMD_GO)
#
GOARCH=arm64 GOOS=android CGO_ENABLED=1 CC=aarch64-linux-android29-clang $(CMD_GO) build -ldflags "-w -s" -o bin/edemo .
@SeeFlowerX
Copy link
Author

搜到的信息不多,上面的报错判断是交叉编译导致的问题

可能需要使用cmake把android.toolchain.cmake这种给加上?

@SeeFlowerX
Copy link
Author

或者按照之前的文章用AOSP的文件头

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment