使用ndk14编译proot

使用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即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值