Macos 为什么我使用x86_64构建系统构建的本机arm64应用程序无法进行代码签名,除非我删除以前的可执行文件?

Macos 为什么我使用x86_64构建系统构建的本机arm64应用程序无法进行代码签名,除非我删除以前的可执行文件?,macos,native,apple-silicon,Macos,Native,Apple Silicon,我有一个简单的C应用程序: #包括 int main(){ printf(“你好,世界!\n”); } 当我: 在苹果的硅设备上构建 瞄准arm64 使用为x86_64编译的生成系统 替换现有二进制文件(例如在重建期间) 根据shell,最终二进制文件无法执行,并报告为“已终止”: %rm你好 #arch模拟仍为x86_64编译的构建系统 %arch-x86_64 cc-arch-arm64 hello.c-o hello %/你好 你好,世界! %arch-x86_64 cc-arch-ar

我有一个简单的C应用程序:

#包括
int main(){
printf(“你好,世界!\n”);
}
当我:

  • 在苹果的硅设备上构建
  • 瞄准arm64
  • 使用为x86_64编译的生成系统
  • 替换现有二进制文件(例如在重建期间)
  • 根据shell,最终二进制文件无法执行,并报告为“已终止”:

    %rm你好
    #arch模拟仍为x86_64编译的构建系统
    %arch-x86_64 cc-arch-arm64 hello.c-o hello
    %/你好
    你好,世界!
    %arch-x86_64 cc-arch-arm64 hello.c-o hello
    %/你好
    zsh:死了。/你好
    
    如果我的构建系统是本机arm64(或arm64e),则没有问题:

    %rm你好
    %arch-arm64e cc-arch-arm64你好.c-o你好
    %/你好
    你好,世界!
    %arch-arm64e cc-arch-arm64你好.c-o你好
    %/你好
    你好,世界!
    
    如果我输入并替换代码签名,则它可以工作:

    %cp你好,你好
    %协同设计-s--f hello2
    hello2:替换现有签名
    %/你好
    你好,世界!
    

    原稿复制步骤及调试 当我以arm64为目标在Apple Silicon设备上构建时,但使用为x86_64编译的构建系统,最终的二进制文件无法执行,并根据shell报告为“已终止”:

    #arch模拟仍为x86_64编译的构建系统
    %arch-x86_64 cc-arch-arm64 hello.c-o hello
    %档案你好
    你好:Mach-O 64位可执行arm64
    %/你好
    zsh:死了。/你好
    
    即使尝试调试它也会失败:

    %lldb你好
    (lldb)目标创建“你好”
    杀了lldb喂
    
    作为一种解决方法,我可以在调用
    cc
    之前将其“重置”回arm64环境,但这很不雅观,而且感觉我缺少了一些配置,以避免跳过这么多障碍

    %cc--版本
    Apple clang版本12.0.0(clang-1200.0.32.27)
    目标:arm64-apple-darwin20.1.0
    线程模型:posix
    InstalledDir:/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/bin
    
    这是在macOS Big Sur 11.0.1上

    从x86_64交叉编译 如果我从x86_64机器交叉编译并在周围scp二进制文件,则文件执行良好:

    %SDKROOT=$(xcrun-sdkmacosx11.0——显示sdk路径)\
    MACOSX_部署_目标=$(xcrun-sdk macosx11.0--显示sdk平台版本)\
    cc-Arch64你好,c-o你好
    %scp hello silicon:/tmp/hello cross
    
    转辙机

    %file/tmp/hello cross
    /tmp/hello cross:Mach-O 64位可执行文件arm64
    %/tmp/hello cross
    你好,世界!
    
    跟踪子进程 将
    --verbose
    添加到
    cc
    调用会打印出子进程(我添加了新行以突出显示其他调试中的那些进程):

    %arch-x86\u 64 cc--verbose-arch-arm64 hello.c-o hello
    Apple clang版本12.0.0(clang-1200.0.32.27)
    目标:AARC64-apple-darwin20.1.0
    线程模型:posix
    InstalledDir:/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/bin
    “/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/bin/clang”-cc1-triple arm64-apple-macosx11.0.0-Wdeprecated objc isa用法-Werror=不推荐的objc isa用法-Werror=隐式函数声明-emit obj-mrelax all-disable free-disable llvm验证器-discard value names-主文件名hello.c-mrelocation model pic-pic level 2-mthread model posix-mframe pointer=非叶-fno严格返回-masm详细-munwind表格-目标sdk版本=11.0-目标cpu漩涡-目标功能+v8.3a-目标功能+fp-armv8-目标功能+neon-目标功能+crc-目标功能+crypto-目标功能+fullfp16-目标功能+ras-目标功能+lse-目标功能+rdm-目标功能+rcpc-目标功能+zcm-目标功能+zcz-目标功能+sha2-目标功能+aes-目标abi darwinpcs-休洛半参数和返回-矮人列信息-调试器调优=lldb-目标链接器版本609.6-v-资源目录/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xToolchain/usr/lib/clang/12.0.0-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk-I/usr/local/include-internal isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include-internal isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include-内部外部isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include-内部外部isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include-Wno reorder init list-Wno implicit int float conversion-Wno-c99-designator-Wno final dtor non final class-Wno extra semi stmt-Wno误导性缩进-Wno quoted include in framework header-Wno隐式fallthrough-Wno enum-conversion-Wno枚举浮点转换-fdebug编译dir/tmp/example-ferror limit 19-fmessage length 237-stack protector 1-fstack check-mdarwin stkchk strong link-fblock-fencode扩展块签名-fregister全局dtor with atexit-fgnuc version=4.2.1-fobjc runtime=macosx-11.0.0-fmax type align=16-fdiagnostics show选项-fcolor diagnostics-o/var/folders/j2/g4_hr3jd2sz415vrf7b1d6300000gp/T/hello-232f6b.o-x c hello.c
    clang-cc1版本12.0.0(clang-1200.0.32.27)默认目标x86_64-apple-darwin20.1.0
    忽略不存在的目录“/usr/local/include”
    忽略不存在的目录“/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include”
    忽略不存在的目录“/Applications/Xcode.app/Contents/De