Linux의 라이브러리 버전 관리 및 모든 기능을 작동시키는 방법에 대해 자세히 배우려고합니다. 컨텍스트는 다음과 같습니다.
- 나는 동일한 인터페이스를 노출 동적 라이브러리의 두 가지 버전을 가지고 말을 libsome1.so
하고 libsome2.so
.
-응용 프로그램이에 연결되어 libsome1.so
있습니다.
-이 응용 프로그램은 libdl.so
다른 모듈을 동적으로로드 하는 데 사용 됩니다 (예 :) libmagic.so
.
-이제 libmagic.so
연결되어 libsome2.so
있습니다. 분명히 링커 스크립트를 사용하여에서 심볼을 숨기지 않으면 libmagic.so
런타임시 인터페이스에 libsome2.so
대한 모든 호출 이로 해결됩니다 libsome1.so
. 이는 libVersion()
매크로 값과 비교하여 반환 된 값을 확인하여 확인할 수 있습니다 LIB_VERSION
.
-다음으로 libmagic.so
정의 libmagic.so
하고 내보내는 3을 제외한 모든 심볼을 숨기는 링커 스크립트 로 컴파일하고 링크하려고 합니다. 이 작품 ... 또는 적어도 libVersion()
와 LIB_VERSION
값이 일치 (그리고 버전이없는 일을보고).
-그러나 일부 데이터 구조가 디스크에 직렬화되면 일부 손상이 발견되었습니다. 응용 프로그램 디렉토리 libsome1.so
에서를 가리키고 그 자리에서 소프트 링크를 삭제 하고 만들면 libsome2.so
모든 것이 예상대로 작동하고 동일한 손상이 발생하지 않습니다.
도움이 될 수는 없지만 런타임 링커의 심볼 해상도가 약간 충돌하여 발생할 수 있다고 생각합니다. 나는 libsome2.so
모든 기호를 높이기 위해 링크를 시도하는 것과 같은 많은 것을 시도했습니다 symbol@@VER_2
(명령은 nm -CD libsome2.so
여전히 기호를 표시 symbol
하고 있기 때문에 혼란 스럽습니다 symbol@@VER_2
) ... 도움!!!!!!
RTLD_LOCAL
and RTLD_DEEPBIND
dlopen 플래그를 사용해보십시오 . 지금 테스트 할 시간이 없지만 맨 페이지를 기반으로 작동해야합니다.