2010-02-10 6 views
1

두 공유 라이브러리가 둘 다 동일한 전역 범위 기호를 노출하는 경우이를 감지하고 피할 방법이 있습니까? 우리는 최근에 SuperCoolMethod()libB.so을 수출 한 libA.so이있는 상황에 직면하여 SuperCoolMethod()이 노출되어이 방법의 이전 사본을 파괴합니다. 이것은 g ++ 4.0 이상을 사용하는 Linux에 있습니다. 그래서 만약 당신이 libA.so에 대해 링크를하면 예상대로 작동하지만, 그림에 libB.so이 추가되면 잘못된 메서드가 호출되어 호출이 실패하여 잠재적 인 문제를 알려주지 않고 실행중인 스레드가 중단되게됩니다. 시행 착오를 피하면서 우리는 결국 SuperCoolMethod()이 쇠퇴 해지고 libB.so의 공급 업체에 알리고 그 결과 __attribute__((visibility("hidden")))을 메소드 복사본에 적용 할 수 있습니다.g ++ 심볼 충돌 감지/회피

답변

0

동적으로 라이브러리를로드하고 dlopen과 dlsym을 통해 기호를 첨부하면 작동합니다. 코드를 작성해야하지만 코드가 실제로 붙어 있다면 해결책이 될 것입니다.

+0

흠, 문제의 함수를 명시 적으로 호출 할 필요가 없으므로 작동 할 수도 있지만 처음부터 충돌을 발견하는 방법을 알려주지는 않습니다. –

+0

nm와 grep의 조합은 당신에게 말할 것입니다 – pm100

1

이것은 C++이므로 라이브러리는 충돌이 발생하지 않도록 각자의 네임 스페이스에 있어야합니다.

+0

써드 파티 벤더가 써야 할 것이지만하지는 않습니다. –

+1

"libB.so의 공급 업체에게 __attribute ((visibility ("hidden "))"가 아닌 gnu 컴파일러에서도 작동하는 네임 스페이스를 요청할 수 있다고 통보 할 수 있다면 – Mark

0

두 가지 방법 중 하나만 사용하는 경우 링크 명령 줄에 표시되는 순서에 따라 최종 실행 파일의 최종 버전이 결정됩니다.

이것은 아티팩트가 아니라 정의 된 동작이므로 공급 업체가 해결할 때까지 의존 할 수 있습니다.