Paste number 44085: hacky closures in C

Paste number 44085: hacky closures in C
Pasted by: bsmntbombdood
When:1 year, 11 months ago
Share:Tweet this! | http://paste.lisp.org/+Y0L
Channel:#lispcafe
Paste contents:
Raw Source | XML | Display As
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>

void begin_adder_closure() {}    /* to get the length of base_adder */
int base_adder(int x)
{
  int closure = 0xDEADBEEF;
  return closure + x;
}
void end_adder_closure() {}




void *make_adder(int num)
{
  int size;
  char *newfunc;
  char *curr;

  size = end_adder_closure - begin_adder_closure;
  /* printf("size: %d\n", size); */

  newfunc = malloc(size);
  mprotect(newfunc, size, PROT_WRITE | PROT_READ | PROT_EXEC);
  memcpy(newfunc, base_adder, size);

  /* implant our value into the function.
     there's probably some way to calculate
     the offset we want, but I don't know it
  */

  curr = newfunc;
  while(*((int*)curr) != 0xDEADBEEF) {
    curr++;
  }

  *((int*)curr) = num;

  return newfunc;
}


int main()
{
  int (*test)(int);

  test = make_adder(2);
  printf("result of 2+3: %d\n", test(3));
  return 0;
}

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.