【问题标题】:Determine minimum OSX version a binary was compiled for确定编译二进制文件的最低 OSX 版本
【发布时间】:2013-06-13 03:53:30
【问题描述】:

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

有没有办法从给定的可执行文件中追溯使用哪个标志来编译它? IE。有没有办法确定给定可执行文件所针对的最低 OSX 版本?

【问题讨论】:

  • 郑重声明,自从 GCC 的许可证更改为 GPLv3 以来,Apple 没有为 GCC 做出过贡献。尽可能使用 Clang/LLVM。
  • 简答otool -l /path/to/bin | grep -E -A4 '(LC_VERSION_MIN_MACOSX|LC_BUILD_VERSION)' | grep -B1 sdk;这也适用于像 M1 这样的 ARM64 机器。 versionminos 提供最低支持的 macOS 版本,而 sdk 提供 SDK 版本。

标签: macos toolchain mach-o


【解决方案1】:

使用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

【讨论】:

  • 有没有办法获取静态库(“.a”文件)的这些信息?
  • 这也适用于静态库(.a 文件)。您将在库中的每个对象中看到这样的加载命令。有一个很好的 Mac 用户界面应用程序,称为“MachOView”,它允许轻松浏览二进制文件,并轻松搜索这些加载命令。
  • 哇,谢谢!但是,有没有办法使用 macOS 内置的库存工具来查找这些信息? 'otool' 是开发者工具的一部分
  • 是否有库或系统 api 以编程方式执行此操作?
  • @electronic_coder 是的,有一个 API 可以以编程方式完成。看下otool的源码(github.com/opensource-apple/cctools/tree/master/otool)。
【解决方案2】:

在我构建现代 macOS 可执行文件时,未列出已接受答案中提到的加载命令。但是LC_BUILD_VERSION 确实包含minossdk 字段:

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

【讨论】:

  • 我也注意到了这一点。请参阅此屏幕截图,其中包含两种类型的输出,来自在同一 CI 运行中构建但由不同工具(PyInstaller 与 Rust)构建的二进制文件:github.com/ActivityWatch/activitywatch/pull/…
  • 您看不到LC_VERSION_MIN_MACOSX 的原因可能是因为您的二进制文件是用于架构 arm64 或通用的,并且您有一个 Apple Silicon Mac。请注意,对于通用二进制文件,minos 字段如果低于 11.0,则不一定反映实际的最低 SDK。对通用二进制文件使用otool -l -arch x86_64 /path/to/binary
  • 啊,我用的是Apple Silicon。
  • 我也没有看到它,intel with big sur
  • 好吧,如果我使用 CFLAGS=-mmacosx-version-min=10.10 构建,我确实在二进制文件中看到了 LC_VERSION_MIN_MACOSX,但我丢失了 LC_BUILD_VERSION
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多