Почему Apple Clang (из Xcode 5) делает typeinfos private_extern для arm64?

Если вы скомпилируете этот файл 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 для 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? Это означает, что dlsym () не найдет его во время выполнения. Это нарушает некоторые вещи низкого уровня в базе кода LibreOffice.

8

Решение

Я задал тот же вопрос на соответствующем форуме разработчиков Apple и получил ответ, что это намеренно, чтобы уменьшить количество глобально видимых символов в исполняемом файле. Так что мне просто придется с этим жить.

1

Другие решения

Установите архитектуру в настройке сборки на Стандартные архитектуры (armv7, armv7s)

ARCHS = **armv7 armv7s**

VALID_ARCHS = **armv6 armv7 armv7s**

введите описание изображения здесь

Xcode может собрать ваше приложение как с 32-битными, так и с 64-битными двоичными файлами.
включен. Этот объединенный двоичный файл требует минимальной цели развертывания
iOS 7 или более поздняя версия.

Примечание: будущая версия Xcode позволит вам создать одно приложение, которое
поддерживает 32-разрядную среду выполнения на iOS 6 и более поздних версиях и поддерживает
64-разрядная среда выполнения на iOS 7.

  • Xcode может создавать как 64-битные 32-битные двоичные файлы для одного приложения, но
    цель развертывания должна быть iOS7.
  • Они говорят, что в будущем это будет iOS 6.0 32-битная двоичная версия
    отлично работает в iPhone 5S (64-битный процессор).

Обновить
В Xcode 5.0.1 они добавили поддержку для создания 64-битного двоичного файла для iOS 5.1.1 и выше.

Xcode 5.0.1 может собрать ваше приложение как с 32-битными, так и с 64-битными двоичными файлами
включен. Этот объединенный двоичный файл требует минимальной цели развертывания
iOS 5.1.1 или более поздняя версия. 64-разрядный двоичный файл работает только на 64-разрядных устройствах
под управлением iOS 7.0.3 и новее

-2