2009-12-19 3 views
7

MacOs 10.6, если у меня есть файл "unwanted.c", который содержит:Как РЕАЛЬНО зачищать двоичный в MacOs

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, как дикое предположение, и это ничего не исправить. Я молился богам Google и нашел много ссылок на стриптиз-клубы, но никаких полезных ссылок. Я снял man-страницы для strip, g ++ и ld на mac, и не было никаких очевидных вещей, чтобы попробовать, хотя фраза «private externs» была интригующей, я не мог понять, что с этим делать.

[обновление] К сожалению, проблема заключается в попытке сделать небольшой пример. Вот более сложный пример, который ближе к реальной проблеме, которая по-прежнему имеет нежелательные символы, если она построена оптимизированной.

Извиняюсь за плохие примеры. Трудно найти наименьшую актуальную проблему. Большое спасибо за ответы, хотя каждый ответ подталкивает меня к решению.

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(); 
} 

ответ

8

Используя следующую компиляции линию я успешно раздеть символы из исполняемого файла:

$ 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 
1

Это, кажется, работает как хотелось бы ...:

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

У меня был неправильный код. В правильном примере кода, как теперь читается вопрос, с реализацией методов INSIDE определение класса, strip говорит: strip: символы, на которые ссылаются записи косвенного символа, которые нельзя удалить:/Users/michael. игрушка/нежелательная __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

однако ответ был весьма полезен, так как он дал мне больше фуража Google, эта строка ошибок раскрывает еще несколько интересных областей исследования. – mtoy

1

Учитывая пример кода, вы в курсе, добавив результаты флаг оптимизации «-o» в этих символах не проявленные nm после сбор.

+0

Опубликовали пример, близкий к фактическому, который все еще показывает проблему. Исходное приложение, которое привело меня к этому моменту, было оптимизировано. Спасибо за ответ. – mtoy

2

Похоже, что вы действительно хотите, чтобы не стирать исполняемый файл, а запутывать его таблицу символов. Я не уверен, но может быть что-то вроде this. По крайней мере, «C символ ++ таблица обфускатор», вероятно, лучше Google строку поиска ..

+0

Я действительно хочу, чтобы исполняемый файл был лишен. Однако это, вероятно, идет в ноутбуке под заголовком «Резервные решения, на которые я надеюсь, что мне никогда не понадобится реализовать». Он идет прямо над «напишите мой собственный постпроцессор, который связывает то, что когда-либо несвязано, которое нуждается в этих символах, а затем разделяет символы» – mtoy