代码之家  ›  专栏  ›  技术社区  ›  nethack

MacOS arm64命令行二进制文件在第一次编译和链接时运行,但在所有后续版本中都因安全错误而失败

  •  0
  • nethack  · 技术社区  · 2 年前

    今天,我第一次在运行Ventura 13.4的M1 Mac Studio上用原生arm64构建了一组基于Makefile的命令行声音合成工具(过去一个月我一直在构建x86-64,并通过Rosetta运行)。主可执行文件加上它的私有dylib在没有错误的情况下构建和链接,并且在机器上运行得非常快。然后我需要修改和重新编译两个源文件,当我这样做时,程序停止了工作,立即被终止。我恢复了源文件并重新构建,但它仍然失效,崩溃日志显示:

    异常类型:EXC_CRASH(SIGKILL(代码签名无效)) 异常代码:0x00000000000000000x0000000000000000 终止原因:CODESIGNING 1任务无效签名

    日志显示:

    默认15:23:35.989553-0700内核proc 70090:为文件“CMIX”加载代码签名错误2 默认15:23:35.990396-0700内核ASP:安全策略不允许进程:70090,/opt/local/src/RTcmix.git/bin/CMIX

    这个程序从未以任何方式签署过,而且在第一个版本生效时也没有。在第一个工作构建和剩余的失败之间没有配置更改。一位朋友在一台运行MacOS12.6的M1笔记本电脑上运行同样的版本。并且没有这个问题。

    重建是否触发了一些新的安全系统?

    0 回复  |  直到 2 年前
        1
  •  0
  •   nethack    2 年前

    我在苹果开发者论坛上得到了明确的答案。这里描述了这个问题,它与更新期间覆盖现有二进制文件有关。从开发文档:

    [试图通过简单覆盖来更新二进制文件的代码]是不正确的,因为它修改了命令行工具的可执行文件。macOS将有关代码签名的信息缓存在内核中。当你修改文件内容时,它不会刷新缓存。就地修改文件会导致文件内容与内核内缓存不匹配,这可能会在下次运行该工具时导致难以再现的代码签名崩溃。 虽然此代码使用命令行工具来演示此问题,但更新任何包含已签名代码的文件都可能引发此代码签名崩溃。其中包括可执行文件、框架、动态库和捆绑包。 要更新包含签名代码的文件而不冒崩溃风险,请将更新后的代码写入临时文件,然后用该临时文件替换现有文件。

    https://developer.apple.com/documentation/security/updating_mac_software

    当为MacOS配置时,我在Makefiles中使用“ditto”作为INSTALL宏来修复此问题。

    推荐文章