macos - 无法 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 的应用程序证书签名
- 使用我的应用程序证书对这个可执行文件旁边的其他资产进行代码签名。
- 签名整个 App 包成功
$codesign --strict --sign "$CERT" $BASE/Simple.app
- 制作安装程序 .pkg 并使用安装程序证书对其进行签名成功。
现在,来自苹果的公证结果:“无效”
问题:代码空
路径“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 中的二进制文件。
堆:
- MacOS Catalina(也在 Mojave 上尝试了上述所有方法)
- Mono 6.8.0(也在 6.6.0、6.4.0 和 6.0.0 上尝试过)
- XCode 版本 11.3.1(也在较旧的 10.x 上尝试过)
解决方案
推荐阅读
- python - 通过 Jupyter Notebook 与命令提示符进行 pip 安装
- android - 在 soong bootsrap 期间 Android 构建失败 - 使用所有资源并挂起
- python - tflite_runtime 和 beaglebone ai 与 GPU 和 DSP
- reactjs - npx create-react-app 不能使用全局,即使我没有全局
- flutter - Flutter中的ChewiePlayer在进入全屏模式后处理控制器
- php - PHP Socket 服务器 - 将 verify_peer 设置为 false 是否安全
- python - ws.run_forever() 为我提供了与 dema_100 相同的值,这与不断实时变化的 websocket 值不同。dema值不同的api
- javascript - React className循环添加逗号
- php - 如何使用 PHP 从 HTML cURL 响应中提取嵌套在注释中的 CDATA
- java - Java离线生成波卡地址