当前位置: 首页 > news >正文

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.0IOSDIR=$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/buildrm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
rm *.a 1>/dev/null 2>/dev/nullecho =================================================
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.alibtool -o $BUILD_DIR/$LIBNAME $BUILD_DIR/*.a 2> /dev/nullmkdir -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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 今日算法:蓝桥杯基础题之“切面条”
  • VS2022出现C1001内部编译器错误的情况分析
  • 性能测试⼯具-——JMeter
  • 关于位结构体及位操作总结
  • 项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略
  • 传统CV算法——基于opencv的答题卡识别判卷系统
  • 机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)
  • python办公自动化:使用`Python-PPTX`的样式与格式
  • C++ ─── List的模拟实现
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task3:批量归一化
  • 接口请求400
  • C#面试题系列--动态更新
  • ES6中是如何实现模块化
  • 【聚星文社】AI一键生成工具素材包
  • 收藏夹里的“小网站”被误报违规不让上怎么办?如何将Chrome和Edge安装到 D 盘(含用户数据),重装系统也不会丢失收藏夹和密码?
  • [译] React v16.8: 含有Hooks的版本
  • CSS实用技巧
  • ECMAScript入门(七)--Module语法
  • HTTP请求重发
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript创建对象的四种方式
  • JavaScript的使用你知道几种?(上)
  • Theano - 导数
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue ES6 Jade Scss Webpack Gulp
  • Wamp集成环境 添加PHP的新版本
  • 代理模式
  • 离散点最小(凸)包围边界查找
  • 前端js -- this指向总结。
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 再次简单明了总结flex布局,一看就懂...
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • k8s使用glusterfs实现动态持久化存储
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #nginx配置案例
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (面试必看!)锁策略
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET 快速重构概要1
  • .Net中wcf服务生成及调用
  • .sys文件乱码_python vscode输出乱码
  • @property括号内属性讲解
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • []error LNK2001: unresolved external symbol _m
  • []sim300 GPRS数据收发程序
  • [ACP云计算]组件介绍
  • [autojs]autojs开关按钮的简单使用
  • [BJDCTF 2020]easy_md5
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [iOS]把16进制(#871f78)颜色转换UIColor