首页 > 解决方案 > 无法 mkbundle 可以在 MacOS 上成功运行和代码签名的 Mach-o 可执行文件

问题描述

我正面临着试图创建有效的 MacOS mach-o 可执行文件的死胡同。

在 Visual Studio 中创建简单的控制台应用程序;简单的.exe

我用 mkbundle 尝试了 2 条路线:

使用 mkbundle

1. 旧的(--custom)方式:

在设置额外的 CC 编译 args 和 pkg-config 的 PATH 之后:

$ mkbundle --deps -v  -L "$PWD" -L "/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5" -o $BASE/Simple.app/Contents/MacOS/simple_exe ./simple.exe

生成的 simple_exe无法启动:

$ cd $BASE/Simple.app/Contents/MacOS/
$ ./simple_exe
Segmentation fault: 11

不过,对于操作系统来说,它是完美的 mach-o,因此签署此文件成功。

2. 通过 --cross 或 --sdk 选项使用 (--simple) mkbundle:

$ mkbundle -v --simple --cross mono-6.8.0-osx-10.9-x64 -o $BASE/Simple.app/Contents/MacOS/simple_exe ./simple.exe

编译的(好吧,更确切地说是构造的)可执行文件成功运行:

$ cd $BASE/Simple.app/Contents/MacOS/
$ ./simple_exe
Hello World!

生成的可执行文件由 Xamarin 签名

尝试了部署过程的 2 个选项:

A- 保留可执行文件原样;由 Xamarin 的应用程序证书签名

现在,来自苹果的公证结果:“无效

问题:代码空

路径“Simple.pkg/pkgbuild_Simple.pkg Contents/Payload/Applications/Simple.app/Contents/MacOS/simple_exe”

消息“二进制文件的签名无效。”

架构“x86_64”代码空

B-强制使用我的应用程序证书退出捆绑的可执行文件。

它给出 ( __LINKEDIT segment does not cover the end of the file (can't be processed) in: /Users/assem/bundles/SimpleApp/payload/Applications/Simple.app/Contents/MacOS/simple_exe)

我已经能够“修补”它并增加 __LINKEDIT 段内的文件大小(以及对齐的 VM 大小),以及 SYMTAB 加载命令下的字符串表大小,以掩盖 mkbundl ed Mono 可执行文件上的注入汇编。

修补后,我可以使用我的证书重新签署生成的可执行文件。但是,如果当我运行它时,它会输出单声道命令行选项帮助消息(好像生成的二进制文件本身就是单声道,并且对捆绑在里面的程序集的链接/引用已损坏)。

$./SimpleApp/payload/Applications/Simple.app/Contents/MacOS/Simple_exe 
Usage is: mono [options] program [program-options]

Development:
    --aot[=<options>]      Compiles the assembly to native code
    --debug[=<options>]    Enable debugging support, use --help-debug for details
    --debugger-agent=options Enable the debugger agent
    --profile[=profiler]   Runs in profiling mode with the specified profiler module
    --trace[=EXPR]         Enable tracing, use --help-trace for details
    --jitmap               Output a jit method map to /tmp/perf-PID.map
    --help-devel           Shows more options available to developers
.
.
.
.

ETC..

注意:原始 Xamarin 的签名位于 mkbundl ed O-Mach 可执行文件的中间,然后是 simple.exe 以及相关程序集。用我的证书修补和重新签名后。代码签名附加到捆绑文件的末尾,超出嵌入式程序集。

长话短说: mkbundle 要么编译一个(可签名的)本机 mach-o 二进制文件,但当它立即运行时会因分段错误而崩溃。或者,构建一个运行但未能部署在可签名 mac 包和公证安装程序 pkg 中的二进制文件。

堆:

标签: macosmonocode-signing-certificatemach-omkbundle

解决方案


推荐阅读