두 공유 라이브러리가 둘 다 동일한 전역 범위 기호를 노출하는 경우이를 감지하고 피할 방법이 있습니까? 우리는 최근에 SuperCoolMethod()
및 libB.so
을 수출 한 libA.so
이있는 상황에 직면하여 SuperCoolMethod()
이 노출되어이 방법의 이전 사본을 파괴합니다. 이것은 g ++ 4.0 이상을 사용하는 Linux에 있습니다. 그래서 만약 당신이 libA.so
에 대해 링크를하면 예상대로 작동하지만, 그림에 libB.so
이 추가되면 잘못된 메서드가 호출되어 호출이 실패하여 잠재적 인 문제를 알려주지 않고 실행중인 스레드가 중단되게됩니다. 시행 착오를 피하면서 우리는 결국 SuperCoolMethod()
이 쇠퇴 해지고 libB.so
의 공급 업체에 알리고 그 결과 __attribute__((visibility("hidden")))
을 메소드 복사본에 적용 할 수 있습니다.g ++ 심볼 충돌 감지/회피
1
A
답변
0
동적으로 라이브러리를로드하고 dlopen과 dlsym을 통해 기호를 첨부하면 작동합니다. 코드를 작성해야하지만 코드가 실제로 붙어 있다면 해결책이 될 것입니다.
1
이것은 C++이므로 라이브러리는 충돌이 발생하지 않도록 각자의 네임 스페이스에 있어야합니다.
+0
써드 파티 벤더가 써야 할 것이지만하지는 않습니다. –
+1
"libB.so의 공급 업체에게 __attribute ((visibility ("hidden "))"가 아닌 gnu 컴파일러에서도 작동하는 네임 스페이스를 요청할 수 있다고 통보 할 수 있다면 – Mark
0
두 가지 방법 중 하나만 사용하는 경우 링크 명령 줄에 표시되는 순서에 따라 최종 실행 파일의 최종 버전이 결정됩니다.
이것은 아티팩트가 아니라 정의 된 동작이므로 공급 업체가 해결할 때까지 의존 할 수 있습니다.
관련 문제
- 1. 템플릿으로 작업 할 때 g ++ 중복 심볼 오류
- 2. Ld 틀린 심볼
- 3. g ++
- 4. restructuredText의 심볼
- 5. 심볼 정보 in .app 파일
- 6. g ++ 4.4.x 버그?
- 7. g ++ 컴파일러에 포함 된 g ++ power 함수
- 8. #define f (g, g2) g ## g2
- 9. CLSQL 심볼 내보내기
- 10. 코코아/사과 심볼 서버
- 11. 심볼 배열 만들기
- 12. `@`mysql 변수 이름의 심볼
- 13. 쉘 스크립트 심볼 "
- 14. matlab 2009 심볼 만들기
- 15. 심볼 .. 파이썬, bash
- 16. kernel32 심볼 가져 오기
- 17. 심볼 테이블이란 무엇입니까?
- 18. 자바 스크립트에서 심볼 바꾸기
- 19. 로그백 및 심볼 링크
- 20. 동적로드 및 심볼 공유
- 21. 이상한가요? mysql 게시물의 심볼
- 22. 라텍스 : 심볼 인덱스
- 23. 정의되지 않은 심볼 : sqlite3_initialize
- 24. Matlab에서 변수의 심볼 선언
- 25. 심볼 삭제의 단점은 무엇입니까?
- 26. AS3 심볼 내용 재생
- 27. 스윙에 심볼 팔레트 만들기
- 28. PHP로 MySQL에 심볼 저장하기
- 29. 정의되지 않은 심볼 : mysql_options
- 30. ld : 중복 된 심볼
흠, 문제의 함수를 명시 적으로 호출 할 필요가 없으므로 작동 할 수도 있지만 처음부터 충돌을 발견하는 방법을 알려주지는 않습니다. –
nm와 grep의 조합은 당신에게 말할 것입니다 – pm100