문제

MacOS 10.6, "DONVANTED.C"파일이 포함 된 경우 :

class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};

main()
{
    secret_thing obj;
    obj.revealing_method_name();
}

이제 나는한다 :

$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev

비밀 클래스의 인터페이스와 구현을 나누면 대부분의 사람들이 C ++ 코드를 작성할 때하는 것처럼, 박탈 된 실행 파일에는 원치 않는 기호가 없습니다. 슬프게도, 나는 수천 줄의 코드로 구성된 기존 코드 기반을 건네 주었고 이것은 내 선택 중 하나가 아닙니다.

나는 -fno -rtti를 거친 추측으로 시도했지만 아무것도 고칠 수 없었습니다. 나는 구글 신들에게기도했고 스트립 클럽에 대한 많은 언급을 발견했지만 도움이되는 링크는 없었다. 나는 Mac에서 Strip, G ++ 및 LD의 Man Pages를 훑어 보았고, "개인 외부"라는 문구가 흥미롭지 만, 나는 그것에 대해 무엇을 해야하는지 알 수 없었습니다.

업데이트] 슬프게도, 작은 예를 만들려는 나의 시도에 문제가있는 것으로 밝혀졌습니다. 여기에 더 복잡한 예가 있습니다.이 예는 실제 문제가 무엇인지에 더 가깝습니다. 최적화 된 경우에도 원치 않는 기호가 있습니다.

나쁜 예제에 대해 사과드립니다. 가장 작은 실제 문제를 찾기가 어렵다는 것이 밝혀졌습니다. 그러나 답변 해 주셔서 감사합니다. 각 답변은 솔루션에 가까워집니다.

class base {
public:
    virtual int revealing_method_name() = 0;
    virtual ~base() {};
};

class secret_thing : public base {
public:
    int revealing_method_name() { return 0; };
};

class other_thing : public base {
public:
    int revealing_method_name() { return 1; };
};

int main(int argc, char**)
{
    base *object = 0;
    if( argc > 1 ) object = new secret_thing;
    else object = new other_thing;

    return object->revealing_method_name();
}
도움이 되었습니까?

해결책

다음 컴파일 라인을 사용하여 실행 파일에서 기호를 성공적으로 제거합니다.

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp
$ strip executable

최신 샘플 파일이 주어지면 다음과 같은 결과가 발생합니다.

$ nm executable
                 U __ZTVN10__cxxabiv117__class_type_infoE
                 U __ZTVN10__cxxabiv120__si_class_type_infoE
                 U __ZdlPv
                 U __Znwm
                 U ___cxa_pure_virtual
                 U ___gxx_personality_v0
0000000100000000 A __mh_execute_header
                 U _exit
                 U dyld_stub_binder

다른 팁

당신이 정말로 원하는 것이 실행 파일을 제거하는 것이 아니라 심볼 테이블을 난독 화하는 것처럼 들립니다. 확실하지 않지만 아마도 같은 것입니다 이것 도움이 될 것입니다. 적어도 "C ++ Symbol Table Oppuscator"는 아마도 Google 검색 문자열 일 것입니다 ..

이것은 원하는대로 작동하는 것 같습니다 ... :

$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted

게시 한 예제 코드가 주어지면 '-o'최적화 플래그를 추가하면 표시되지 않은 기호가 표시됩니다. nm 편집 후.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top