Mantenere tutto in un unico byte bytecode lua?


Answers

Un'altra alternativa è usare uno strumento come lo squish di Mathew Wild per raccogliere tutte le tue fonti Lua in un unico file .lua . Una bella caratteristica di squish è che supporta una varietà di filtri per rendere il pacchetto più piccolo più piccolo rispetto al totale dei file sorgente.

Dopo aver applicato lo squish, è possibile eseguire il risultato tramite luac per ottenere il bytecode. Tuttavia, il bytecode è spesso più grande del codice sorgente e quasi certamente più grande se viene utilizzato un filtro più aggressivo (come gzip ) in squish.

Se il file bytecode fosse memorizzato separatamente dal file eseguibile (o, peggio, trasmesso attraverso la rete), presenterei anche problemi di sicurezza relativi al bytecode che non si applicano al codice sorgente Lua. Tuttavia, il bytecode collegato a un'applicazione è molto più difficile da sovvertire poiché il bytecode dannoso non sarà mai il risultato dell'esecuzione di luac .

Question

Ho incorporato lua insieme a un blocco bytecode in un progetto scritto in C. Ora, quando estendo la mia base di codice lua aggiungendo file .lua, c'è un modo per mantenere questo codice in un unico byte bytecode?

(So ​​come caricare più pezzi bytecode, ma caricarlo un singolo pezzo e poi dimenticare il codice della colla sembrerebbe semplicemente comodo).

Ho provato a utilizzare l'inclusione testuale, ma a Lua non sembra esistere una parola chiave. "Require" e "dofile" guardano i file in fase di esecuzione, quindi il bytecode risultante dopo aver eseguito "lua -b ..." non includerà il codice di quei file.

E non c'è modo di combinare i file bytecode, vero? Intendo dire che, quando si crea un file bytecode, il comando "richiede" aggiungerebbe il codice di tutti quei file in un unico file bytecode.

PS : la risposta di Michal Kottman funziona per Lua, che è quello che ho chiesto. Pensavo che Lua e LuaJIT avrebbero funzionato allo stesso modo. Non lo fanno. Per combinare più file .lua in un file bytecode LuaJIT, dovrebbe essere uno

  • usa "LuaJIT -b" (sembra non funzionare)
  • compilare luac.c di Lua con le fonti LuaJIT
  • emula luac.c con i comandi lua (senza C API)?



loadstring è ciò che stai cercando. Prende una stringa e carica se (dopo averlo compilato in byte code se necessario). Risulta in una funzione che può essere eseguita per eseguire successivamente il codice contenuto.

Se hai ancora bisogno di qualcosa di più generale, dai un'occhiata al load che ti permette di specificare una funzione per alimentare i blocchi.

Entrambe le funzioni possono elaborare sia il codice sorgente Lua sia il codice byte compilato.