Как ДЕЙСТВИТЕЛЬНО удалить двоичный файл в MacOs

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

person mtoy    schedule 19.12.2009    source источник


Ответы (4)


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

$ 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
person Community    schedule 21.12.2009

Кажется, это работает по желанию ...:

$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted
person Alex Martelli    schedule 19.12.2009
comment
Я разместил неправильный код. С правильным примером кода, как теперь читается вопрос, с реализацией методов ВНУТРИ определения класса, полоса говорит: strip: символы, на которые ссылаются косвенные записи таблицы символов, которые не могут быть удалены в: /Users/michael.toy/ нежелательный __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev - person mtoy; 19.12.2009
comment
однако ответ был весьма полезен, так как он дал мне больше информации для Google, эта строка ошибки действительно раскрывает некоторые более интересные области исследования. - person mtoy; 19.12.2009

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

person Jeremy Friesner    schedule 21.12.2009
comment
Я действительно хочу, чтобы исполняемый файл был удален. Тем не менее, это, вероятно, идет в записной книжке под заголовком «Решения для резервного копирования», которые, надеюсь, мне никогда не понадобятся. Это идет прямо над написанием моего собственного постпроцессора, который связывает все, что когда-либо не связано с этими символами, а затем удаляет символы - person mtoy; 22.12.2009

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

person Ciarán Walsh    schedule 19.12.2009
comment
Разместили более близкий к реальной проблеме пример, который все еще демонстрирует проблему. Исходное приложение, которое привело меня к этому моменту, было создано оптимизированным. Спасибо за ответ. - person mtoy; 21.12.2009