Clang / LD功能解码?

时间:2013-05-15 12:44:16

标签: ios linker clang ld

我有两个工作编译器,clang位于Mac,可以定位iPhoneclang位于iPhoneiPhone也定位Mac }。通常两者都很好用,生成二进制文件和库。 iPhone上生成的图书馆可以Undefined symbols: "__Z7JS_Initji", referenced from: _main in test-CgDtHX.o 上链接。但现在我遇到了一个奇怪的问题,一些库没有链接,同时试图在iphone上链接到Mac上创建的库

iphone-clang

这是对JS_Init的调用,它被定义为以不同方式扩展的宏。

extern JSRuntime * JS_Init(uint32_t maxbytes, int); 会将其展开为:

mac-clang

extern JSRuntime * JS_Init(uint32_t maxbytes, JSUseHelperThreads useHelperThreads); 将扩展为:

ji

我不确定宏扩展是否是导致连接失败的原因

好的,现在我的问题是Z7__Z7JS_Initjiargument types究竟是什么意思?我在哪里可以找到能够显示mangling idsld之间的对应关系的表格?这必须是{{1}}个文档,但我无法找到它。主要是因为我不知道这个好的查询词。

2 个答案:

答案 0 :(得分:1)

不确定这是否有帮助。

在XCode 4.6 docset中搜索mangle,我找到了

LINKER_DISPLAYS_MANGLED_NAMES(显示受限名称) 描述: 布尔值。指定链接器是否显示C ++符号的受损名称。此信息可以帮助诊断C ++链接问题。 价值观: 是:链接器显示C ++符号的损坏名称(ld --no-demangle)。 NO:链接器不显示C ++符号的错位名称。 默认值: NO

所以我不能告诉你ji和Z7是什么意思,但这可能会帮助你改进你的链接器消息。

希望有所帮助

答案 1 :(得分:1)

以下是关于GCC / Clang中函数名称修改如何(以及其他事项)的长篇参考:

http://mentorembedded.github.io/cxx-abi/abi.html#mangling

在5.1.5类型编码中,你会看到“ji”代表“unsigned int”和“int”。

开头的<_> _Z来自5.1.2节(所有函数名称的前缀),“7”是名称“JS_Init”的长度。

希望有所帮助!