Используют ли фреймворки Cocoa Touch позиционно-независимый код?

Я заметил, что при проверке заголовка Mach с использованием otool в фреймворках Cocoa Touch никогда не устанавливался флаг PIE, хотя я установил для обоих параметров «Создать позиционно-зависимый исполняемый файл» и «Создать позиционно-зависимый код» значение НЕТ в Xcode. Тем не менее, это вывод, который я получаю от otool:

otool -hv framework_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00       DYLIB    16       1560   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS    

Как видите, флага PIE здесь нет. Однако при проверке двоичного файла приложения PIE теперь присутствует:

otool -hv application_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00     EXECUTE    24       3088   NOUNDEFS DYLDLINK TWOLEVEL PIE

Кто-нибудь может это объяснить?

Я читал о многих людях, у которых были проблемы с загрузкой своего приложения в App Store, потому что платформа, используемая их приложением, не использовала позиционно-независимый код (проверьте здесь для примера). Это заставляет меня задаться вопросом, как я должен проверить, использует ли мой фреймворк позиционно-независимый код, когда otool, кажется, никогда не сообщает о флаге PIE для двоичных файлов фреймворка?! Он сообщает о них только для двоичных файлов приложений.

Это сбивает меня с толку. Я надеюсь, что кто-то может объяснить это...


person Andreas    schedule 17.09.2019    source источник


Ответы (1)


Из ‹mach-o/loader.h>:

#define MH_PIE 0x200000         /* When this bit is set, the OS will
                       load the main executable at a
                       random address.  Only used in
                       MH_EXECUTE filetypes. */

Примечание: «Используется только в типах файлов MH_EXECUTE».

Только исполняемые файлы имеют различие PIE/non-PIE. Дилибы и пакеты — нет. Они всегда неявно позиционно-независимы.

person Ken Thomases    schedule 17.09.2019
comment
Спасибо, но если dylib всегда неявно не зависят от позиции, почему некоторые приложения отклоняются из App Store, а Apple прямо заявляет, что фреймворки, встроенные в пакет приложений, не являются PIE? См., например, здесь: github.com/realm/realm-cocoa/issues/3710 Apple отклонила приложение, потому что некоторые из его встроенных платформ не использовали PIE. Итак, похоже, что фреймворки действительно могут быть и не PIE, не так ли? - person Andreas; 18.09.2019