2012-01-09 2 views
7

dlopen()을 사용하여로드 한 동적 라이브러리가 있고 dlclose()을 사용하여 언로드합니다.언로드 동적 라이브러리에는 두 개의 dlclose() 호출이 필요합니까?

어떤 목표 코드도 포함시키지 않으면 dlopen()은 예상되는 동작 인 dlclose() 호출을 필요로합니다. 그러나 목표로하는 목표 C 코드를 포함 할 때 언로드하기 위해로드 된 라이브러리에 두 번의 호출을해야한다는 문제가 있습니다.

예상되는 동작입니까? 어떻게 해결할 수 있습니까?

+0

라이브러리가 숨겨진 방식으로 두 번 dlopen되지 않았습니까? 아니면 버그 일 수도 있습니다. 메모리 누수가'dlopen'-ed 핸들 근처에서 메모리를 덮어 쓰고 있습니까? –

+0

dlopen은 라이브러리 핸들의 참조 횟수를 유지합니다. dlopen이 두 번 수행되면 라이브러리를 언로드하기 위해 두 개의 dlclose()가 필요합니다. obj-C 코드를 포함하는 경우 동적 라이브러리가 필요합니까? 어떤 경우에는 프로그램을 실행할 때 첫 번째 dlopen이 수행 될 수 있습니다. – Finslicer

+0

예 두 번 dlopened되지 않았 음을 확신합니다. dlopen을 사용하여 main에서 간단한 프로그램을 시도해 볼 수 있습니다. dlclose는 객관적인 c 코드가있는 동적 라이브러리를 사용합니다. – MacGeek

답변

26

나는 CFBundle 또는 NSBundle이 아니라 dlopen을 사용하고 있다는 것을 알고 있습니다. CFBundle는 기본적으로 목표 - C 런타임을 지원하지 않기 때문에 Cocoa 응용 프로그램에서

, 당신은 실행 코드를로드하고 언로드 CFBundle 루틴을 사용하지 않아야합니다 : 그럼에도 불구하고, Code Loading Programming Topics 매뉴얼이 말한다. NSBundle은 Objective-C 심볼을 런타임 시스템에 올바르게로드하지만 실행 시간 제한으로 인해로드 된 Cocoa 번들을 언로드 할 수있는 방법은 없습니다.

이 : 때문에 대물-C 런타임 시스템에서 제한

NSBundle는 실행 가능한 코드를 언로드 할 수있다.

이 날 당신이 당신의 라이브러리를로드 할 때, 그것은 목표 - C 런타임에 자신을 등록 의심하게하고, 런타임 (라이브러리의 참조 횟수 또는 어떻게 든 증가)을 다시 라이브러리에 dlopen 호출합니다.

는 내가 목표 - C 런타임 소스 코드를 검색하고 this을 발견

// dylibs are not allowed to unload 
// ...except those with image_info and nothing else (5359412) 
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) { 
    dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD); 
} 

그래서 그래, Objective-C 런타임 언로드되지 않도록하기 위해 특별히 라이브러리에 dlopen를 호출한다. 속임수를 쓰고 dlclose을 두 번 호출하면 나쁜 일이 일어날 것으로 예상됩니다.

+0

+1 훌륭한 답변! – Till

관련 문제