是否可以手动解码C ++符号?

时间:2013-08-13 21:53:04

标签: c++ demangler

我遇到了这样的错误:

dyld: lazy symbol binding failed: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
  Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
  Expected in: flat namespace

dyld: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
  Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
  Expected in: flat namespace

然后__ZN2nm7ComplexIfEC1ERKNS_10RubyObjectE也一样。

不幸的是,c++filt似乎并不想解除这些问题。当我尝试在c++filtjs online interface中输入它们时,我得到“不是一个受损的C ++符号。”

我对错误消息感到有些困惑,因为示例c++filtjs给出的是_ZN9wikipedia7article8wikilinkC1ERKSs,代表wikipedia::article::wikilink::wikilink(std::string const&)。我看到了几种模式,其中ZN#78用于::,而C1ERK用于我所猜测的是某种模式 - 对构造函数的引用。

我猜它正在抱怨它缺少class Rational的一个构造函数,例如Rational::Rational(RubyObject const&)Rational是一个模板,因此,了解哪个版本缺失对我有帮助。

但这里的问题实际上是我如何能够手工消解。 =)

1 个答案:

答案 0 :(得分:4)

符号看起来像是由clang或gcc生成的符号。这两个编译器都使用基于Itanium ABI的ABI。本文档包含描述外部符号构造方式的section on demangling。如果内部化相应的规则,您应该能够对名称进行解码。

我无法在原始网站上找到该文档,而且我不知道官方文档的位置。