在 iOS 6.1.6 设备上编译 Lua 5.1.5

开始之前

  • 一台越狱了的 iOS 设备(我这里使用的是 iPod touch 4th Gen)
  • 已经在 iOS 设备上安装了 apt-get 等常用的命令行工具
  • 越狱设备可以通过 Wifi 或 usbmuxd 进行 SSH 连接
  • 具备入门级的开发经验,熟悉命令行操作环境
  • 耐心、细心和不怕折腾的决心
  • 部分资源的访问可能受网络环境影响,无法正常访问,请自行解决
  • 以下所有操作,均为 root 帐号 SSH 到 iOS 设备上远程进行的

准备编译环境

安装 wget,从网上抓东西,就全靠它了。

1
$ apt-get install wget

安装 unzip,后面需要安装 gcc lib 需要用到:

1
$ apt-get install unzip

Cydia 的系统依赖里面缺少了 libgcc 库,所以,我们需要下载一个伪装的 libgcc 库。这里给出的下载地址为 Google Code 的,如果同学们无法访问,请自行搜索下载地址。如果连接的是 https 服务器,请务必确认有 –no-check-certificate 参数,如果是 http 则无需添加。

1
$ wget -c "https://optimazationandcombinationcode.googlecode.com/files/fake-libgcc_1.0_iphoneos-arm.deb" --no-check-certificate

使用 Cydia 自带的包管理软件安装之:

1
$ dpkg -i fake-libgcc_1.0_iphoneos-arm.deb

安装 BigBoss 源中所带的 Toolchain,它会顺便安装 gcc,make,ldid 等常用的开发工具:

1
$ apt-get install com.bigboss.20toolchain

下载系统中缺少的 gcc libs 并解压缩:

1
2
$ wget -c "https://optimazationandcombinationcode.googlecode.com/files/lib.zip" --no-check-certificate
$ unzip lib.zip

需要将编译 Lua 所需要的几个 gcc lib 文件复制到 /usr/lib 目录下,否则在链接的时候会报错:

  • libm.dylib
  • libgcc_s.10.5.dylib
  • libSystem.dylib

编译 Lua 5.1.5

第一要做的,当然是先得把 Lua 5.1.5 源代码 弄回来啦:

1
$ wget -c "http://www.lua.org/ftp/lua-5.1.5.tar.gz"

解压缩之:

1
$ tar zxvf lua-5.1.5.tar.gz

编译走起!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ cd lua-5.1.5
$ make macosx test
cd src && make macosx test
make[1]: Entering directory `/private/var/root/lua-5.1.5/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"
make[2]: Entering directory `/private/var/root/lua-5.1.5/src'
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lapi.o lapi.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lcode.o lcode.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldebug.o ldebug.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldo.o ldo.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldump.o ldump.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lfunc.o lfunc.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lgc.o lgc.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o llex.o llex.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lmem.o lmem.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lobject.o lobject.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lopcodes.o lopcodes.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lparser.o lparser.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstate.o lstate.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstring.o lstring.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltable.o ltable.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltm.o ltm.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lundump.o lundump.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lvm.o lvm.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lzio.o lzio.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lauxlib.o lauxlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lbaselib.o lbaselib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldblib.o ldblib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o liolib.o liolib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lmathlib.o lmathlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o loslib.o loslib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltablib.o ltablib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstrlib.o lstrlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o loadlib.o loadlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o # DLL needs all object files
ranlib liblua.a
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lua.o lua.c
gcc -o lua lua.o liblua.a -lm -lreadline
gcc -O2 -Wall -DLUA_USE_LINUX -c -o luac.o luac.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o print.o print.c
gcc -o luac luac.o print.o liblua.a -lm -lreadline
make[2]: Leaving directory `/private/var/root/lua-5.1.5/src'
make[1]: Leaving directory `/private/var/root/lua-5.1.5/src’
src/lua test/hello.lua
Hello world, from Lua 5.1!

完工!测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ src/lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
>

$ src/luac
src/luac: no input files given
usage: src/luac [options] [filenames].
Available options are:
- process stdin
-l list
-o name output to file 'name' (default is "luac.out")
-p parse only
-s strip debug information
-v show version information
-- stop handling options