나는 .so 라이브러리(역시 내가 개발함)를 사용하는 프로그램을 만들고 있습니다. .so를 사용하는 프로그램을 다시 시작하지 않고도 개발하는 동안 .so를 업데이트하고 재배포할 수 있기를 원합니다. 내 시스템(Ubuntu 15.04)에서 dlopen, dlsym 및 dlclose가 이런 일을 발생시킬 수 있음을 시연했습니다. 파일을 교체하고 이전 라이브러리를 닫고 동일한 파일 경로를 통해 새 버전을 연 다음 기호를 다시 로드하면 됩니다. (들) 필요해요. 하지만 이전 버전도 열어두고 싶다면 어떻게 해야 할까요?
아직 시도하지는 않았지만 N 버전의 라이브러리에 대해 N 개의 다른 파일 경로를 사용하여 이를 달성할 수 있다고 생각합니다. 그러나 나는 같은 경로를 사용하는 것을 선호합니다. 그러나 나는 그것을 작동시킬 수 없습니다. 내가 이렇게 하면:
- 오래된 것 같아.그래서
- DL 기호
- 프로그램 외부에서 rm .so를 실행하고 최신 버전으로 교체하세요.
- dlopen .so (이번에는 새 버전의 핸들을 얻고 싶습니다)
- DL 기호
...그런 다음 동일한 라이브러리 핸들의 복사본 두 개로 끝나는 것 같습니다. 참조 횟수가 증가했기 때문에 이제 dlclose를 두 번 해야 할 것 같습니다. 5단계에서 dlsym에서 이전 버전을 얻었습니다. 그래서 dlopen은 내 새 파일을 볼 수 없습니다. 참조 카운팅 메커니즘이 파일의 내용이 아닌 경로 등으로 파일을 색인화하는 것 같아요. 내용을 검사하여 라이브러리를 식별하려고 하는 것이 매우 이상하다고 생각합니다.
원하는 대로 할 수 있나요, 아니면 두 개의 서로 다른 파일 경로를 사용해야 하나요? 이 경우에는 별 문제가 아니지만 궁금합니다. 그리고 dlopen 매뉴얼 페이지는 열려 있는 라이브러리가 이미 열려 있는 라이브러리인지 여부를 결정하기 위해 dlopen이 사용하는 논리를 지정하지 않는 것 같습니다.