在共享对象unix / linux中查看c ++方法/构造函数

时间:2014-03-01 17:36:52

标签: c++ linux unix shared-libraries

我是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和构造函数?

3 个答案:

答案 0 :(得分:1)

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

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

class dynclass {
    ...
};

dynclass:dynclass() {}

共享对象符号表:

0000000000000712 T _Z3foov
0000000000000708 T _ZN8dynclassC1Ev
0000000000000708 T _ZN8dynclassC2Ev

答案 1 :(得分:0)

我猜您的代码是单个.cpp文件。因此,编译器决定您的库的潜在用户无法访问类dynclass,并将其隐藏在ELF sympol表中。

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

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

答案 2 :(得分:0)

这是因为类声明中定义的成员函数是自动inline d。内联函数的符号(如static functoin)将不会导出。

我没有从标准中获得这个词,但只是根据我的经验。