2013-07-30 2 views
3

VS-android 프레임 워크를 사용하여 Microsoft Visual Studio 2012 + Android NDK에서 직접 Android 공유 오브젝트를 컴파일하고 있습니다. IDA를 사용하여 .so 파일을 분해했고 모든 코드가 완벽하게 표시되는지 (함수 이름, 데이터 버퍼 이름, 클래스 이름 등) 볼 수있었습니다.빌드 도중 .so 파일에서 심볼을 제거하는 방법

모든 디버그 및 불필요한 기호를 제거하여 코드를 분해하여 이해하기 어렵습니다.

컴파일 과정은 다음과 같습니다 :

  1. 내가 10 개 C++ 파일이 있습니다. 각각은 .o 파일로 컴파일됩니다.
  2. main_service.c는 main.o로 컴파일되고 다른 모든 * .o 파일과 링크되어 main_service.so 라이브러리를 생성합니다.

나는 다음과 같은 솔루션을 시도하고 작동하지 않았다 :

  1. 이 -strip - 모든 컴파일러 및 링커에 인수주기. 그것은 작동하지 않는 것 같습니다.
  2. 연결 후 main_service.o에서 -strip-all을 사용하여 objcopy.exe를 호출하십시오. 이것은 main_serivce.so의 크기를 조금 줄이지 만 심볼은 남아 있습니다.
  3. 내 C++ 코드에서는 " ((visibility())"속성을 사용하지 않습니다. 그렇기 때문에 링커가 심볼을 제거 할 수 없다는 것이 문제입니다 무엇이 사적인 것인지 알 수 있고 숨길 수 있으며 무엇이 공개인지 알 수 있습니다. JNI에서 사용하고자하는 main_service.c의 함수에 ""속성 ((visibility ("default"))) "을 추가하려고했습니다. 컴파일러와 링커에 -fvisibility = hidden 플래그를 추가했습니다. 하지만 경고가 나타납니다. '가시성'속성은 무시되며 기호는 제거되지 않습니다.

무엇이 여기에 있습니까?

p.s. - 나는 완전히 "기호 박탈"에 대해 매우 신물이났다. 내 질문이 약간 바보라면 미안하다.

-

답변

0

이 방법이 있습니다.

  1. I는 컴파일 g ++ 코드와 연계. EXE (예를 들어 arm-linux-androideabi-g++.exe).
  2. 각 컴파일 된 파일에 대해 컴파일러와 링커 모두에게 다음 두 스위치 -fvisibility=hidden -s을 제공했습니다. 두 스위치가 모두 필요합니다.
  3. __attribute visibility을 전혀 사용할 필요가 없습니다.
+0

안녕하세요, 어떻게 CMake가 관련된 일을 할 수 있습니까? 그리고이 명령은 .so 파일의 크기를 줄입니까? –

관련 문제