2011-09-29 2 views
2

나는 거대한 프로젝트를 C++로 작성했다. 그것은 모두 여러 개의 정적 라이브러리로 나뉘어져 있으며 최종적으로 몇 가지 간단한 함수 만 내보내는 최종 공유 라이브러리로 연결됩니다.CCC로 작성된 공유 객체에 대한 GCC 가시성이 적절 함

마지막으로 objdump를 수행하면 내부 이름이 모두 표시됩니다. 긴 클래스 이름과 네임 스페이스를 사용하기 때문에이 문자열은 지나치게 길어지고 최종 바이너리가 커집니다.

내 궁금한 점은 GCC를 사용하여 이러한 모든 내부 기능이 최종 바이너리에 나타나지 않는지 확인하는 것입니다.

나는 모든 GCC 관련 가시성 수정 자에 대해 알고 있는데, 나는 -fvisibility = hidden -fvisibility-inlines-hidden을 사용하고 -Wl, - no-whole-archive를 사용한다. 나는 C++ 예외와 rtti (-fno-exceptions -fno-rtti)를 사용하지 않는다. 그러나 GCC가 내 네임 스페이스와 클래스의 이름을 포함하지 않는 나의 최종 .so를 생성하도록 할 수 없다. 모든!

-Wl, - version-script =를 사용하여 어떤 함수를 표시해야하는지 제어하려고했으나 최종 제거 된 공유 객체에서 내부 이름이 많이 보입니다. 그래서 비슷한 항목을 여러 개 읽었지만 그 일을하는 것은 보이지 않습니다. 참고 : 여러 플랫폼 (Linux, Windows, iPhone 등)을 대상으로 컴파일하고 VS의 Windows에서만 문제가 없습니다. 당신은 (수출)를 유지하고 다른 모든을 삭제하려면 그냥 기호를 지정 최종 .so를 파일 (-Wl,--retain-symbols-file=filename)을 링크 할 때 --retain-symbols-file 링커 옵션을 시도 할 수 있습니다

감사

답변

4

. 이 파일은 유지할 기호 (한 줄에 하나씩)가있는 텍스트 파일입니다.

+0

지금이 옵션을 사용하여 이진 파일이 실행되는지 확인해 보겠습니다. 간단한 테스트에서 다른 공유 라이브러리의 가져온 함수 이름이 바이너리에 더 이상 없다는 것을 알 수 있습니다. 가져온 이름도 나열해야합니까? – Pavel

+0

크리스, 내가 필요한 옵션이있는 것 같습니다. 마지막 .so는 몇 megs 및 nm 목록에 의해 내가 수출 파일에 넣어 상징만을 슬림있어. 첫 번째 문제 : 나는 많은 정적 라이브러리를 사용하고 일부는 정적 라이브러리에서 가져와야하며, 어떤 이유로 정적 라이브러리의 이러한 심볼은 익스포트되지 않습니다. 이 문제를 해결하기 위해 전체 아카이브 옵션을 사용하여 이러한 라이브러리의 모든 기능을 강제로 내 보내야했습니다. – Pavel

+0

두 번째 문제는 심지어 nm이 내보내기 파일의 함수 만 나열한다는 것입니다. objdump를 사용하면 여전히 C++ 코드에서 개인 이름을 얻을 수 있습니다. 예 : _ZN20RCSFTServiceImplPeer12onFTProgressERKN3RCS12FileTransferEy 및 목표는 무엇이든간에이 문자열이 최종 이진 파일에 존재하지 않도록하는 것입니다. – Pavel

관련 문제