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 и нашел много ссылок на стриптиз-клубы, но никаких полезных ссылок. Я просмотрел справочные страницы для 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();
}