ios 为什么Apple的Clang(来自Xcode 5)使arm64的typeinfos成为private_extern?

3wabscal  于 2023-06-07  发布在  iOS
关注(0)|答案(3)|浏览(143)

如果编译这个文件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

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

ego6inou

ego6inou1#

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

rdlzhqv9

rdlzhqv92#

  • 初步备注 *:在过去的几天里,我问了自己同样的问题,几乎在Stack Overflow上发布了一个问题。至少我不是一个人在处理这件事。

据我所知,在ARM系统上,他们决定在字符串比较方面实现operator == (const type_info &, const type_info &)。这意味着来自两个独立模块的两个type_info对象可以相等,即使它们不相同。Windows和GNU/Linux上的C++运行时也是这样做的。由于type_info对象不需要完全相同,因此它们不需要发布,因此可以在对象文件中定义为私有外部对象。这些符号将在静态链接期间合并,但不会出现在动态符号表中。

fdbelqdn

fdbelqdn3#

将构建中的架构设置为标准架构(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位二进制文件仅在运行iOS 7.0.3及更高版本的64位设备上运行。

相关问题