Просмотр исходного кода

fix: luf_dump的字符串池偏移量算错了

Wendal Chen 4 лет назад
Родитель
Сommit
5e6fe3b7f7
3 измененных файлов с 31 добавлено и 20 удалено
  1. 7 5
      bsp/win32/luf_test/luadb.lua
  2. 18 14
      components/luf/luat_luf_dump.c
  3. 6 1
      components/luf/luat_luf_undump.c

+ 7 - 5
bsp/win32/luf_test/luadb.lua

@@ -60,7 +60,7 @@ TLD(buff, 0x02, string.char(0x00, 0x02))
 
 -- head长度
 buff:write(string.char(0x03, 0x04))
-buff:pack("I", 0x12)
+buff:pack("I", 0x18)
 
 -- 文件数量
 buff:write(string.char(0x04, 0x02))
@@ -86,9 +86,11 @@ for _, value in ipairs(files) do
             -- io.writeFile(tname, string.dump(func))
         -- else
             -- io.writeFile("tmp\\" .. tname, luf.dump(func, false, 0x80E0000 + buff:seek(0, zbuff.SEEK_CUR) + 3*2 + tname:len() + 4 + 2))
-            --log.info(">> pos", string.format("%08X", 0x80E0000 + buff:seek(0, zbuff.SEEK_CUR) + 3*2 + tname:len() + 4 + 2 + 64))
-            --data = luf.dump(func, false, 0x80E0000 + buff:seek(0, zbuff.SEEK_CUR) + 3*2 + tname:len() + 4 + 2)
-            data = luf.dump(func, false, 0x080E0036)
+            -- log.info("what pos", buff:seek(0, zbuff.SEEK_CUR))
+            -- log.info(">> pos", string.format("%08X", 0x080E0000 + buff:seek(0, zbuff.SEEK_CUR) + 3*2 + tname:len() + 4 + 2 + 64))
+            -- data = luf.dump(func, false, 0x80E0000 + buff:seek(0, zbuff.SEEK_CUR) + 3*2 + tname:len() + 4 + 2)
+            data = luf.dump(func, false, 0x080E0033)
+            log.info("iowrite", tname, #data)
             io.writeFile(tname, data)
         -- end
     else
@@ -98,7 +100,7 @@ for _, value in ipairs(files) do
     TLD(buff, 0x02, tname)
     TLD(buff, 0x03, pack.pack("I", #data))
     TLD(buff, 0xFE, string.char(0xFF, 0xFF))
-    --log.info("luadb2", tname, #data, buff:seek(0, zbuff.SEEK_CUR))
+    log.info("luadb2", tname, #data, buff:seek(0, zbuff.SEEK_CUR), string.format("%02X", buff:seek(0, zbuff.SEEK_CUR)))
     -- log.info(">> pos", string.format("%08X", 0x80E0000 + buff:seek(0, zbuff.SEEK_CUR)))
     buff:write(data)
     log.info("luadb3", tname, #data, buff:seek(0, zbuff.SEEK_CUR))

+ 18 - 14
components/luf/luat_luf_dump.c

@@ -385,16 +385,16 @@ static void DumpFunction (const Proto *f, TString *psource, DumpState *D) {
 
 static void DumpHeader (DumpState *D) { // 15+12
   DumpLiteral(LUF_SIGNATURE, D); // 4
-  DumpByte(LUAC_VERSION, D); // 1
-  DumpByte(LUAC_FORMAT + 1, D); // 1
-  DumpLiteral(LUAC_DATA, D); // 6
-  DumpByte(sizeof(int), D); // 1
-  DumpByte(sizeof(size_t), D); // 1
-  DumpByte(sizeof(Instruction), D); // 1
-  DumpByte(sizeof(lua_Integer), D); // 1
-  DumpByte(sizeof(lua_Number), D); // 1
-  DumpInteger(LUAC_INT, D); // 4
-  DumpNumber(LUAC_NUM, D);  // 4
+  DumpByte(LUAC_VERSION, D); // 1, 5
+  DumpByte(LUAC_FORMAT + 1, D); // 1, 6
+  DumpLiteral(LUAC_DATA, D); // 6, 12
+  DumpByte(sizeof(int), D); // 1, 13
+  DumpByte(sizeof(size_t), D); // 1, 14
+  DumpByte(sizeof(Instruction), D); // 1, 15
+  DumpByte(sizeof(lua_Integer), D); // 1, 16
+  DumpByte(sizeof(lua_Number), D); // 1, 17
+  DumpInteger(LUAC_INT, D); // 4, 21
+  DumpNumber(LUAC_NUM, D);  // 4, 25
 }
 
 
@@ -410,19 +410,23 @@ int luf_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,
   D.strip = strip;
   D.status = 0;
 
-  fd_offset = ptroffset + 1;
+  fd_offset = ptroffset;
+  LLOGD("fd_offset %08X  ptroffset %08X", fd_offset, ptroffset);
 
   // LLOGD("sizeof(Upvaldesc) %d", sizeof(Upvaldesc));
   // LLOGD("sizeof(LocVar) %d", sizeof(LocVar));
 
-  DumpHeader(&D); // 27
-  DumpByte(f->sizeupvalues, &D); // 1
+  DumpHeader(&D); // 25
+  DumpByte(f->sizeupvalues, &D); // 1, 26
+
+  LLOGD("after header + sizeupvalues, fd_offset %08X", fd_offset);
 
   size_t tcount = countProtoDumpSize(f);
   spool_init();
-  str_offset = fd_offset + tcount;
+  str_offset = fd_offset + tcount + 4;
   // LLOGD("sizeupvalues %d", f->sizeupvalues);
   LLOGD("str_offset %08X", str_offset);
+  LLOGD("tcount %08X  ptroffset %08X", tcount, ptroffset);
   DumpInt(f->source == NULL ? 0 : str_offset, &D);
   TString* tmp = spool_add(f->source);
   LLOGD("source tmp %p", tmp);

+ 6 - 1
components/luf/luat_luf_undump.c

@@ -420,13 +420,18 @@ LClosure *luat_luf_undump2(lua_State *L, ZIO *Z, const char *name) {
   setclLvalue(L, L->top, cl);
   luaD_inctop(L);
   cl->p = luaF_newproto(L);
-  // LLOGD("sizeupvalues %d", cl->nupvalues);
   luaC_objbarrier(L, cl, cl->p); // add by wendal, refer: https://github.com/lua/lua/commit/f5eb809d3f1da13683cd02184042e67228206205
   size_t s = LoadInt(&S);
   LoadFunction(&S, cl->p, (TString*)s);
   lua_assert(cl->nupvalues == cl->p->sizeupvalues);
   luai_verifycode(L, buff, cl->p);
 
+  dumpHex("& upvalues", &cl->p->upvalues[0], 8);
+  dumpHex("& upvalues[0].name", &cl->p->upvalues[0].name, 8);
+  dumpHex("> upvalues[0].name", cl->p->upvalues[0].name, 8);
+  LLOGD("> getstr(upvalues[0].name) %p", getstr(cl->p->upvalues[0].name));
+  LLOGD("> getstr(upvalues[0].name) %s", getstr(cl->p->upvalues[0].name));
+  dumpHex("head",     (char*)0x080E0000, 8);
   //dumpHex("lineinfo", cl->p->lineinfo, 8);
   //LLOGD("lineinfo %d %d", cl->p->lineinfo[0], cl->p->lineinfo[1]);