lua 语言的基本使用
下载安装
在联网状态下,Ubuntu可以直接apt安装。
sudo apt install lua
如果是不直接联网的服务器,并且没有root权限的情况下,需要先在联网PC上下载后导入,再编译安装。
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
# copy lua-5.1.5.tar.gz to server by scp or ftp
tar -xvf lua-5.1.5.tar.gz
cd lua-5.1.5
sed -i 's/\/usr\/local/~\/bin\/local/' Makefile
make generic
make install
默认安装目录是/usr/local
, 如果没有root权限,需要修改Makefile,将其改为指定目录(~/bin/local),上面通过sed修改。
值得注意的是,Lua 如果按 make linux 编译,会要求支持readline,所以需要先安装依赖 libreadline-dev
sudo apt-get install libreadline-dev
执行
lua与Python类似,也是脚本型语言,同时也可以直接在shell中边解释边执行。
$ lua
> print("hello world!")
hello world!
CTRL-C
或 CTRL-D
退出。如果是执行脚本文件,如下面的 hello.lua
。
#!/usr/bin/env lua
-- file: hello.lua
print("hello world!")
执行也和其它脚本一样,可以使用 lua 执行,或者添加可执行权限后再直接执行。
$ lua hello.lua
hello world!
$ chmod +x hello.lua
$ ./hello.lua
hello world!
编译
lua 可以和 C 语言一样编译成二进制文件,同样以上面的 hello.lua
为例。
$ luac hello.lua
$ ls
hello.lua luac.out
$ lua luac.out
hello world!
使用 luac
编译后,默认生成 luac.out
文件,但是执行的时候无法直接 ./luac.out
执行,加上可执行权限也一样,必须使用 lua 去执行。
例外,可以通过 luac
的 -o
参数去指定编译后的文件。
$ luac -o hello hello.lua
$ ls
hello hello.lua
$ lua hello
hello world!
hexdump 看下编译后 hello
,还是可以看到许多明文信息的。但是使用objdump是无法反汇编的。会提示无法识别文件格式。
$ hexdump -C hello
00000000 1b 4c 75 61 50 01 04 08 08 06 08 09 09 08 b6 09 |.LuaP...........|
00000010 93 68 e7 f5 7d 41 0b 00 00 00 00 00 00 00 40 68 |.h..}A........@h|
00000020 65 6c 6c 6f 2e 6c 75 61 00 00 00 00 00 00 00 00 |ello.lua........|
00000030 02 04 00 00 00 04 00 00 00 04 00 00 00 04 00 00 |................|
00000040 00 04 00 00 00 00 00 00 00 00 00 00 00 02 00 00 |................|
00000050 00 04 06 00 00 00 00 00 00 00 70 72 69 6e 74 00 |..........print.|
00000060 04 0d 00 00 00 00 00 00 00 68 65 6c 6c 6f 20 77 |.........hello w|
00000070 6f 72 6c 64 21 00 00 00 00 00 04 00 00 00 05 00 |orld!...........|
00000080 00 00 00 00 00 00 41 00 00 01 00 00 00 00 59 00 |......A.......Y.|
00000090 01 00 00 00 00 00 1b 80 00 00 00 00 00 00 |..............|
0000009e
$ lua objdump -D hello
objdump: hello: file format not recognized
最后,使用luac
的 -s
参数可以去掉 debug 信息,减小文件大小,同时也提高反汇编的难度。
-s strip debug information before writing the output file. This saves
some space in very large chunks, but if errors occur when running these
chunks, then the error messages may not contain the full information they
usually do (line numbers and names of locals are lost).
参考资料
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 litreily的博客!