Я зашел в тупик, пытаясь создать работающий MacOS-исполняемый файл, который работает.
создал простое консольное приложение в visual studio; simple.exe
Я пробовал 2 маршрута с mkbundle:
, используя mkbundle
1. старый (--custom) способ:
после установки extra CC компилирует args и PATH для pkg-config:
$ 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
, хотя, это идеально подходит для ОС, поэтому подписание этого файла будет успешным.
2. с использованием (--simple) mkbundle с опциями --cross или --sdk:
$ 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
- Код подписывает другие активы рядом с этим исполняемым файлом с помощью моего сертификата приложения.
- Подписание Весь пакет приложения успешно
$codesign --strict --sign "$CERT" $BASE/Simple.app
- Создание установщика. pkg и его подписание с помощью сертификата установщика завершено успешно.
Теперь, нотариальное заверение от Apple: " Недопустимо "
выпуск : code null
path "Simple.pkg / pkgbuild_Simple.pkg Contents / Payload / Applications / Simple.app / Contents / MacOS / simple_exe"
message "Подпись двоичного файла недействительна. "
архитектура" x86_64 "код null
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 (вместе с выровненным размером виртуальной машины) и размера таблицы String в командах загрузки SYMTAB, чтобы скрыть внедренные сборки над mkbundl ed моно исполняемый файл.
После исправления я могу переподписать полученный исполняемый файл своим сертификатом. но, если я его запускаю, он выводит сообщение справки по параметрам командной строки mono (как если бы получающийся двоичный файл был сам по себе 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
.
.
.
.
et c ..
примечание: оригинальная подпись Xamarin находилась в середине исполняемого файла mkbundl ed O-Mach, за которым следовали simple.exe, а также зависимые сборки. После исправления и переподписки с моим сертификатом. подпись кода присоединяется к концу связанного файла, за пределами встроенных сборок.
Короче говоря: mkbundle либо компилирует (знаковый) собственный двоичный файл mach-o , но при запуске сразу вылетает с ошибкой сегментации. или создает двоичный файл, который запускается, но не может быть развернут внутри подписываемого пакета ma c и нотариально заверенного установщика pkg.
Стек:
- MacOS Catalina (также пробовал все выше в Mojave)
- Mono 6.8.0 (также пробовал на 6.6.0, 6.4.0 и 6.0.0)
- XCode версии 11.3.1 (также пробовал на старых 10.x )