如果此类是多态的,我发现类名不能隐藏在共享库中.例如,
// example.cpp #include#include // #define virtual class Base { public: virtual const char* whatiam() { return "Papa"; } }; class Child : public Base { public: virtual const char* whatiam() { return "Son"; } }; const char* whatiam(Base* obj) { return obj->whatiam(); } __attribute__((visibility("default"))) const char* TheAPI(int n) { static char buf[64]; Child t; sprintf(buf, "I'm %s.", whatiam(&t)); return buf; }
我在Linux上用这样的gcc构建一个共享库
$ g++ -fPIC -shared -fvisibility=hidden ../example.cpp -o libexample.so $ strip -R .comment -R .note libexample.so
然后我打开libexample.so
在Emacs的一个正常的文件和搜索,类名Base
和Child
将被发现.
如果我取消注释语句// #define virtual
是#define virtual
,也就是化妆Base
和Child
不虚方法,我发现类名Base
和Child
不会在共享库中找到.
剂量类名是否由编译器存储在类vtable中?还是其他一些原因造成了这个问题?