Определите минимальную версию 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, если для ваших изменений достаточно места.