How would one go about loading compiled C code at run time, and then calling functions within it? Not like simply calling exec().
EDIT: The the program loading the module is in C.
Dynamic loading is a mechanism by which a computer program can, at run time, load a library (or other binary) into memory, retrieve the addresses of functions and variables contained in the library, execute those functions or access those variables, and unload the library from memory.
Dynamic Load Modules. Dynamic load modules provide the following functions: Load, refresh, and delete installation load modules, which are not part of the IBM® base JES2 code, after JES2 initialization processing. The dynamic table pairs and exit routine addresses are updated as needed.
dlopen is the way to go. Here are a few examples:
Loading a plugin with dlopen:
#include <dlfcn.h> ... int main (const int argc, const char *argv[]) { char *plugin_name; char file_name[80]; void *plugin; ... plugin = dlopen(file_name, RTLD_NOW); if (!plugin) { fatal("Cannot load %s: %s", plugin_name, dlerror ()); }
Compiling the above:
% cc -ldl -o program program.o
Then, assuming this API for the plugins:
/* The functions we will find in the plugin */ typedef void (*init_f) (); init_f init; typedef int (*query_f) (); query_f query;
Finding the address of init() in the plugin:
init = dlsym(plugin, "init"); result = dlerror(); if (result) { fatal("Cannot find init in %s: %s", plugin_name, result); } init();
With the other function, query(), which returns a value:
query = dlsym (plugin, "query"); result = dlerror(); if (result) { fatal("Cannot find query in %s: %s", plugin_name, result); } printf("Result of plugin %s is %d\n", plugin_name, query ());
You can retrieve the complete example on line.
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