#cross-platform #elf #mach-o
#кроссплатформенный #elf #mach-o
Вопрос:
Предположим, у меня есть программа, созданная для Linux ( foo.elf
) и для OSX ( foo.macho
). Я хотел бы распространять его таким образом, чтобы пользователю не приходилось беспокоиться об этом.
Есть ли способ создать файл, foo
который работает как foo.elf
в Linux, так и foo.macho
в OSX, возможно, используя некоторые хитрые приемы, чтобы сделать файл совместимым с обоими форматами?
Комментарии:
1. Два формата файлов принципиально несовместимы, поэтому, если вы действительно хотите распространять только один файл, единственный способ, который я вижу, — это встроить оба двоичных файла в пользовательский загрузчик-заглушку, написанный на чем-то, что может запускаться само по себе в обеих системах, например, bash или Java. Кроме того, вам, вероятно, все равно придется вырезать встроенные двоичные файлы и записывать их во временные файлы во время выполнения, чтобы фактически выполнить их.
Ответ №1:
Нет, невозможно создать двоичный файл, который одновременно распознается как ELF и файл MACH-O; этот план уже разбивается на первых четырех байтах:
- ЭЛЬФ хочет
.ELF
, в то время как - MACH-O требует
0xFEEDFACE
или0xFEEDFACF
(в зависимости от разрядности).
Предполагая, что системы на самом деле проверяют волшебные байты, нет способа создать файл, который является одновременно файлом ELF и файлом MACH-O.
Комментарии:
1. «невозможно создать двоичный файл, который одновременно распознается как ELF и MACH-O» — это правда, но это не то, что запрашивал OP.
Ответ №2:
Есть ли способ создать файл foo, который работает как foo.elf в Linux и foo.macho в OSX
Да, есть: архив оболочки.
По сути, вы создаете крошечную программу-оболочку, которая решает, запускать foo.elf
или foo.macho
, а затем вызывает эту программу после извлечения ее во временный каталог. Оба собственных исполняемых файла могут храниться, например, в сжатом zip-файле, поэтому накладные расходы на доставку неиспользуемого двоичного файла могут быть сведены к минимуму.
может быть, используя некоторые хитрые приемы, чтобы сделать файл совместимым с обоими форматами?
Это невозможно (как правильно объяснил Йоахим Брайтнер).