One first problem might be that the location where the prog data is stored is not executable.
On Linux at least, the resulting binary will place the contents of global variables in the “data” segment or here, which is not executable in most normal cases.
The second problem might be that the code you are invoking is invalid in some way. There’s a certain procedure to calling a method in C, called the calling convention (you might be using the “cdecl” one, for example). It might not be enough for the called function to just “ret”. It might also need to do some stack cleanup etc. otherwise the program will behave unexpectedly. This might prove an issue once you get past the first problem.