Macos 确定二进制文件编译的最低OSX版本

Macos 确定二进制文件编译的最低OSX版本,macos,toolchain,mach-o,Macos,Toolchain,Mach O,使用Clang或GCC的Darwin后端为OSX创建可执行文件时,可以使用标志-mmacosx version min=version设置可执行文件将运行的OSX的最早版本 有没有办法从给定的可执行文件追溯到编译它时使用了哪个标志?也就是说,是否有办法确定给定可执行文件的目标OSX最低版本?使用otool-l/path/to/binary并检查LC\u version\u MIN\u MACOSXload命令;具体来说,是版本字段 例如,使用部署目标为(-mmacosx version min)

使用Clang或GCC的Darwin后端为OSX创建可执行文件时,可以使用标志
-mmacosx version min=version
设置可执行文件将运行的OSX的最早版本


有没有办法从给定的可执行文件追溯到编译它时使用了哪个标志?也就是说,是否有办法确定给定可执行文件的目标OSX最低版本?

使用
otool-l/path/to/binary
并检查
LC\u version\u MIN\u MACOSX
load命令;具体来说,是版本字段

例如,使用部署目标为(
-mmacosx version min
)10.8的10.8 SDK编译的二进制文件应具有如下
LC\u version\u min\u MACOSX

Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.8
      sdk 10.8
Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.7
      sdk 10.8
而使用部署目标为10.7的10.8 SDK编译的二进制文件应具有如下
LC\u VERSION\u MIN\u MACOSX
load命令:

Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.8
      sdk 10.8
Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.7
      sdk 10.8

在构建现代macOS可执行文件时,接受答案中提到的load命令没有列出。但是
LC\u BUILD\u 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

记录在案的是,自从GCC的许可证改为GPLv3后,苹果就没有向GCC捐款。如果可能,请使用Clang/LLVM。是否有任何方法可以获取静态库(“.a”文件)的此信息?这也适用于静态库(.a文件)。您将看到库中每个对象都有这样的load命令。Mac有一个很好的UI应用程序叫做“MachOView”“这样可以轻松浏览二进制文件,并轻松搜索这些加载命令。哇,谢谢!然而,有没有办法通过macOS内置的库存工具来了解这些信息?”“otool”是开发工具的一部分。是否有一个库或系统api以编程方式执行此操作?@electronic_coder是的,有一个api以编程方式执行此操作。看看耳石()的来源,我也注意到了。查看这两种类型输出的屏幕截图,来自在同一个CI运行中构建的二进制文件,但使用不同的工具(PyInstaller vs Rust):您没有看到
LC\u VERSION\u MIN\u MACOSX
的原因可能是您的二进制文件用于架构arm64或universal,并且您有一台Apple Silicon Mac。请注意,如果是通用二进制文件,
minos
字段低于11.0,则不一定反映实际的最小SDK。对通用二进制文件使用
otool-l-arch x86\u 64/path/to/binary
。啊,我确实在使用苹果硅。我也没有看到它,在使用big surok的英特尔上,看起来如果我使用CFLAGS=-mmacosx version min=10.10构建,我确实在二进制文件中看到了LC\u version\u min\u MACOSX,而我丢失了LC\u build\u version