在使用Clang或GCC的Darwin后端为OSX创建可执行文件时,可以使用标志-mmacosx-version-min=version
来设置可执行文件将在哪个最早的OSX版本上运行。
有没有办法从给定的可执行文件中跟踪回用于编译它的标志?也就是说,有没有办法确定给定可执行文件所针对的最低OSX版本?
使用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
otool -l -arch x86_64 /path/to/binary
来获取我的fat二进制文件的最小版本。 - ndreisg在被接受的答案中提到的“load”命令,在我构建现代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
LC_VERSION_MIN_MACOSX
的原因可能是因为你的二进制文件是针对 arm64 或通用架构,并且你使用的是 Apple Silicon Mac。请注意,在通用二进制文件的情况下,如果 minos
字段低于 11.0,则不一定反映实际的最小 SDK。对于通用二进制文件,请使用 otool -l -arch x86_64 /path/to/binary
。 - ndreisg一种不使用 otool | grep
的替代方法是使用 vtool
(适用于 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 头文件中的构建和源代码版本,前提是有足够空间进行修改。
otool -l
的答案相比,这似乎无法在静态库上工作(在Intel、macOS 12.5、XCode 13上)。 - emmenlauman vtool
中有记录。很抱歉我在回答中遗漏了它。作为交换,您可以设置或删除相关的加载命令,前提是机器头部有足够的空间。 - Theoretical Economistotool
输出中查看LC_BUILD_VERSION
要好,因为vtool
将platform
和tool
数字解码为可读的字符串。 - rob mayoff
otool -l /path/to/bin | grep -E -A4 '(LC_VERSION_MIN_MACOSX|LC_BUILD_VERSION)' | grep -B1 sdk
;此方法也适用于 ARM64 机器,如 M1。version
或minos
显示最低支持的 macOS 版本,而sdk
显示 SDK 版本。 - legends2k