如果编译这个文件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代码库中的某些底层内容。
3条答案
按热度按时间ego6inou1#
我在相关的苹果开发者论坛上问了同样的问题,得到的回复是这是故意的,为了减少可执行文件中全局可见符号的数量。所以我只能忍受了。
rdlzhqv92#
据我所知,在ARM系统上,他们决定在字符串比较方面实现
operator == (const type_info &, const type_info &)
。这意味着来自两个独立模块的两个type_info
对象可以相等,即使它们不相同。Windows和GNU/Linux上的C++运行时也是这样做的。由于type_info
对象不需要完全相同,因此它们不需要发布,因此可以在对象文件中定义为私有外部对象。这些符号将在静态链接期间合并,但不会出现在动态符号表中。fdbelqdn3#
将构建中的架构设置为标准架构(armv7、armv7s)
Xcode可以构建包含32位和64位二进制文件的应用程序。此组合二进制文件要求最低部署目标为iOS 7或更高版本。
注意:Xcode的未来版本将允许您创建一个在iOS 6及更高版本上支持32位运行时的应用程序,并在iOS 7上支持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位设备上运行。