MacOs 10.6, если у меня есть файл "unwanted.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 как произвольное предположение, и это ничего не зафиксировало. Я молился богам Google и нашел много ссылок на стриптиз-клубы, но никакие полезные ссылки. Я просмотрел страницы справочника для полосы, g ++, и ld на Mac, и не было никаких очевидных вещей попробовать, хотя фраза "частные экстерны" интриговала, я не мог выяснить, что сделать об этом.
[обновление] К сожалению, там оказывается проблемой с моей попыткой сделать небольшой пример. Вот более сложный пример, который ближе к тому, какова настоящая проблема, который все еще имеет нежелательные символы, если это создается оптимизированное.
Я приношу извинения за плохие примеры. Оказывается трудным найти самую маленькую фактическую проблему. Большое спасибо за ответы, тем не менее, каждый ответ продвигает меня близко к решению.
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
Похоже, это сработало ...:
$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted
Учитывая опубликованный вами пример кода, добавление флага оптимизации '-O' приводит к тому, что эти символы не отображаются nm
после компиляции.
Похоже, на самом деле вам нужно не вырезать исполняемый файл, а скрыть его таблицу символов. Я не уверен, но, возможно, что-то вроде этого было бы полезно. По крайней мере, "Обфускатор таблицы символов C ++", вероятно, лучше поисковой строки Google ..