nm 符号名称略有不同

Posted

技术标签:

【中文标题】nm 符号名称略有不同【英文标题】:nm symbol names slightly different 【发布时间】:2018-04-24 21:40:56 【问题描述】:

我在一个共享库中有一个未定义的符号名称:

U _ZN5Daetk5Petsc3Sys10catchErrorEj

在应该解决这个问题的共享库中,符号名称的最后一个字符不同:

000000000008c65e T _ZN5Daetk5Petsc3Sys10catchErrorEb

这两个共享库使用相同的堆栈 (gcc-7.3.0) 编译。

为什么会发生这种情况?如何解决?

这里是依赖lib header.h的相关代码。

extern "C" 
typedef struct

  PyObject_HEAD
  Daetk::Petsc::Sys* petscSys;
 DaetkPetscSys;

依赖的lib source.cpp。

extern "C" 
static PyObject* 
DaetkPetscSys_catchError(DaetkPetscSys *self, PyObject *args)

  bool error;
  if(!PyArg_ParseTuple(args,"b",&error)) return NULL;
  return Py_BuildValue("b",self->petscSys->catchError(error));


解析库 header.h(已清理)。

namespace Daetk 
namespace Petsc 
class Sys
  
public:
  Sys();
  virtual ~Sys();
  bool catchError(bool error);
;
  //Petsc::Daetk

解析库 source.cpp(已清理)。

bool Daetk::Petsc::Sys::catchError(bool error)

  using namespace cc;
  int thisVal=error;
  int result=error;
  MPI_Allreduce(&thisVal,&result,1,MPI_INT,MPI_LOR,PETSC_COMM_WORLD);
  return result;

【问题讨论】:

调用者中的声明和库中的定义肯定有些不同。 贴出相关代码 向工具c++filt 提供错误名称以了解它们的含义。 catchError 的参数类型好像变了。 '$ c++filt _ZN5Daetk5Petsc3Sys10catchErrorEb Daetk::Petsc::Sys::catchError(bool) $ c++filt _ZN5Daetk5Petsc3Sys10catchErrorEj Daetk::Petsc::Sys::catchError(unsigned int) 【参考方案1】:

问题是 <stdbool.h> 在 hdf5 中给出了一些奇怪的 _Bool is not a type 问题,当时它的一个标头被包含在 Cython 编译中。作为 hack,我注释掉了 <stdbool.h> include 并将 bool 重新定义为 unsigned int。这是符号名称不匹配问题的根源。

【讨论】:

以上是关于nm 符号名称略有不同的主要内容,如果未能解决你的问题,请参考以下文章

在 3 个 DataFrame 列中识别略有不同的唯一可识别通用名称的算法

nm 命令中的“符号值”是啥意思?

如何打印像 nm 这样的 ELF 文件的符号名称?

C中的浮点数与预期略有不同

Linux的nm查看动态和静态库中的符号

Linux的nm命令查看动态库和静态库中的符号