2014-04-17 2 views
0

dlopen을 사용하여 메모리에 심볼을로드하려고합니다.dlopen이 제대로 작동하는지 어떻게 알 수 있습니까?

그러나 제대로 작동하는지 잘 모르겠습니다. 다음과 같이

내 코드 :

const char* lib_names[] = {"libudev.so.0.13.0"}; 
int lib = dlopen(lib_names[0], RTLD_NOLOAD | RTLD_LAZY | RTLD_GLOBAL); 

이 공유 객체가 제대로 열 경우 나 판단이 LIB가 FD를 재생할 수 있습니까? 피드백

+1

'dlopen()'이 NULL을 반환하지 않으면 제대로 열립니다. –

답변

4

dlopen()에 대한

감사는 void * 포인터를 반환한다. 포인터는 다른 동적 연결 로더 함수로 전달되는 핸들입니다. 따라서 반환 유형을 void *으로 변경하십시오.

void *lib = dlopen(...) 

lib을 확인하면 라이브러리가 제대로 열렸는지 확인할 수 있습니다. lib이 NULL이면 라이브러리를 열지 못했습니다. lib이 NULL이 아니면 라이브러리가 성공적으로 열립니다. dlerror()을 사용하면 라이브러리가 열리지 않은 이유에 대한 텍스트 오류 문자열을 얻을 수 있습니다. RTLD_NOLOAD 플래그가 설정되어, dlopen() 실제로 라이브러리를 엽니되지 않습니다

void *lib = dlopen(...) 
if (lib == NULL) { 
    fprintf(stderr, "Shared library failed to open: %s\n", dlerror()); 
    exit(1); 
} 

참고 : 예를 들면. 매뉴얼 페이지에서 :

라이브러리를로드하지 마십시오. 이것은 라이브러리가 이미 상주하는지 테스트하는 데 사용할 수 있습니다 (dlopen()이 없으면 NULL을 반환하고 없으면 NULL을 반환합니다). 이 플래그는 이미로드 된 라이브러리의 플래그를 승격시키는 데에도 사용할 수 있습니다. 예를 들어 이전에 RTLD_LOCAL로로드 된 라이브러리는 RTLD_NOLOAD | RTLD_GLOBAL. 이 플래그는 POSIX.1-2001에 명시되어 있지 않다.

원하는 동작을 사용하려면 RTLD_NOLOAD을 삭제해야 할 수도 있습니다.

관련 문제