hệ điều hành MacOS 10,6, nếu tôi có một tập tin "unwanted.c", trong đó có:Làm thế nào để thực sự lột một nhị phân trong hệ điều hành MacOS
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Bây giờ tôi làm:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
Nếu tôi chia ra giao diện và thực hiện lớp bí mật, như hầu hết mọi người làm khi viết mã C++, thì không có biểu tượng không mong muốn nào trong tệp thực thi bị tước bỏ. Đáng buồn thay, tôi đã đưa ra một cơ sở mã hiện có của hàng ngàn dòng mã và đây không phải là một trong những lựa chọn của tôi.
Tôi đã thử -fno-rtti, như một dự đoán hoang dã và điều đó không khắc phục được gì. Tôi đã cầu nguyện với các vị thần của Google và tìm thấy nhiều tài liệu tham khảo cho các câu lạc bộ thoát y, nhưng không có liên kết hữu ích. Tôi đã lướt qua các trang của người đàn ông cho dải, g ++, và ld trên mac, và không có những điều rõ ràng để thử, mặc dù cụm từ "private externs" là hấp dẫn, tôi không thể tìm ra những gì để làm về điều đó.
[cập nhật] Đáng buồn thay, hóa ra là một vấn đề với nỗ lực của tôi để tạo một ví dụ nhỏ. Đây là một ví dụ phức tạp hơn, gần hơn với vấn đề thực sự là gì, mà vẫn còn có những biểu tượng không mong muốn nếu nó được xây dựng tối ưu.
Tôi xin lỗi vì những ví dụ xấu. Hóa ra khó có thể tìm ra vấn đề thực tế nhỏ nhất. Rất cám ơn câu trả lời, mặc dù, mỗi câu trả lời đẩy tôi đến gần một giải pháp.
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();
}
Tôi đã đăng sai mã. Với mã ví dụ chính xác, như câu hỏi bây giờ đọc, với việc thực hiện cho các phương thức INSIDE định nghĩa lớp, dải cho biết: dải: biểu tượng được tham chiếu bởi các mục bảng biểu tượng gián tiếp không thể bị tước trong:/Users/michael. đồ chơi/không mong muốn __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy
tuy nhiên câu trả lời là khá hữu ích, vì nó cho tôi thêm google thức ăn, chuỗi lỗi đó tiết lộ một số lĩnh vực điều tra thú vị hơn. – mtoy