为啥 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?

Posted

技术标签:

【中文标题】为啥 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?【英文标题】:Why does Apple's Clang (from Xcode 5) make typeinfos private_extern for arm64?为什么 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern? 【发布时间】:2014-01-12 05:21:26 【问题描述】:

如果编译这个文件p3.cxx:

class foobarclass

 public:
  int i0;
;

void otherfun(void);
void mumble(void);

void fun(void)

  try 
    otherfun();
   catch(foobarclass &e) 
    mumble();
  

像这样:

xcrun clang++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -fexceptions -c p3.cxx -p3.64.o

xcrun clang++ -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -fexceptions -c p3.cxx -o p3.32.o

然后检查“typeinfo for foobarclass”的符号:

nm -m p3.64.o|grep ZTI
0000000000000110 (__DATA,__datacoal_nt) weak private external __ZTI11foobarclass

nm -m p3.32.o|grep ZTI
00000134 (__DATA,__datacoal_nt) weak external __ZTI11foobarclass

为什么arm64的情况下符号weak private external?这意味着 dlsym() 在运行时找不到它。这会破坏 LibreOffice 代码库中的某些低级内容。

【问题讨论】:

【参考方案1】:

我在相关的 Apple 开发者论坛中提出了同样的问题,得到的答复是这是故意的,目的是减少可执行文件中全局可见符号的数量。所以我只能忍受它。

【讨论】:

【参考方案2】:

将构建设置中的架构设置为标准架构(armv7,armv7s)

ARCHS = **armv7 armv7s**

VALID_ARCHS = **armv6 armv7 armv7s**

Xcode 可以使用 32 位和 64 位二进制文​​件构建您的应用 包括。这个组合的二进制文件需要一个最小的部署目标 ios 7 或更高版本。

注意:未来版本的 Xcode 将允许您创建一个应用程序 支持 iOS 6 及更高版本上的 32 位运行时,并且支持 iOS 7 上的 64 位运行时。

Xcode 可以为单个应用创建 64 位和 32 位二进制文​​件,但 部署目标应该是 iOS7。 他们说将来会是 iOS 6.0 32 位二进制 在 iPhone 5S(64 位处理器)上工作正常。

更新 在 Xcode 5.0.1 中,他们添加了为 iOS 5.1.1 及更高版本创建 64 位二进制文​​件的支持。

Xcode 5.0.1 可以使用 32 位和 64 位二进制文​​件构建您的应用 包括。这个组合的二进制文件需要一个最小的部署目标 iOS 5.1.1 或更高版本。 64 位二进制只能在 64 位设备上运行 运行 iOS 7.0.3 及更高版本。

【讨论】:

这个答案与问题有什么关系?问题是“为什么”,所以“你可以把它关掉”对我来说似乎不是一个有效的答案! 确实,无关紧要的答案。

以上是关于为啥 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有时 Apple Accelerate 框架很慢?

为啥我收到错误“/bin/sh: x86_64-apple-darwin13.4.0-clang: command not found”?

为啥我的 Xcode 插件(例如 clang 格式)在更新到新版本的 Xcode 后,与 Alcatraz 一起安装不再工作?

Xcode 4太多的clang进程

为啥 March=native 在 Apple M1 上不起作用?

为啥编译我的 XCode 项目可以使用 Apple-(B)uild 并且无法使用 Apple-(U)nit 测试编译?