Как ДЕЙСТВИТЕЛЬНО удалить бинарный файл в MacOs - PullRequest
8 голосов
/ 19 декабря 2009

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

Ответы [ 4 ]

9 голосов
/ 22 декабря 2009

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

$ 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
2 голосов
/ 21 декабря 2009

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

1 голос
/ 19 декабря 2009

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

1 голос
/ 19 декабря 2009

Кажется, это работает как надо ...:

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