Clang/LD 函数拆解?

问题描述 投票:0回答:2

我有两个工作编译器,

clang
上的
Mac
,它可以针对
iPhone
,以及
clang
上的
iPhone
,它也针对
iPhone
。通常两者都可以很好地工作,生成二进制文件和库。在
Mac
上生成的库可以在
iPhone
上链接。但现在我面临一个奇怪的问题:当尝试在 iPhone 上链接到在 Mac 上创建的库时,库未链接

Undefined symbols:
  "__Z7JS_Initji", referenced from:
      _main in test-CgDtHX.o

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

iphone-clang
将其展开为:

extern JSRuntime * JS_Init(uint32_t maxbytes, int);

mac-clang
将扩展为:

extern JSRuntime * JS_Init(uint32_t maxbytes, JSUseHelperThreads useHelperThreads);

我不确定宏扩展是否是链接失败的原因

好吧,现在我的问题是,

ji
Z7
__Z7JS_Initji
中到底是什么意思?我在哪里可以找到显示
argument types
和那些
mangling ids
之间对应关系的表格?这一定是
ld
文档,但我找不到它。主要是因为我不知道对此的好查询词。

ios linker clang ld name-mangling
2个回答
1
投票

这里有一个关于 GCC/Clang 中函数名称修饰如何(除其他外)工作的详细参考:

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

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

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

希望有帮助!

编辑:更新了建议链接的链接,因为上一个链接已消失。


1
投票
不确定这是否有帮助。

在 XCode 4.6 文档集中搜索 mangle,我发现了

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

所以我无法告诉您 ji 和 Z7 的含义,但这可能会帮助您改进链接器消息。

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.