nm命令输出中的奇怪符号名称

时间:2011-05-17 19:28:39

标签: c linux linker nm

我构建了一个名为InterfaceLayer.so的动态库。 我打电话的时候:

> nm InterfaceLayer

作为输出,我得到一些看起来像这样的符号:

00000e28  T _Z5startv

虽然我期待它是“开始”,就像我在代码中定义的函数的名称一样。

任何线索?

TKZ

3 个答案:

答案 0 :(得分:11)

那是因为C ++名称错误

nm -C

解开他们。

为防止名称损坏,

  • 使用C编译器(gcc,而不是g ++),命名源文件.c(不是.cpp)
  • 或声明extern“C”:

my.h

  extern "C" 
  {
        void start();
        void finish();
  }

这会给他们“C”联动,意思是他们不能超载,不能通过引用传递,没有c ++:)

答案 1 :(得分:3)

听起来像C++ name mangling

答案 2 :(得分:2)

正如其他答案所提到的,这很可能是因为C ++名称错误。如果你希望符号可以通过它的'unmangled'名称访问,并且它是用C ++实现的,那么你需要我们extern "C"告诉C ++编译器它有一个C链接。

在具有函数原型的标题中,您需要类似以下内容:

#if defined(__cplusplus)
extern "C" {
#endif

// the prototype for start()...


#if defined(__cplusplus)
}
#endif

这将确保如果C ++编译器使用该函数,它将在声明上获得extern "C",如果它被C模块使用,它将不会被{ {1}}说明符。

如果在函数定义之前包含标头,则.cpp文件中的实现不需要那些东西。它将使用它从前一个声明中看到的链接规范。但是,我更喜欢用extern "C"装饰函数定义只是为了确保一切都是同步的(注意在.cpp文件中你不需要extern "C"预处理的东西 - 它总是编译为C ++。