quickjs加载字节码文件
一、使用qjsc编译字节码
hello.js
console.log("Hello World")
qjsc.exe -c hello.js
1 const uint32_t qjsc_hello_size = 78; 2 3 const uint8_t qjsc_hello[78] = { 4 0x02, 0x04, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 5 0x6c, 0x65, 0x06, 0x6c, 0x6f, 0x67, 0x16, 0x48, 6 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 7 0x6c, 0x64, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 8 0x2e, 0x6a, 0x73, 0x0e, 0x00, 0x06, 0x00, 0xa0, 9 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x14, 10 0x01, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x38, 0xe1, 11 0x00, 0x00, 0x00, 0x42, 0xe2, 0x00, 0x00, 0x00, 12 0x04, 0xe3, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 13 0xcd, 0x28, 0xc8, 0x03, 0x01, 0x00, 14 };
二、字节码写入到bin文件、读取bin文件并运行
1 #include "quickjs-libc.h" 2 #include <stdio.h> 3 #include <inttypes.h> 4 #include <string.h> 5 6 const uint32_t qjsc_hello_size = 78; 7 8 const uint8_t qjsc_hello[78] = { 9 0x02, 0x04, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 10 0x6c, 0x65, 0x06, 0x6c, 0x6f, 0x67, 0x16, 0x48, 11 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 12 0x6c, 0x64, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 13 0x2e, 0x6a, 0x73, 0x0e, 0x00, 0x06, 0x00, 0xa0, 14 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x14, 15 0x01, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x38, 0xe1, 16 0x00, 0x00, 0x00, 0x42, 0xe2, 0x00, 0x00, 0x00, 17 0x04, 0xe3, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 18 0xcd, 0x28, 0xc8, 0x03, 0x01, 0x00, 19 }; 20 21 int writeBinFile() 22 { 23 FILE *f = NULL; 24 f = fopen("hello.bin", "wb"); 25 if (f) 26 { 27 fwrite(qjsc_hello, 1, qjsc_hello_size, f); 28 fclose(f); 29 } 30 else 31 { 32 printf("Failed to open file\n"); 33 } 34 return qjsc_hello_size; 35 } 36 char * readBinFile() 37 { 38 FILE *f = NULL; 39 f = fopen("hello.bin", "rb"); 40 if(f == NULL){ 41 printf("Failed to open file\n"); 42 return NULL; 43 } 44 fseek(f, 0, SEEK_END); 45 int size = ftell(f); 46 fseek(f, 0, SEEK_SET); 47 printf("hello.bin size: %d\n", size); 48 size = size + 1; 49 char *buf = (char *)malloc(size); 50 memset(buf, 0, size); 51 fread(buf, 1, size, f); 52 fclose(f); 53 return buf; 54 } 55 56 int main(int argc, char **argv) 57 { 58 (void) argv; 59 writeBinFile(); 60 char * buf = readBinFile(); 61 if(buf == NULL){ 62 printf("Failed to read file\n"); 63 return -1; 64 } 65 66 JSRuntime * rt = JS_NewRuntime(); 67 js_std_init_handlers(rt); 68 //设置模块加载函数,后续这里可以自定义模块加载 69 JS_SetModuleLoaderFunc(rt, NULL, js_module_loader, NULL); 70 JSContext * ctx = JS_NewContext(rt); 71 js_std_add_helpers(ctx, argc, argv); 72 73 js_std_eval_binary(ctx, buf, qjsc_hello_size, 0); 74 // JS_Eval(ctx, "console.log('Hello World!');", 27, "hello.js", 0); 75 76 js_std_loop(ctx); 77 JS_FreeContext(ctx); 78 JS_FreeRuntime(rt); 79 return 0; 80 }
gcc .\main.c .\libquickjs.a -I ..\..\ -o main
三、函数
hello.js
1 function test(msg){ 2 console.log("Hello World: " + msg); 3 }
编译成bin字节码后,执行
1 int main(int argc, char **argv) 2 { 3 (void) argv; 4 writeBinFile(); 5 char * buf = readBinFile(); 6 if(buf == NULL){ 7 printf("Failed to read file\n"); 8 return -1; 9 } 10 11 JSRuntime * rt = JS_NewRuntime(); 12 js_std_init_handlers(rt); 13 //设置模块加载函数,后续这里可以自定义模块加载 14 JS_SetModuleLoaderFunc(rt, NULL, js_module_loader, NULL); 15 JSContext * ctx = JS_NewContext(rt); 16 js_std_add_helpers(ctx, argc, argv); 17 18 js_std_eval_binary(ctx, buf, qjsc_hello_size, 0); 19 char * cmd = "test('wunaozai');"; 20 JS_Eval(ctx, cmd, strlen(cmd), "hello.js", 0); 21 22 js_std_loop(ctx); 23 JS_FreeContext(ctx); 24 JS_FreeRuntime(rt); 25 return 0; 26 }
打印输出结果
PS D:\test\quickjs\examples\byte> .\main hello.bin size: 133 Hello World: wunaozai
作者:无脑仔的小明 出处:http://www.cnblogs.com/wunaozai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。有需要沟通的,可以站内私信,文章留言,或者关注“无脑仔的小明”公众号私信我。一定尽力回答。 |