两个错位的名称解析为相同的函数签名

时间:2014-01-22 13:50:40

标签: c++ g++ name-mangling

我有一个spidermonkey库,可以导出以下错位符号,用于函数JS_DefineProperty

_Z17JS_DefinePropertyP9JSContextP8JSObjectPKcN2JS5ValueEPFiS0_NS5_6HandleIS2_EENS7_I4jsidEENS5_13MutableHandleIS6_EEEPFiS0_S8_SA_iSC_Ej

当我尝试编译使用此函数的文件时,外部引用编译为:

_Z17JS_DefinePropertyP9JSContextP8JSObjectPKcN2JS5ValueEPFiS0_NS5_6HandleIS2_EENS7_IlEENS5_13MutableHandleIS6_EEEPFiS0_S8_S9_iSB_Ej

名称末尾两者略有不同。我通过一个名字demangler跑了两个,他们都出现了相同的签名:

JS_DefineProperty(JSContext*, JSObject*, char const*, JS::Value, int (*)(JSContext*, JS::Handle, JS::Handle, JS::MutableHandle), int (*)(JSContext*, JS::Handle, JS::Handle, int, JS::MutableHandle), unsigned int)

所以我对这有什么不同感到有点难过。我相信这两个版本都是使用g++ 4.7编译的。 任何人都可以解码名称中的额外差异,所以我可以进一步调查吗?

1 个答案:

答案 0 :(得分:3)

实际上两者之间存在差异。

_Z17JS_DefinePropertyP9JSContextP8JSObjectPKcN2JS5ValueEPFiS0_NS5_6HandleIS2_EENS7_I4jsidEENS5_13MutableHandleIS6_EEEPFiS0_S8_SA_iSC_Ej demangles to:

JS_DefineProperty(JSContext*, JSObject*, char const*, JS::Value, int (*)(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, JS::MutableHandle<JS::Value>), int (*)(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, int, JS::MutableHandle<JS::Value>), unsigned int)

_Z17JS_DefinePropertyP9JSContextP8JSObjectPKcN2JS5ValueEPFiS0_NS5_6HandleIS2_EENS7_IlEENS5_13MutableHandleIS6_EEEPFiS0_S8_S9_iSB_Ej demangles to:

JS_DefineProperty(JSContext*, JSObject*, char const*, JS::Value, int (*)(JSContext*, JS::Handle<JSObject*>, JS::Handle<long>, JS::MutableHandle<JS::Value>), int (*)(JSContext*, JS::Handle<JSObject*>, JS::Handle<long>, int, JS::MutableHandle<JS::Value>), unsigned int)

前者使用JS::Handle<jsid>,后者使用JS::Handle<long>