Fully Responsive Theme
Resize your Browser to see the Effect
Parallax Effect
Scroll and Notice the Header Image

dlopen 예제

파일이 여러 dlopen() 호출에 지정된 경우 각 호출에서 모드가 해석됩니다. 그러나 RTLD_NOW가 지정되면 모든 재배치가 완료되어 RTLD_NOW 작업이 중복되고 추가 RTLD_LAZY 작업이 관련이 없습니다. 마찬가지로 RTLD_GLOBAL이 지정되면 객체가 주소 공간에 남아 있는 한 RTLD_LOCAL의 이전 또는 이후 사양에 관계없이 RTLD_GLOBAL 상태를 유지해야 합니다(dlclose()참조). 다른 사람 중 다른 dlopen 및 로드 라이브러리 중, 다른 동적 로딩 API의 다양한 래핑 libtltdl (libtool의 일부)와 같은 대안이 있습니다. 또 다른 하나는 GLib의 동적 모듈 로딩 기능입니다. 이 중 하나를 사용하여 플랫폼 간 호환성을 향상시킬 수 있습니다. 나는 그들 중 어느 것을 사용한 적이 없기 때문에 그들이 얼마나 안정적이고 실제로 작동하는지 여부를 말할 수 없습니다. C++는 오버로드(이름이 같지만 다른 인수를 가진 다른 함수)를 허용하고 클래스, 멤버 함수, 예외 사양과 같이 C가 하지 않는 많은 기능을 가지고 있기 때문에 함수 이름을 단순히 기호 이름으로 사용할 수 없습니다. 이를 해결하기 위해 C ++는 함수 이름과 필요한 모든 정보 (예 : 인수의 수 및 크기)를 컴파일러만 알고있는 이상한 문자열로 변환하는 소위 이름 mangling을 사용합니다. foo의 망가진 이름은 foo@4%6^처럼 보일 수 있습니다. 또는 “foo”라는 단어를 포함하지 않을 수도 있습니다. DLopen API의 또 다른 문제는 로딩 함수만 지원한다는 사실입니다.

그러나 C++ 라이브러리에서는 프로그램에서 사용하려는 클래스가 노출되는 경우가 많습니다. 분명히, 그 클래스를 사용 하려면 인스턴스를 만들 필요가, 하지만 그것은 쉽게 할 수 없습니다. 동일한 라이브러리가 dlopen()로 다시 로드되면 동일한 파일 핸들이 반환됩니다. dl 라이브러리는 라이브러리 핸들에 대한 참조 수를 유지하므로 dlclose()가 dlopen()이 성공한 횟수만큼 호출될 때까지 동적 라이브러리가 할당 해제되지 않습니다. _init() 루틴이 있는 경우 한 번만 호출됩니다. 그러나 RTLD_NOW를 사용하는 후속 호출은 RTLD_LAZY로 이전에 로드된 라이브러리에 대해 기호 확인을 강제할 수 있습니다. 오류는 dlopen(), dlsym() 또는 dlclose()에 대한 마지막 호출의 오류를 설명하는 문자열을 반환하는 dlerror()를 호출하여 보고할 수 있습니다. 한 가지 이상한 점은 dlerror()를 호출한 후 다른 오류가 발생할 때까지 dlerror()에 대한 이후 호출이 NULL을 반환한다는 것입니다. 라이브러리가 서로 종속되는 경우(예: X는 Y에 따라 달라짐) 먼저 종속성을 로드해야 합니다(이 예제에서는 Y를 먼저 로드한 다음 X).

This entry was posted in Uncategorized.