Создание гибридных двоичных файлов ELF и Mach-O

#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-файле, поэтому накладные расходы на доставку неиспользуемого двоичного файла могут быть сведены к минимуму.

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

Это невозможно (как правильно объяснил Йоахим Брайтнер).