Не удалось выполнить mkbundle исполняемого файла Mach-o, который можно успешно запустить и кодировать в MacOS - PullRequest
0 голосов
/ 25 марта 2020

Я зашел в тупик, пытаясь создать работающий 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...