Creating a module system (dynamic loading) in C

前端 未结 9 1970
故里飘歌
故里飘歌 2020-12-12 12:53

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

9条回答
  •  盖世英雄少女心
    2020-12-12 13:58

    dlopen is the way to go. Here are a few examples:

    Loading a plugin with dlopen:

    #include 
    ...
    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.

提交回复
热议问题