Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a module system (dynamic loading) in C

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.

like image 729
Nikron Avatar asked Dec 21 '08 05:12

Nikron


People also ask

What is dynamic loading 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.

What are dynamic loaded modules?

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.


1 Answers

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.

like image 89
bortzmeyer Avatar answered Oct 15 '22 11:10

bortzmeyer