Как ДЕЙСТВИТЕЛЬНО разделить двоичный файл в 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 и нашел много ссылок на стриптиз-клубы, но никакие полезные ссылки. Я просмотрел страницы справочника для полосы, 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();
}
8
задан mtoy 21 December 2009 в 19:50
поделиться

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
9
ответ дан 5 December 2019 в 12:59
поделиться

Похоже, это сработало ...:

$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted
1
ответ дан 5 December 2019 в 12:59
поделиться

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

1
ответ дан 5 December 2019 в 12:59
поделиться

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

2
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: