From 93579ee65d53700250c90b56c13b8e74176425e6 Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Tue, 28 Aug 2018 18:31:43 +0900 Subject: add protect-re.cpp --- sample/protect-re.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 sample/protect-re.cpp diff --git a/sample/protect-re.cpp b/sample/protect-re.cpp new file mode 100644 index 0000000..6eaa863 --- /dev/null +++ b/sample/protect-re.cpp @@ -0,0 +1,70 @@ +#define XBYAK_NO_OP_NAMES +#include + +struct Code1 : Xbyak::CodeGenerator { + Code1() + : Xbyak::CodeGenerator(4096, Xbyak::DontSetProtectRWE) + { + mov(eax, 123); + ret(); + } + void update() + { + db(0); + } +}; + +void test1(bool updateCode) +{ + Code1 c; + c.setProtectModeRE(); + if (updateCode) c.update(); // segmentation fault + int (*f)() = c.getCode(); + printf("f=%d\n", f()); + + c.setProtectModeRW(); + c.update(); + puts("ok"); +} + +struct Code2 : Xbyak::CodeGenerator { + Code2() + : Xbyak::CodeGenerator(4096, Xbyak::AutoGrow) + { + mov(eax, 123); + ret(); + } + void update() + { + db(0); + } +}; + +void test2(bool updateCode) +{ + Code2 c; + c.readyRE(); + if (updateCode) c.update(); // segmentation fault + int (*f)() = c.getCode(); + printf("f=%d\n", f()); + + c.setProtectModeRW(); + c.update(); + puts("ok"); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) { + fprintf(stderr, "%s [update]\n", argv[0]); + return 0; + } + bool update = argc == 3; + int n = atoi(argv[1]); + printf("n=%d update=%d\n", n, update); + switch (n) { + case 1: test1(update); break; + case 2: test2(update); break; + default: fprintf(stderr, "no test %d\n", n); break; + } +} -- cgit v1.2.3