LuaJit分析(一)LuaJit交叉编译
Android
使用ndk版本 r16b
在luajit2.1.0-beta3目录下创建一个脚本文件,armv7编译代码如下:
make clean
NDK=E:/android-ndk-r16b #ndk路径
NDKABI=21
NDKTRIPLE=arm-linux-androideabi
NDKVER=$NDK/toolchains/$NDKTRIPLE-4.9
NDKP=$NDKVER/prebuilt/windows-x86_64/bin/$NDKTRIPLE-
NDKF="-isystem $NDK/sysroot/usr/include/$NDKTRIPLE -D __ANDROID_API__=$NDKABI -D _FILE_OFFSET_BITS=32"
NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"
NDK_SYSROOT_BUILD=$NDK/sysroot
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm
make CC="gcc" HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH" TARGET_SYS=Linux TARGET_SHLDFLAGS="--sysroot $NDK_SYSROOT_LINK" TARGET_LDFLAGS="--sysroot $NDK_SYSROOT_LINK" TARGET_CFLAGS="--sysroot $NDK_SYSROOT_BUILD -std=c11"
NDKP指定了ndk编译器的前缀
NDKARCH指定了编译成armv7平台
NDK_SYSROOT_BUILD指定了头文件目录
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm指定了链接时的库文件目录
1、Windows下编译:
启动cygwin64,切换到luajit目录,sh运行脚本(需要安装make)
2、Linux下编译:
sh运行脚本,注意ndk路径
clang编译:
测试时使用的最新的NDK版本(r20)已经删除了gcc,只能使用clang编译,clang编译可以方便的对代码进行混淆,ndk-r20进行clang编译的脚本如下(其它NDK版本类似):
make clean
NDK=/home/guohao/android-ndk-r20
NDKABI=21
NDKTRIPLE=arm-linux-androideabi
NDKVER=$NDK/toolchains/llvm
NDKP=$NDKVER/prebuilt/linux-x86_64/bin/$NDKTRIPLE-
NDKARCH="--target=armv7a-linux-androideabi$NDKABI -mfloat-abi=softfp"
NDK_SYSROOT_HEAD="-isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm/usr/lib
make CC="clang" HOST_CC="gcc -m32" TARGET_FLAGS="$NDKARCH" CROSS=$NDKP TARGET_SYS=Linux TARGET_SHLDFLAGS="" TARGET_LDFLAGS="-L $NDK_SYSROOT_LINK " TARGET_CFLAGS="$NDK_SYSROOT_HEAD $NDKARCH -std=c11"
其中 CC指定使用编译器为clang,将$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin 目录下的clang文件复制一份命名为arm-linux-androideabi-clang
NDKARCH指定了clang编译器生成的文件平台,NDK_SYSROOT_HEAD指定了编译过程中需要的头文件
NDK_SYSROOT_LINK指定了链接过程中需要的库文件
比较老的NDK版本中(如r16b)既有clang编译器,又有gcc编译器,但是clang编译器的目录下没有链接器,这是需要修改Makefile文件,指定链接时用gcc下的链接器:
make clean
NDK=E:/android-ndk-r16b
NDKABI=21
NDKTRIPLE=arm-linux-androideabi-
NDKVER=$NDK/toolchains/llvm
NDKP=$NDKVER/prebuilt/windows-x86_64/bin/
NDKARCH="--target=armv7a-linux-androideabi$NDKABI -mfloat-abi=softfp"
NDK_SYSROOT_HEAD="-isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm
make CC="clang" HOST_CC="gcc -m32" TARGET_FLAGS="$NDKARCH" CROSS=$NDKP TARGET_SYS=Linux TARGET_SHLDFLAGS="" TARGET_LDFLAGS="-L $NDK_SYSROOT_LINK " TARGET_CFLAGS="$NDK_SYSROOT_HEAD $NDKARCH -std=c11" CROSS_LD="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc $NDK_SYSROOT_HEAD --sysroot $NDK_SYSROOT_LINK"
其中CROSS_LD指定了编译完后链接时使用的链接器,这里使用gcc,同时修改Makefile文件211行的TARGET_LD如下:
TARGET_LD= $(CROSS_LD)
同时 将 ar 和 strip 拷贝过来到clang目录
IOS
#!/bin/bash
# LuaJIT 的源码路径
LUAJIT=.
XCODEPATH=`xcode-select -print-path`
DEVDIR=$XCODEPATH/Platforms
IOSVER=iPhoneOS.sdk
SIMVER=iPhoneSimulator.sdk
# 库的最总名称
LIBNAME=libluajit-2.1.0-beta3.a
# iOS 最低兼容版本,最好与需要嵌入 LuaJIT 的 App 的最低兼容设置保持一致.
MINVERSION=9.0
IOSDIR=$DEVDIR/iPhoneOS.platform/Developer
SIMDIR=$DEVDIR/iPhoneSimulator.platform/Developer
# xctoolchain 可以使用 xcode-select --install 命令安装.
# xctoolchain 和模拟器中, 目前已不包含 gcc 等命令,可以从系统其它位置复制到 $IOSBIN 目录.
# 命令的具体路径,可以执行 xcodebuild -find gcc 获得.
IOSBIN=$XCODEPATH/Toolchains/XcodeDefault.xctoolchain/usr/bin/
SIMBIN=$SIMDIR/usr/bin/
BUILD_DIR=$LUAJIT/build
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
rm *.a 1>/dev/null 2>/dev/null
echo =================================================
echo ARM64 Architecture
ISDKF="-arch arm64 -isysroot $IOSDIR/SDKs/$IOSVER -miphoneos-version-min=$MINVERSION -fembed-bitcode"
#make -j -C $LUAJIT CC="clang" HOST_CC="clang" CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS clean
make -j -C $LUAJIT CC="clang" HOST_CC="clang" CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS
mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajit64bit.a
# echo =================================================
# echo IOS Simulator Architecture
# ISDKF="-arch x86_64 -isysroot $SIMDIR/SDKs/$SIMVER -miphoneos-version-min=$MINVERSION"
# make -j -C $LUAJIT CC="clang" HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 clean
# make -j -C $LUAJIT CC="clang" HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 amalg CROSS=$SIMBIN TARGET_FLAGS="$ISDKF"
# mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajitx86_64.a
libtool -o $BUILD_DIR/$LIBNAME $BUILD_DIR/*.a 2> /dev/null
mkdir -p $BUILD_DIR/headers
cp $LUAJIT/src/lua.h $BUILD_DIR/headers
cp $LUAJIT/src/lauxlib.h $BUILD_DIR/headers
cp $LUAJIT/src/lualib.h $BUILD_DIR/headers
cp $LUAJIT/src/luajit.h $BUILD_DIR/headers
cp $LUAJIT/src/lua.hpp $BUILD_DIR/headers
cp $LUAJIT/src/luaconf.h $BUILD_DIR/headers