LuaJit分析(十一)去除string.dump函数

Lua脚本中的string.dump函数用于生成字节码文件,根据对 luajit -b命令的分析可以得出,最终dump出字节码文件都是使用的string.dump函数。

因此即使我们的指令顺序被打乱,通过loadfile系统调用,再通过string.dump调用,可以得到字节码文件,再通过与标准的luajit生成的字节码文件比对,即可找出差异所在。

String.dump的实现在lib_string.c文件中,实现如下:

LJLIB_CF(string_dump)
{
GCfunc *fn = lj_lib_checkfunc(L, 1);
int strip = L->base+1 < L->top && tvistruecond(L->base+1);
SBuf *sb = lj_buf_tmp_(L); /* Assumes lj_bcwrite() doesn't use tmpbuf. */
L->top = L->base+1;
if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))
lj_err_caller(L, LJ_ERR_STRDUMP);
setstrV(L, L->top-1, lj_buf_str(L, sb));
lj_gc_check(L);
return 1;
}

可以看出,它最终是调用lj_bcwriter函数,来完成字节码的生成。但是如果直接将它注释掉,在编译时会出现如下错误:

提示lj_libdef.h这个文件中没有声明lj_cf_string_dump这个标识符,很明显string_dump这个函数的声明为LJLIB_CF(string_dump),其中LJLIB_CF为宏定义,定义如下:

#define LJLIB_CF(name)    static int lj_cf_##name(lua_State *L)

从这个定义就可以得出,注释了string.dump后,这个函数的实现找不到了,但是又被引用,那么找到lj_libdef.h中的第123行,如下:

#ifdef LJLIB_MODULE_string
#undef LJLIB_MODULE_string
static const lua_CFunction
lj_lib_cf_string[] = {
  lj_ffh_string_byte,
  lj_ffh_string_char,
  lj_ffh_string_sub,
  lj_cf_string_rep,
  lj_ffh_string_reverse,
  lj_cf_string_dump,
  lj_cf_string_find,
  lj_cf_string_match,
  lj_cf_string_gmatch,
  lj_cf_string_gsub,
  lj_cf_string_format
};

这里记录了这个函数的实现,同时在lj_ffdef.h中也记录了string.dump:

FFDEF(string_upper)
FFDEF(string_dump)
FFDEF(string_fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值