使用ndk14编译proot:
github上找到了自动编译proot的仓库,在ndk19及以上编译是没问题的,运行在android 5以上也ok,但运行在android4.4上会出现一些api的声明与当前android内核版本不一致的情况(如我遇到的是 CANNOT LINK EXECUTABLE: cannot locate symbol “mmap64” referenced by proot…),导致proot无法运行。花了点时间在ndk14上编译了一下,特此记录。
首先需生成ndk14 的cross compile
ndk19及以上会自带支持各种平台架构的交叉编译工具,而19以下则需要我们自行通过make_standalone_toolchain.py来生成
${NDK}/build/tools/make_standalone_toolchain.py --arch arm --api 14 --install-dir /tmp/android-14-toolchain/
/tmp/android-14-toolchain/ 为生成的编译器安装目录,而target-dir/bin/下就是我们需要的编译工具
标题修改编译的config文件
以 https://github.com/green-green-avk/build-proot-android 为例,其根目录下的config文件
#修改arch为armv7a-pre5
ARCHS='armv7a-pre5'
#选择ndk14的安装路径
NDK="/usr/local/android-ndk-r14b"
#指定上面生成的编译工具链路径
TOOLCHAIN="/tmp/android-14-toolchain/"
# export AR="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-ar)"
# export AS="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-as)"
# export CC="$(echo $TOOLCHAIN/bin/$MARCH-linux-android*$API-clang)"
# export CXX="$(echo $TOOLCHAIN/bin/$MARCH-linux-android*$API-clang++)"
# export LD="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-ld)"
# export RANLIB="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-ranlib)"
# export STRIP="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-strip)"
# export OBJCOPY="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-objcopy)"
# export OBJDUMP="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-objdump)"
export AR="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-ar)"
export AS="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-as)"
export CC="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-gcc)"
export CXX="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-g++)"
export LD="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-ld)"
export RANLIB="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-androideabi-ranlib)"
export STRIP="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-strip)"
export OBJCOPY="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-objcopy)"
export OBJDUMP="$(echo $TOOLCHAIN/bin/$MARCH_T-linux-android*-objdump)"
在/tmp/android-14-toolchain/中添加和修改proot所需的额外的头文件(可以从ndk19里面捞)
- 添加 linux/audit.h
- 添加 add linux/memfd.h
- 添加 asm-generic/hugetlb_encode.h
- 在sys/vfs.h中添加 typedef __fsid_t fsid_t
- 在sys/param.h中添加
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
- 在asm-generic/siginfo.h中添加
struct {
void __user * _call_addr;
int _syscall;
unsigned int _arch;
} _sigsys;
#define si_syscall _sifields._sigsys._syscall
编译
最后执行项目根目录下的build.sh即可。