2017-12-16 24 views
2

응용 프로그램 myapp.exeg++을 사용하여 빌드되고 libstdc++.so없이 환경에 설치할 수 있도록 플래그 -static-libstdc++을 사용한다고 가정합니다. myapp.exe은 샤드 라이브러리에서 dlopen을 통해 동적으로로드 할 수있는 일부 기능 plugf에 대한 플러그인 지원을 추가합니다.표준 라이브러리에서 정적으로 링크 할 때 동적 플러그인을 지원하는 방법은 무엇입니까?

libplug.solibstdc++에 링크 된 그러한 플러그인 라이브러리 인 경우 어떻게 myapp.exe과 함께 작업 할 수 있습니까?

libstdc++이 같은 동적으로로드 표준 라이브러리를 사용할 수 있습니다 myapp.exelibplug.so 모두 있기 때문에 동적으로 연결되어있는 경우이 간단하지만 최고의 정적으로 링크 된 표준 라이브러리를 사용하여이 작업을 수행하는 방법을 나에게 분명하지 않다. 내가 고려하고

접근 방법은 libplug.so 또한 version script

{ 
    global: plugf; 
    local: *; 
}; 

표준 라이브러리의 버전이 사용되도록 사용 후 플래그 -static-libstdc++을 사용하는 것입니다,하지만 그건있을 것입니다 의미 libstdc++ 사본 2 장을 메모리에로드하십시오. 이 접근법은 ORD 위반이 있기 때문에 C++ 표준에 의해 축복을받을 수 없다는 것을 알고 있지만, 어떤 식 으로든 libstdc++이 지원합니까? 해당 manual 섹션의 Multiple ABI testing 섹션은 비슷한 소리의 시나리오를 참조합니다.

+1

슬프게도 libplug.so와 일치하도록 동적/정적 링크 된 libstdC++를 배포해야합니다. 예, 런타임에 두 개의 복사본이로드됩니다. 그리고 네, 플러그인이 한 버전의 libstdC++로 포인터를 반환하고 다른 버전으로 해방하면 문제가 생길 수 있습니다. – Mikhail

+0

나는 그것이 사실이라고 생각하지 않는다. 할당은 표준 c 라이브러리에 의해 처리되고'-static-libstdC++'는'libc'가 정적으로 링크되도록하지 않으므로 둘 다 동일한'libc.so'를 사용합니다. – rnickb

+0

오브젝트는 libstdC++에서'__gnu_cxx :: new_allocator'로 할당되어 있다고 생각합니다. 둘 다 같은'libc.so'를 가리키고 있을지도 모릅니다. 개인적인 경험에서 MSVC의 RT를 사용하여 앞에서 언급 한 문제가 발생했습니다. – Mikhail

답변

1

예,이 솔루션은 작동합니다하지만

에 플러그인/응용 프로그램 사이의 STL 객체를 전달하려고하는 경우가 파손될 우려가
  • 다른 C++ 런타임에서 std::allocator이 할당 한 객체를 삭제하면 libstdC++ docs에서 이에 대한 명시적인 설명을 찾을 수는 없지만 Linux에서 작동해야합니다. Mikhail이 논평에서 지적한대로 Windows에서는 실패합니다.

  • +0

    ABI 변경 사항은 libstdC++의 C++ 98 및 C++ 11 버전 사이에서만 발생합니다. 그렇습니까? – rnickb

    +1

    @rnickb 아니,'-std' 플래그에 관계없이 모든 GCC 이후 libstdC++에서 새로운 ABI를 얻을 수 있습니다 ([이 페이지] (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html 참조).) 상세 사항은). '-std = C++ 98'과'-std = C++ 11'로 컴파일 된 코드의'std :: string'은 이진 호환이 더 잘되어야하기 때문에 일종의 의미가 있습니다. – yugr