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;

}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.