공유 라이브러리 파일을 사용하여 드라이버를 컴파일할 때 정의되지 않은 참조

공유 라이브러리 파일을 사용하여 드라이버를 컴파일할 때 정의되지 않은 참조

간단한 메모리 관리자를 만들고 드라이버의 공유 라이브러리를 이용해 컴파일해 보았습니다.

공유 라이브러리 파일 자체는 잘 컴파일됩니다. 그러나 공유 라이브러리의 함수를 호출하기 위해 메모리 관리자를 사용하여 드라이버를 컴파일하면 아래 스크린샷이 표시됩니다.에러 메시지

이것은 내 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

dland (적어도 Linux에서는)를 정의하는 라이브러리에 대해 연결하지 않는 것 같습니다 .dlclosedlerror

또한 자신의 기능을 정의하는 공유 라이브러리에 연결하지도 않습니다 load_library. 정의된 코드가 전혀 표시되지 않아 get_functions코드가 어디에 있는지 잘 모르겠습니다.

따라서 공유 라이브러리의 이름을 지정해야 하며 모든 파일 뒤에 컴파일러 명령줄에 추가 libfoo.so해야 합니다 . 컴파일러에게 라이브러리 검색 경로에 현재 디렉토리를 추가하라고 지시하고 , 현재 디렉토리에서 링크하도록 지시하며 , 라이브러리 검색 경로(아마도 /usr/lib)의 다른 곳으로도 링크하도록 지시합니다.-L. -lfoo -ldl.c-L.-lfoolibfoo.so-ldllibdl.so

관련 정보