응용 프로그램 myapp.exe
이 g++
을 사용하여 빌드되고 libstdc++.so
없이 환경에 설치할 수 있도록 플래그 -static-libstdc++
을 사용한다고 가정합니다. myapp.exe
은 샤드 라이브러리에서 dlopen
을 통해 동적으로로드 할 수있는 일부 기능 plugf
에 대한 플러그인 지원을 추가합니다.표준 라이브러리에서 정적으로 링크 할 때 동적 플러그인을 지원하는 방법은 무엇입니까?
libplug.so
도 libstdc++
에 링크 된 그러한 플러그인 라이브러리 인 경우 어떻게 myapp.exe
과 함께 작업 할 수 있습니까?
libstdc++
이 같은 동적으로로드 표준 라이브러리를 사용할 수 있습니다 myapp.exe
및 libplug.so
모두 있기 때문에 동적으로 연결되어있는 경우이 간단하지만 최고의 정적으로 링크 된 표준 라이브러리를 사용하여이 작업을 수행하는 방법을 나에게 분명하지 않다. 내가 고려하고
접근 방법은 libplug.so
또한 version script
{
global: plugf;
local: *;
};
표준 라이브러리의 버전이 사용되도록 사용 후 플래그 -static-libstdc++
을 사용하는 것입니다,하지만 그건있을 것입니다 의미 libstdc++
사본 2 장을 메모리에로드하십시오. 이 접근법은 ORD 위반이 있기 때문에 C++ 표준에 의해 축복을받을 수 없다는 것을 알고 있지만, 어떤 식 으로든 libstdc++
이 지원합니까? 해당 manual 섹션의 Multiple ABI testing
섹션은 비슷한 소리의 시나리오를 참조합니다.
슬프게도 libplug.so와 일치하도록 동적/정적 링크 된 libstdC++를 배포해야합니다. 예, 런타임에 두 개의 복사본이로드됩니다. 그리고 네, 플러그인이 한 버전의 libstdC++로 포인터를 반환하고 다른 버전으로 해방하면 문제가 생길 수 있습니다. – Mikhail
나는 그것이 사실이라고 생각하지 않는다. 할당은 표준 c 라이브러리에 의해 처리되고'-static-libstdC++'는'libc'가 정적으로 링크되도록하지 않으므로 둘 다 동일한'libc.so'를 사용합니다. – rnickb
오브젝트는 libstdC++에서'__gnu_cxx :: new_allocator'로 할당되어 있다고 생각합니다. 둘 다 같은'libc.so'를 가리키고 있을지도 모릅니다. 개인적인 경험에서 MSVC의 RT를 사용하여 앞에서 언급 한 문제가 발생했습니다. – Mikhail