nm列出单个方法有多个条目是否正常?我执行以下操作:

nm -C myObjectFile.o | grep MyObject::


并收到以下信息:

... stuff...
... stuff...
0000027e0 T MyObject::MyObject(MyDepend*)
0000027e0 T MyObject::MyObject(MyDepend*)
000000030 T MyObject::~MyObject()
000000000 T MyObject::~MyObject()
000000000 T MyObject::~MyObject()
000000060 T non-virtual thunk to MyObject::~MyObject()
000000020 T non-virtual thunk to MyObject::~MyObject()


对我来说这似乎是错误的。您觉得这不对吗?如果是这样,您能否详细说明为什么错误以及可能导致错误的原因?如果仅在某些情况下是正确的,那么我将向我解释有关让我查看nm输出的问题的更多信息,我们可以从那里开始。

最佳答案

在某些情况下,解包器会将不同的输入分解为相同的输出。有时这可能会引起一些混乱,但是我认为这样做是可以的,因为在其他情况下,它的混乱程度较小。例如,gdb使用了demangler,这种方法可以使构造函数上的断点执行正确的操作,而无需用户付出额外的努力。通过一些思想和工作,也许可以在这里进行一些改进。

无论如何,这是一个简单的示例:

class K
{
  K ();
  virtual ~K();
};

K::K() { }
K::~K() { }


使用-g编译然后运行nm -C会显示与您相似的结果:

$ nm -C q.o
         U operator delete(void*)
0000000000000000 T K::K()
0000000000000000 T K::K()
0000000000000048 T K::~K()
0000000000000018 T K::~K()
0000000000000018 T K::~K()
0000000000000000 V typeinfo for K
0000000000000000 V typeinfo name for K
0000000000000000 V vtable for K
         U vtable for __cxxabiv1::__class_type_info


但是让我们看看如果运行普通nm会发生什么:

$ nm q.o
         U _ZdlPv
0000000000000000 T _ZN1KC1Ev
0000000000000000 T _ZN1KC2Ev
0000000000000048 T _ZN1KD0Ev
0000000000000018 T _ZN1KD1Ev
0000000000000018 T _ZN1KD2Ev
0000000000000000 V _ZTI1K
0000000000000000 V _ZTS1K
0000000000000000 V _ZTV1K
         U _ZTVN10__cxxabiv117__class_type_infoE


在这里我们可以更清楚地看到底层符号是不同的。

由此我们可以进入C++ ABI that GCC follows;特别是关于破坏构造函数和析构函数的部分。由于历史原因,这称为“ Itanium” ABI,但实际上在所有平台上都使用了它(也许有较小的变体)。

本节说明名称的含义,尽管您必须更深入地研究文档才能完全理解。基本思想是,在C ++的实现中,需要为构造函数和析构函数提供不同的入口点。这是通过为不同的入口点提供不同的符号来完成的。

关于c++ - GCC的nm列出了方法的多个条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31106961/

10-11 23:18