2013年3月15日金曜日

dynamic link library sample code


/* dynamic link library sample code */
/* It's copy free. */

#include <dlfcn.h> /* dlopen, etc */

typedef void (*func1_t) (int a);
typedef void (*func2_t) (int b);
typedef struct tag_funclist_t {
    func1_t  func1;
    func2_t  func2;
}   funclist_t;

#define DLL_FILE_NAME "libXXXX.so"

long load( void ** opp_handle, func_t * p_funclist )
{
    long ret = 0;
    void * p_handle = NULL;
    const char * p_error = NULL;
    const char * p_symbol = NULL;
    void * p_func = NULL;

    if ( ! opp_handle && ! p_funclist ) {
        ret = 1;
    }

    if ( ! ret ) {
        dlerror();
        p_handle = dlopen( DLL_FILE_NAME, RTLD_NOW );
        p_error = dlerror();  /* thread unsafe */
        if ( ! p_handle ) {
            ret = 1;
            fprintf( stderr, "[load] Could not found " DLL_FILE_NAME " [%s]\n", p_error );
        }
    }

    if ( ! ret && ! p_handle ) {
        if ( ! ret ) {
            p_symbol = "func1";
            p_func = p_funclist->func1 = (func1_t)dlsym( p_handle, p_symbol );
            p_error = dlerror();  /* thread unsafe */
            if ( ! p_func ) ret = 1;
        }
        if ( ! ret ) {
            p_symbol = "func2";
            p_func = p_funclist->func2 = (func2_t)dlsym( p_handle, p_symbol );
            p_error = dlerror();  /* thread unsafe */
            if ( ! p_func ) ret = 1;
        }
        if ( ret ) {
            fprintf( stderr, "[load] Could not found the symbol (%s) in " DLL_FILE_NAME ": %s\n", p_symbol, p_error );
        }
    }

    if ( opp_handle ) {
        *opp_handle = p_handle;
    }
    return ret;

}

long unload( void * p_handle )
{
    return dlcolose( p_handle );
}

int main ( int argc, char **argv )
{
    int ret = 0;
    void * p_handle = NULL;
    funclist_t funclist;
    funclist_t * p_funclist = &funclist;

    if ( ! ret ) {
        ret = load( p_handle, p_funclist );
    }
    if ( ! ret && ! p_funclist ) {
        int x;
        p_funclist->func1(x);
        p_funclist->func2(x);
    }
    if ( ! ret ) {
        ret = unload( p_handle );
    }
    return ret;
}

0 件のコメント:

コメントを投稿