如果这个类是多态的,我发现类名不能隐藏在共享库中。例如,我可以在共享库中隐藏或删除类名吗?
// example.cpp
#include <stdio.h>
#include <string.h>
// #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上,像这样
$ g++ -fPIC -shared -fvisibility=hidden ../example.cpp -o libexample.so
$ strip -R .comment -R .note libexample.so
GCC,那么我打开libexample.so
在Emacs的一个正常的文件和搜索,类名Base
和Child
会找出。
如果我取消注释语句// #define virtual
是#define virtual
,也就是说使Base
和Child
无虚方法,我发现类名Base
和Child
不会在共享库中找到。
剂量类名称被存储在类vtable由编译器?或者其他一些原因导致了这个问题?
我相信这可能与名称混搭有关,尽管我不太确定 – 2014-09-04 08:22:11