dlopen 서브루틴
용도
호출 프로세스에 모듈을 동적으로 로드합니다.
구문
#include <dlfcn.h> void *dlopen (FilePath, Flags);
const char *FilePath;
int Flags;설명
Dlopen 서브루틴은 FilePath 지정된 모듈을 실행 중인 프로세스의 주소 공간에 로드합니다. 모듈의 종속 요소도 자동으로 로드됩니다. 모듈이 이미 로드된 경우 다시 로드되지 않고 새로운 고유 값이 dlopen 서브루틴에 의해 반환됩니다.
Dlopen 서브루틴은 공유 라이브러리를 동적으로 로드하는 이식 가능한 방법입니다. ' loadAndInit 서브루틴이 하는 것처럼 로드하는 모듈의 C++ 정적 초기화를 수행합니다.
Dlopen에서 반환된 값은 이후 dlsym 및 dlclose 호출에 사용될 수 있습니다. 작업 중에 오류가 발생하면 dlopen이 반환됩니다NULL.
주 애플리케이션이 -brtl 옵션으로 링크된 경우 런타임 링커는 dlopen에 의해 호출됩니다. 로드 중인 모듈이 런타임 링크가 활성화된 상태에서 링크된 경우, 모듈 내 참조와 모듈 간 참조는 모두 기본 애플리케이션에서 사용 가능한 심볼로 재정의됩니다. 런타임 링크가 활성화되었지만 모듈이 활성화된 상태로 빌드되지 않은 경우 모든 모듈 간 참조는 재정의되지만 일부 모듈 내 참조는 재정의되지 않습니다.
Dlopen으로 열려는 모듈 또는 그 종속 모듈이 처음 로드되는 경우, 새로 로드된 루틴의 초기화 루틴은 dlopen이 반환되기 전에 (해당하는 경우 런타임 링크 후) 호출됩니다. 초기화 루틴은 모듈을 빌드할 때 -binitfini: 링커 옵션으로 지정한 함수입니다. (이 옵션에 대한 자세한 내용은 ld 명령을 참조하세요.)
새로 로드된 모든 모듈에 대한 초기화 함수를 호출한 후 C++ 정적 초기화가 수행됩니다. 초기화 함수 또는 C++ 정적 초기화 함수 내에서 dlopen 서브루틴을 호출하면 원래 로드된 모듈이 완전히 초기화되기 전에 중첩된 dlopen 서브루틴에 의해 로드된 모듈이 초기화될 수 있습니다.
바이닛피니 함수 내에서 dlopen 서브루틴을 호출하면 현재 모듈의 초기화가 다른 모듈을 위해 포기됩니다.
' LIBPATH ' 또는 ' LD_LIBRARY_PATH 환경 변수를 사용하여 dlopen 서브루틴이 명명된 모듈을 검색하는 디렉터리 목록을 지정할 수 있습니다. 실행 중인 애플리케이션에는 애플리케이션을 연결할 때 지정한 라이브러리 검색 경로 세트도 포함되어 있습니다. ' dlopen 서브루틴은 ' load ' 서브루틴이 정의한 메커니즘에 따라 모듈을 검색하는데, 이는 ' dlopen ' 서브루틴이 내부적으로 ' L_LIBPATH_EXEC ' 플래그로 ' load ' 서브루틴을 호출하기 때문입니다.
| 항목 | 설명 |
|---|---|
| FilePath | 로드 가능한 모듈이 포함된 파일의 이름을 지정합니다. 이 매개변수에는 절대 경로, 상대 경로 또는 경로 구성 요소를 포함하지 않을 수 있습니다. FilePath 슬래시 문자가 포함되어 있으면 FilePath 직접 사용되며 디렉터리가 검색되지 않습니다. FilePath 매개 변수가/unix는 프로세스가 실행을 시작할 때 사용 가능했던 커널 확장에 있는 심볼을 포함하여 현재 커널 이미지에서 심볼을 조회하는 데 사용할 수 있는 값을 반환합니다. FilePath 값이NULL를 입력하면 기본 애플리케이션의 값이 반환됩니다. 이를 통해 동적으로 로드된 객체가 주 실행 파일에서 심볼을 조회하거나 애플리케이션이 자체 내에서 사용 가능한 심볼을 검사할 수 있습니다. |
플래그
Dlopen 동작의 변형을 지정합니다. RTLD_NOW 또는 RTLD_LAZY는 항상 지정해야 합니다. 다른 플래그는 RTLD_NOW 또는 RTLD_LAZY로 OR'될 수 있습니다.
| 항목 | 설명 |
|---|---|
| RTLD_NOW | 로드 중인 모듈의 모든 종속 요소를 로드하고 모든 심볼을 확인합니다. |
| RTLD_LAZY | RTLD_NOW와 동일한 동작을 지정합니다. 향후 운영 체제 릴리스에서는 종속 모듈의 로딩이 지연되고 일부 심볼의 해상도가 지연되도록 RTLD_LAZY의 동작이 변경될 수 있습니다. |
| RTLD_GLOBAL | 다른 dlopen 호출에서 사용하는 심볼을 확인할 때 로드 중인 모듈의 심볼이 표시되도록 허용합니다. 이 기호는 기본 애플리케이션이 dlopen(NULL, mode)으로 열릴 때도 표시됩니다. |
| RTLD_LOCAL | 다른 dlopen 호출에서 사용하는 심볼을 확인할 때 로드 중인 모듈의 심볼이 사용되지 않도록 합니다. 로드 중인 모듈의 심볼은 dlsym 하위 루틴을 호출해야만 액세스할 수 있습니다. RTLD_GLOBAL 또는 RTLD_LOCAL이 지정되지 않은 경우 기본값은 RTLD_LOCAL입니다. 두 플래그가 모두 지정되면 RTLD_LOCAL은 무시됩니다. |
| RTLD_MEMBER | Dlopen 서브루틴은 아카이브의 멤버인 모듈을 로드하는 데 사용할 수 있습니다. 로드 서브루틴이 호출될 때 L_LOADMEMBER 플래그가 사용됩니다. 모듈 이름 FilePath 로드 서브루틴에 설명된 규칙에 따라 아카이브 및 아카이브 멤버의 이름을 지정합니다. |
| Rtld_noautodefer | 로드 중인 모듈의 지연된 가져오기가 후속 로드에서 자동으로 해결되지 않도록 방지합니다. 로드 서브루틴이 호출될 때 L_NOAUTODEFER 플래그가 사용됩니다. 일반적으로 dlopen 및 dlsym 하위 루틴에서 사용하도록 빌드된 모듈에는 지연된 가져오기가 포함되지 않습니다. 그러나 지연된 가져오기는 계속 사용할 수 있습니다. Dlopen으로 열린 모듈은 메인 애플리케이션, load 서브루틴으로 로드된 모듈( L_NOAUTODEFER 플래그가 사용되지 않은 경우) 및 dlopen 서브루틴으로 로드된 기타 모듈( RTLD_NOAUTODEFER 플래그가 사용되지 않은 경우)에서 지연된 가져오기에 대한 정의를 제공할 수 있습니다. |
리턴 값
성공적으로 완료되면 dlopen은 dlsym 및 dlclose 서브루틴 호출에 사용할 수 있는 값을 반환합니다. 이 값은 로드 바인드 및 언로드 하위 루틴과 함께 사용할 수 없습니다.
Dlopen 호출이 실패하는 경우,NULL(0 값)이 반환되고 전역 변수 errno가 설정됩니다. Errno에 값이 포함된 경우ENOEXEC를 클릭하면 dlerror 함수를 통해 자세한 정보를 확인할 수 있습니다.
오류 코드
가능한 errno 값의 목록과 그 의미는 로드 서브루틴을 참조하세요.