簡単なメモリマネージャを作成し、ドライバの共有ライブラリを使ってコンパイルしてみました。
共有ライブラリファイル自体はうまくコンパイルされます。ただし、共有ライブラリの関数を呼び出すためにメモリマネージャを使用してドライバをコンパイルすると、以下のスクリーンショットが表示されます。
これは私のshared.cコードです。
/* conveniences for casting and declarations */
typedef block_info* (*MM_CREATE)(size_t, MMPolicy);
typedef void* (*MM_ALLOCATE)(block_info *, size_t, char *);
typedef int (*MM_DEALLOCATE)(block_info *, void *);
typedef void (*MM_DESTROY)(block_info *);
/* Function pointers retrieved from the shared library */
typedef struct LibraryFunctions
{
MM_CREATE create;
MM_DESTROY destroy;
MM_ALLOCATE allocate;
MM_DEALLOCATE deallocate;
}LibraryFunctions;
/* Loads a shared library and returns a pointer to it in libhandle */
/* Returns SUCCESS, if it successful, otherwise, FAILURE */
int load_library(const char *libname, void **libhandle)
{
*libhandle = dlopen(*libhandle, RTLD_LAZY);
if(!(*libhandle))
{
return FAILURE;
}
else
{
return SUCCESS;
}
return *libname;
}
int get_functions(void *libhandle,
LibraryFunctions *functions,
const char **fn_names)
{
functions->create = (MM_CREATE)(intptr_t)dlsym(libhandle, *fn_names);
if(!functions->create)
{
return FAILURE;
}
functions->destroy = (MM_DESTROY)(intptr_t)dlsym(libhandle, *fn_names);
if(!functions->destroy)
{
return FAILURE;
}
functions->allocate = (MM_ALLOCATE)(intptr_t)dlsym(libhandle, *fn_names);
if(!functions->allocate)
{
return FAILURE;
}
functions->deallocate = (MM_DEALLOCATE)(intptr_t)dlsym(libhandle, *fn_names);
if(!functions->deallocate)
{
return FAILURE;
}
return SUCCESS;
これは共有ライブラリを呼び出すドライバコードの一部です。
void setup(void)
{
const char *fn_names[] = {"mm_create", "mm_destroy", "mm_allocate", "mm_deallocate"};
LibraryFunctions funs;
int error;
error = load_library("./libmemmgr.so", &gLib);
if (error == FAILURE)
{
printf("load_library failed! %s\n", dlerror());
exit(-1);
}
error = get_functions(gLib, &funs, fn_names);
if (error == FAILURE)
{
printf("get_functions failed! %s\n", dlerror());
exit(-1);
}
mmlib_create = funs.create;
mmlib_destroy = funs.destroy;
mmlib_allocate = funs.allocate;
mmlib_deallocate = funs.deallocate;
}
void teardown(void)
{
dlclose(gLib);
}
エラーの原因が何であるかよくわかりません。
編集:だからexeを実行できましたが、「get_functions」では失敗しました。私のget_functionsに問題がありますか?
答え1
dl
and(少なくともLinuxでは)を定義するライブラリにリンクしていないようです。dlclose
dlerror
また、独自の機能を定義する共有ライブラリにリンクすることもありませんload_library
。定義されたコードがまったく表示されないため、get_functions
コードがどこにあるのかわかりません。
したがって、共有ライブラリの名前を指定し、すべてのファイルの後にコンパイラのコマンドラインに追加する必要がありlibfoo.so
ます。コンパイラにライブラリ検索パスに現在のディレクトリを追加するように指示し、現在のディレクトリにリンクするように指示し、ライブラリ検索パス(おそらく/usr/lib)の他の場所にリンクするように指示します。-L. -lfoo -ldl
.c
-L.
-lfoo
libfoo.so
-ldl
libdl.so