Re: back into the thread....
Mark Manning <[email protected]>
| Newsgroups | gmane.comp.gdb.devel |
|---|---|
| Message-ID | <CAPGNrUXJk3A4=fTbZwUsHoDETGCBgaL0a-0UNfJ2ZsYjZAiNug@mail.gmail.com> |
actually i lied. i get "Cannot access memory at address 8" in this case On Tue, Nov 12, 2013 at 5:47 PM, Sterling Augustine <[email protected]> wrote: > On Tue, Nov 12, 2013 at 2:42 PM, Sterling Augustine > <[email protected]> wrote: >> This feature clearly works. >> > > .. This time with a couple of cleanups. The old example definitely > works, this just eliminates an extraneous call to malloc and an > uninitialized variable. > > include <stdio.h> > #include <stdlib.h> > #include <sys/mman.h> > #include <string.h> > #include <malloc.h> > > const char bytes[] = { 0x89, 0xf8, 0xc3 }; > #define EXEC_BYTES sizeof(bytes) > > typedef int(*function_ptr)(int); > > int main(int argc, char *argv[]) > { > int test_val = 5; > int return_val; > function_ptr dst; > if (posix_memalign((void **) &dst, 4096*8, EXEC_BYTES) != 0) { > printf("can't allocate.\n"); > exit (-1); > } > if (mprotect(dst, EXEC_BYTES, PROT_READ|PROT_WRITE|PROT_EXEC) != 0) { > printf("can't mprotect\n"); > exit (-1); > } > > if (argc > 1) > test_val = atoi(argv[1]); > > memcpy(dst, bytes, EXEC_BYTES); > > return_val = dst(test_val); > printf("return val was %d\n", return_val); > return 0; > } -- "When something can be read without effort, great effort has gone into its writing." -- Enrique Jardiel Poncela --