Определите минимальную версию OSX, для которой был скомпилирован бинарный файл

При использовании бэкэндов Darwin от Clang или GCC для создания исполняемых файлов для OSX флаг -mmacosx-version-min=version может использоваться для установки самой ранней версии OSX, на которой будет выполняться исполняемый файл.

Есть ли способ отследить от заданного исполняемого файла, какой флаг использовался для его компиляции? Т.е. есть ли способ определить, какая минимальная версия OSX предназначена для данного исполняемого файла?

3 ответа

Решение

Использование otool -l /path/to/binary и осмотреть LC_VERSION_MIN_MACOSX команда загрузки; в частности, поле версии.

Например, двоичный файл, скомпилированный с 10.8 SDK с целью развертывания (-mmacosx-version-min) 10.8 должен иметь LC_VERSION_MIN_MACOSX как это:

Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.8
      sdk 10.8

тогда как двоичный файл, скомпилированный с помощью 10.8 SDK с целью развертывания 10.7, должен иметь LC_VERSION_MIN_MACOSX команда загрузки так:

Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.7
      sdk 10.8

Команда загрузки, упомянутая в принятом ответе, не указана, когда я создаю современный исполняемый файл macOS. Однако LC_BUILD_VERSIONдействительно содержит minosа также sdkполя:

      Load command 10
      cmd LC_BUILD_VERSION
  cmdsize 32
 platform 1
    minos 11.0
      sdk 11.1
   ntools 1
     tool 3
  version 609.8

Альтернатива использованиюotool | grepиспользовать (доступно в macOS 10.15 и более поздних версиях).

Например:

      ❯ vtool -show-build ./test
test (architecture x86_64):
Load command 10
      cmd LC_BUILD_VERSION
  cmdsize 32
 platform MACOS
    minos 12.0
      sdk 12.3
   ntools 1
     tool LD
  version 764.0
test (architecture arm64):
Load command 10
      cmd LC_BUILD_VERSION
  cmdsize 32
 platform MACOS
    minos 12.0
      sdk 12.3
   ntools 1
     tool LD
  version 764.0

Как отмечено в комментариях, это не работает со статическими библиотеками или объектными файлами. Отman vtool:

           Currently vtool only operates on final linked binaries, such as executable files, dynamic libraries, and bundles. Because the
     executable code in Mach-O final linked binaries cannot be moved or resized, and because the load commands reside between the mach
     header and the executable code, there is only a limited amount of space available for vtool to save changes. Set operations that
     add or resize load commands may fail if there isn't enough space in the Mach-O file availble to hold the new load commands.

vtoolоднако позволяет вам редактировать версии сборки и исходного кода в заголовке mach, если для ваших изменений достаточно места.

Другие вопросы по тегам