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, и не было никаких очевидных вещей, которые можно было бы попробовать, хотя фраза «частные внешние» была интригующей, я не мог понять, что с этим делать.
[обновление] К сожалению, моя попытка создать небольшой пример оказалась проблемой. Вот более сложный пример, который ближе к реальной проблеме, который все еще содержит нежелательные символы, если он построен оптимизированным.
Прошу прощения за плохие примеры. Оказывается, найти самую маленькую актуальную проблему непросто. Большое спасибо за ответы, но каждый ответ подталкивает меня к решению.
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();
}