【问题标题】:viewing c++ methods/constructor in shared object unix/linux在共享对象 unix/linux 中查看 c++ 方法/构造函数
【发布时间】:2014-03-01 17:36:52
【问题描述】:

我是 unix/linux 世界的新手,正在尝试查看我编译成共享对象的 c++ 类的方法和构造函数。

作为一个测试,我在下面编译为:sudo clang++ -Wall -dynamiclib dynclass.cpp -o dynclass.so

class dynclass {
  public:
    int x;
    int y;
    int z;
  dynclass () {

  }

  void  emptymethod () { }

};

int foo (void) { return 0; }

然后我使用(查看共享对象中包含的函数/方法):nm dynclass.so 返回:

0000000000000f90 T __Z3foov
                 U dyld_stub_binder

只有静态函数可见。如何查看emptymethod 和构造函数?

【问题讨论】:

  • 你应该避免使用sudo以root身份编译

标签: c++ linux unix shared-libraries


【解决方案1】:

这是因为构造函数和emptymethod是在类声明体中声明和定义的。在类声明主体中定义的函数是内联函数(因此不可导出);然而,这实际上并不意味着它将被内联。

将构造函数的定义移到类声明之外会导致构造函数(和析构函数)列在共享对象的符号表中:

class dynclass {
    ...
};

dynclass:dynclass() {}

共享对象符号表:

0000000000000712 T _Z3foov
0000000000000708 T _ZN8dynclassC1Ev
0000000000000708 T _ZN8dynclassC2Ev

【讨论】:

  • 这行得通。奇怪的是它需要在类体之外定义。
  • 实际上是 C++ 标准的一部分(在类声明中定义的方法是inline methods)。
  • 好吧,我觉得自己很愚蠢。 ://
【解决方案2】:

我猜您的代码是单个 .cpp 文件。所以编译器决定类 dynclass 对你的库的潜在用户来说是不可访问的,并将它隐藏在 ELF 符号表中。

有两种方法可以使类可见: 单独声明类和定义(.h 和 .cpp 文件)。这是 IMO 在语义视图中的最佳方式。 或者在您的可见代码中添加对dynclass 的引用,例如:

int foo()
{
    dynclass *ptr = new dynclass();
    delete ptr;
}`

【讨论】:

  • 试一试,不会有什么不同。
  • 在我的回答中使用 OP 的代码和修改。
  • 抱歉,将您与 topicstarter 混淆了。
【解决方案3】:

这是因为在类声明中定义的成员函数自动为inlined。不会导出内联函数的符号,例如 static functoin 的。

我没有从标准中得到确切的词,而只是根据我的经验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2011-02-20
    相关资源
    最近更新 更多