간단한 메모리 관리자를 만들고 드라이버의 공유 라이브러리를 이용해 컴파일해 보았습니다.
공유 라이브러리 파일 자체는 잘 컴파일됩니다. 그러나 공유 라이브러리의 함수를 호출하기 위해 메모리 관리자를 사용하여 드라이버를 컴파일하면 아래 스크린샷이 표시됩니다.
이것은 내 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