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


person tml    schedule 23.12.2013    source источник


Ответы (2)


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

person tml    schedule 22.01.2014

Установите архитектуру в настройках сборки на Стандартные архитектуры (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.
  • Они говорят, что в будущем это будет 32-битный двоичный код iOS 6.0, который будет нормально работать в 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 и более поздних версий.

person Vishal Khatri    schedule 22.01.2014
comment
какое отношение этот ответ имеет к вопросу? Вопрос «почему», поэтому «вы можете отключить это» не кажется мне правильным ответом! - person Michael Ochs; 22.01.2014
comment
действительно, неуместный ответ. - person tml; 22.01.2014