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

kali@ubuntu:~/Desktop/ebpf/ebpf-golang-demo$ make
aarch64-linux-android29-clang \
        --target=bpf \
        -I ./kern -I ./kern/bpf/arm64 \
        -I /home/kali/Desktop/ebpf/kheaders/arch/arm64/include \
        -I /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/uapi \
        -I /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/generated \
        -I /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/generated/uapi \
        -I /home/kali/Desktop/ebpf/kheaders/include \
        -I /home/kali/Desktop/ebpf/kheaders/include/uapi \
        -I /home/kali/Desktop/ebpf/kheaders/include/generated \
        -I /home/kali/Desktop/ebpf/kheaders/include/generated/uapi \
        -O1 -emit-llvm -S \
        -D__BPF_TRACING__ \
        -D__KERNEL__ \
        -c -o user/bytecode/open.o kern/open.c
In file included from kern/open.c:1:
In file included from ./kern/edemo.h:6:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/bpf.h:7:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/workqueue.h:7:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/timer.h:6:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/ktime.h:5:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/time.h:6:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/seqlock.h:6:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/spinlock.h:39:
In file included from /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/spinlock.h:7:
In file included from /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/processor.h:20:
In file included from /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/cpufeature.h:25:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/jump_label.h:103:
In file included from /home/kali/Desktop/ebpf/kheaders/include/linux/atomic.h:5:
In file included from /home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic.h:18:
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
ATOMIC_OPS(add, add, I)
^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:75:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP(__VA_ARGS__)                                          \
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:25:33: note: expanded from macro 'ATOMIC_OP'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:76:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(        , dmb ish,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:77:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_relaxed,        ,  ,  ,         , __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:78:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_acquire,        , a,  , "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:79:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_release,        ,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:80:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (        , dmb ish,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:81:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_relaxed,        ,  ,  ,         , __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:82:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_acquire,        , a,  , "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:85:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:83:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_release,        ,  , l, "memory", __VA_ARGS__)
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
ATOMIC_OPS(sub, sub, J)
^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:75:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP(__VA_ARGS__)                                          \
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:25:33: note: expanded from macro 'ATOMIC_OP'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:76:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(        , dmb ish,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:77:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_relaxed,        ,  ,  ,         , __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:78:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_acquire,        , a,  , "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:79:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP_RETURN(_release,        ,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:44:33: note: expanded from macro 'ATOMIC_OP_RETURN'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:80:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (        , dmb ish,  , l, "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:81:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_relaxed,        ,  ,  ,         , __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:82:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_acquire,        , a,  , "memory", __VA_ARGS__)\
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:86:1: error: invalid output constraint '+Q' in asm
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:83:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_FETCH_OP (_release,        ,  , l, "memory", __VA_ARGS__)
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:66:46: note: expanded from macro 'ATOMIC_FETCH_OP'
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)   \
                                                    ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:96:1: error: invalid output constraint '+Q' in asm
ATOMIC_OPS(and, and, )
^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:90:2: note: expanded from macro 'ATOMIC_OPS'
        ATOMIC_OP(__VA_ARGS__)                                          \
        ^
/home/kali/Desktop/ebpf/kheaders/arch/arm64/include/asm/atomic_ll_sc.h:25:33: note: expanded from macro 'ATOMIC_OP'
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)                \
                                       ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [Makefile:103: kern/open.o] Error 1

@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