나는 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
을 두 번 호출하면 나쁜 일이 일어날 것으로 예상됩니다.
라이브러리가 숨겨진 방식으로 두 번 dlopen되지 않았습니까? 아니면 버그 일 수도 있습니다. 메모리 누수가'dlopen'-ed 핸들 근처에서 메모리를 덮어 쓰고 있습니까? –
dlopen은 라이브러리 핸들의 참조 횟수를 유지합니다. dlopen이 두 번 수행되면 라이브러리를 언로드하기 위해 두 개의 dlclose()가 필요합니다. obj-C 코드를 포함하는 경우 동적 라이브러리가 필요합니까? 어떤 경우에는 프로그램을 실행할 때 첫 번째 dlopen이 수행 될 수 있습니다. – Finslicer
예 두 번 dlopened되지 않았 음을 확신합니다. dlopen을 사용하여 main에서 간단한 프로그램을 시도해 볼 수 있습니다. dlclose는 객관적인 c 코드가있는 동적 라이브러리를 사용합니다. – MacGeek