/* 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 件のコメント:
コメントを投稿