Re: back into the thread....
Sterling Augustine <[email protected]>
| Newsgroups | gmane.comp.gdb.devel |
|---|---|
| Message-ID | <CAEG7qUx69s2cdp4XY3cGtAakDQAoSrGnbhgvvLxUzZG+rJKC_g@mail.gmail.com> |
This feature clearly works. On Tue, Nov 12, 2013 at 2:08 PM, Mark Manning <[email protected]> wrote: > Got a reply from someone here about my problems with gdb but i cannot > figure out how to reply all and googles reply always top posts my > replies. Also i still have the same issue in that i cannot execute > code that is not part of the original executables object. any > additional code written into memory by my compiler is not executable > yet the person who replied to me said that it SHOULD be possible as he > does it all the time. > > this is a version of gdb running on an arm target (beagle board xm) > under a gentoo linux install - is this a bug injected into gdb by some > gentoo snafu? If gdb doesn't think the memory is accessible, then it probably isn't. The following test-case works perfectly well for gdb. You may want to be sure that you are following all the correct steps in your code generator, particularly the posix_memalign and mprotect. Otherwise your code will take an unexpected segfault. I can set a breakpoint at dst and stepi through it no problem. The contents of bytes comes from compiling int foo(int x) { return x; } at O2 and then copying the resulting bytes into the array. You would want to do something similar to get ARM results. Be sure it doesn't have relocations. ===== #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; int return_val; function_ptr dst = malloc(EXEC_BYTES); 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; }