Как программно определить плагин Какао настройки сборки "мусора" пакета?

На Mac OS X с помощью Objective C 2, сменные пакеты могут быть скомпилированы с одной из трех настроек сборки "мусора":

  1. Не поддерживаемый
  2. Поддерживаемый (-fobjc-gc)
  3. Требуемый (-fobjc-gc-only)

Как можно программно запросить скомпилированный сменный пакет для определения, какая из этих трех настроек использовалась?

6
задан smokris 19 January 2010 в 05:34
поделиться

3 ответа

После ответа из DICIU Вы можете использовать API MACH-O . Вы должны разбирать сегменты, содержащиеся в двоичном файле и ищуте __ Objc один; Структура Segment_Command позволяет доступом к флагам сегмента.

Вы также можете взглянуть на проект ProjectDump . Он имеет довольно полный парсер Mach-o.

3
ответ дан 16 December 2019 в 21:40
поделиться

Это часть сегмента __ OBJC, но я не знаю ни одного API, который предоставляет его.

Собрано мусора:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out:
Contents of (__DATA,__objc_classrefs) section
00000001000010b0 0x0
Contents of (__DATA,__objc_imageinfo) section
  version 0
    flags 0x6 OBJC_IMAGE_SUPPORTS_GC

Собрано мусора:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out:
Contents of (__DATA,__objc_classrefs) section
00000001000010b0 0x0
Contents of (__DATA,__objc_imageinfo) section
  version 0
    flags 0x0

Среда выполнения выполняет это с помощью частных функций: см. gc _ enforcer и это использование * _objcInfoRequiresGC*

4
ответ дан 16 December 2019 в 21:40
поделиться

Наверное, проще всего просто попробовать и загрузить пакет, используя метод NSBundle -loadAndReturnError:. Если пакет не загружается из-за того, что настройки GC отличаются от настроек вашего приложения, то вы получите - NSExecutableRuntimeMismatchError.

1
ответ дан 16 December 2019 в 21:40
поделиться