如果這個類是多態的,我發現類名不能隱藏在共享庫中。例如,我可以在共享庫中隱藏或刪除類名嗎?
// 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