我可以隐藏或删除共享库中的类名吗?

 yyjj7212 发布于 2022-12-23 15:43

如果此类是多态的,我发现类名不能隐藏在共享库中.例如,

// 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的一个正常的文件和搜索,类名BaseChild将被发现.

如果我取消注释语句// #define virtual#define virtual,也就是化妆BaseChild不虚方法,我发现类名BaseChild不会在共享库中找到.

剂量类名是否由编译器存储在类vtable中?还是其他一些原因造成了这个问题?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有