سؤال

وماك 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، وتخمين البرية، والتي لم إصلاح أي شيء. صليت إلى الآلهة جوجل وجدت العديد من الإشارات إلى نوادي التعري، ولكن لا علاقة مفيدة. لقد منزوع الدسم صفحات الرجل للقطاع، ز ++، ودينار على لجنة الهدنة العسكرية، ولم تكن هناك أشياء واضحة في محاولة، على الرغم من أن عبارة "خارجيين الخاص" وفضول، لم أتمكن من معرفة ما يجب القيام به حيال ذلك.

[التحديث] للأسف، هناك تبين وجود مشكلة مع محاولة مني لجعل مثال صغير. هنا هو مثال أكثر تعقيدا، والتي هي أقرب إلى ما هي المشكلة الحقيقية، التي لا يزال لديه حرف غير المرغوب فيها إذا بنيت الأمثل له.

واعتذر عن الأمثلة السيئة. اتضح أن يكون من الصعب العثور على أصغر المشكلة الفعلية. شكرا جزيلا للردود، على الرغم من كل إجابة يدفع لي قريبة من الحل.

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();
}
هل كانت مفيدة؟

المحلول

وعن طريق خط الترجمة التالية I بنجاح تجريد الرموز على تنفيذ:

$ 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

نصائح أخرى

وهذا يبدو وكأنه ما تريد حقا هو عدم تجريد للتنفيذ، ولكن لتعتم الجدول رمزها. لست متأكدا، ولكن ربما شيء من هذا القبيل هذا سيكون مفيدا . على الأقل، "C ++ جدول الرموز بفوسكاتور" من المحتمل ان يكون سلسلة البحث جوجل أفضل ..

ويبدو أن هذا العمل كما هو مطلوب ...:

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

ونظرا لرمز المثال كنت قد نشرت، مضيفا النتائج الأمثل علم '-O "في تلك الرموز لا يجري أبداه nm بعد تجميع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top