binfmt-probe-cli из mono-runtime не распознает исполняемые файлы x64?

На 64-битной Ubuntu 14.04.2 LTS я могу запускать exe-файлы "x86", но не "x64".

Если я использую monodevelop для построения конфигурации x86 проекта, в результате x86/test.exeЯ могу запустить его с ./x86/test.exe, но если я вместо этого соберу конфигурацию x64, что приведет к ./x86/test.exeЯ не могу запустить его с ./x64/test.exe - я получаю ошибку:

run-detectors: unable to find an interpreter for ./x64/test.exe

Я могу запустить оба нормально, если я префикс команды с mono (mono ./x64/test.exe а также /usr/bin/cli ./x64/test.exe оба работают нормально).

Я вижу, что моно настроен для запуска этих видов двоичных файлов:

$ update-binfmts --display   
...                                       
cli (enabled):                                                                                                                 
     package = mono-runtime                                                                                                    
        type = magic                                                                                                           
      offset = 0                                                                                                               
       magic = MZ                                                                                                              
        mask =                                                                                                                 
 interpreter = /usr/bin/cli                                                                                                    
    detector = /usr/lib/cli/binfmt-detector-cli

Оба файла появляются для начала MZ:

$ head ./x86/test.exe
MZ\220^@^C^@^@^@^D^@^@^@\377\377^@^@\270^@...

$ head ./x64/test.exe                  
MZ\220^@^C^@^@^@^D^@^@^@\377\377^@^@\270^@...

Но binfmt-detector-cli не может обнаружить один из них:

$ /usr/lib/cli/binfmt-detector-cli ./x86/test.exe; echo $?                                                                                                               
0                                                           

$ /usr/lib/cli/binfmt-detector-cli ./x64/test.exe; echo $?                                                                                                               
1                                  

Больше информации о exe-файлах:

$ file ./x86/test.exe                    
./x86/test.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows            

$ file ./x64/test.exe                
./x64/bin/ShapeSearch.exe: PE32+ executable (console) x86-64 Mono/.Net assembly, for MS Windows    

К сожалению, я не совсем понимаю, о чем говорю. Я начал это исследование с чтения Восстановление из-за испорченной конфигурации binfmts, но это немного над моей головой.

1 ответ

Еще в 2015 годуbinfmt-detector-cliне смог принять исполняемый файл «PE32+» (т. е. x64), поэтому все они неявно были отфильтрованы как «не двоичные файлы CLR». Это было «исправлено» в начале 2022 года с помощью https://github.com/mono/linux-packaging-mono/pull/35 . Однако результатом изменения стало то, что большинство файлов PE32+(CLR или нет) теперь были помечены как «двоичные файлы CLR» (своего рода инвертирование ошибки).

У меня есть предложение исправить детектор в https://github.com/mono/linux-packaging-mono/pull/38 . Я считаю, что это изменение учитывает различия между PE32 и PE32+. По сути, запись «Каталог данных среды выполнения CLR» находится в разных местах в двух форматах.

ПРИМЕЧАНИЕ. Здесь есть три уровня «двоичного кода». Исполняемый файл MS-DOS с магическим заголовком файла «MZ», зарегистрированным в ядре. В него встроен набор заголовков PE. Для форматов, связанных с CLR, существуют 32-битные и 64-битные варианты названий «PE32» и «PE32+». Наконец, есть заголовок (иногда называемый «записью каталога данных среды выполнения CLR»), в котором указывается, является ли исполняемый контент двоичными данными среды выполнения, управляемыми CLR, или собственными двоичными данными.

Другие вопросы по тегам