We are dealing with C here. I'm just had this idea, wondering if it is possible to access the point in memory where a function is stored, say foo
and copying the contents of the function to another point in memory. Specifically, I'm trying to get the following to work:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void foo(){
printf("Hello World");
}
int main(){
void (*bar)(void) = malloc(sizeof foo);
memcpy(&bar, &foo, sizeof foo);
bar();
return 0;
}
But running it gives a bus error: Bus error: 10
. I'm trying to copy over the contents of function foo
into a space of memory bar
and then executing the newly created function bar
.
This is for no other reason than to see if such a thing is possible, to reveal the intricacies of the C language. I'm not thinking about what practical uses this has.
I'm looking for guidance getting this to work, or otherwise to be told, with a reason, why this won't work
EDIT Looking at some of the answers and learning about read, write, and executable memory, it just dawned upon me that it would be possible to create functions on the fly in C by writing to executable memory.
As opposed to referencing a data value, a function pointer points to executable code within memory. Dereferencing the function pointer yields the referenced function, which can be invoked and passed arguments just as in a normal function call.
That depends on your compiler and target environment, but most likely it points to ROM—executable code is almost always placed in read-only memory when available.
As shown in the example we can pass functions in another function as an argument using function pointers. This way we can pass reference of function pointer in a function and dereference it later inside the functions body to create a function call.
C programming allows passing a pointer to a function. To do so, simply declare the function parameter as a pointer type.
With standard C, what you try to do is implementation defined behaviour and won't work portably. On a given platform, you might be able to make this work.
The memory malloc
gives you is typically not executable. Jumping there causes a bus error (SIGBUS
). Assuming you are on a POSIX-like system, either allocate the memory for the function with mmap
and flags that cause the memory region to be executable or use mprotect
to mark the region as executable.
You also need to be more careful with the amount of memory you provide, you cannot simply take the size of a function and expect that to be the length of the function, sizeof
is not designed to provide this kind of functionality. You need to find out the function length using some other approach.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With