Running V8 in jitless mode might be an easier path forward.

(But good luck with the `dlopen` adventure if you decide to go down that
route!)


On Tue, Jan 30, 2024 at 2:43 PM Frederick Virchanza Gotham <
[email protected]> wrote:

>
> I have access to a remote web server running Linux, and I want to run
> NodeJs on it. When I try to run NodeJs though, it crashes because it cannot
> set a page as executable. Specifically the failure occurs in
> 'platform-posix.cc' inside the function 'SetPermissions'. mprotect returns
> -1 with errno set to EACCES. I cannot use 'paxctl' to change this.
>
> Because I couldn't set a page as executable, I thought I might at compile
> time write a very long function and fill it with 'nop' instructions, and
> then at runtime try to set this executable page as writeable, but this too
> is forbidden.
>
> So I have one more idea. Let's say I write a C source file "monkey.c" as
> follows:
>
>     void MyCode(void)
>     {
>         __asm__ volatile("nop");
>         __asm__ volatile("nop");
>         __asm__ volatile("nop");
>         __asm__ volatile("nop");
>        ....
>     }
>
> Let's say I put 8 kilobytes worth of nop's inside this function. Next I
> compile it to a shared library as follows:
>
>     gcc -o libmonkey.so -shared -fPIC monkey.c
>
> So now I have a shared library file named "libmonkey.so" which contains an
> exported function called 'MyCode' that contains 8 thousand nop's.
>
> Then, in the v8 library, let's say we have an array of CPU instructions,
> something like:
>
>     char unsigned instructions[8192u] = { 0xac, 0xb4,  . . . .  };
>
> So in the v8 library, we open up "libmonkey.so" and we write to it:
>
>     FILE *f = fopen("libmonkey.so", "rb+");
>     fseek(f, offset_of_MyCode, SEEK_SET);
>     fwrite(instructions, 1u, 8192u, f);
>     fclose(f);
>
> Then in the v8 library, we use 'dlopen' to load this shared library, and
> we use 'dlsym' to find "MyCode", and then we execute it:
>
>     void *h = dlopen("libmonkey.so", RTLD_NOW);
>     void (*func)(void) = (void(*)(void))dlsym(h, "MyCode");
>     func();
>     dlclose(h);
>
> This is a bit Frankenstein-ish but it will work. IDoes anybody want to
> help me fork the v8 repo and get this working? I've done this kind of stuff
> before.
>
> --
> --
> v8-dev mailing list
> [email protected]
> http://groups.google.com/group/v8-dev
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-dev/a881826d-745f-456d-9e9e-9d5394c0e12en%40googlegroups.com
> <https://groups.google.com/d/msgid/v8-dev/a881826d-745f-456d-9e9e-9d5394c0e12en%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-dev/CAKSzg3RmLS%2BzjW7B%2B7w%3DT1-gE7JU%3DFoGMveyMxL9uiB6U%3Dse0A%40mail.gmail.com.

Reply via email to