Как мне скомпилировать на linux чтобы поделиться со всеми дистрибутивами? - PullRequest
5 голосов
/ 04 мая 2010

Я скомпилировал расширение PHP в Fedora Core 12, но когда я отправляю его кому-то, использующему CentOS, они получают ошибку: «Недопустимый файл ELF OS ABI»

Я не уверен, что вызывает этот запущенный файл предоставляет следующую информацию: 64-разрядный разделяемый объект LSB ELF, AMD x86-64, версия 1 (GNU / Linux), без зачистки

Расширение, которое загружается нормально, предоставляет следующее из файла: ELF 64-битный разделяемый LSB-объект, AMD x86-64, версия 1 (SYSV), без зачистки

Так что, похоже, мне нужно создать файл типа SYSV для некоторых дистрибутивов, а не файл GNU / LINUX, хотя понятия не имею, как. Есть указатели?

Также я должен быть статически связывать?

Ответы [ 3 ]

8 голосов
/ 05 мая 2010

Утверждение: «Недопустимый ABI файлового файла ELF» означает, что двоичный интерфейс приложения несовместим между используемыми двоичными файлами (т. Е. Кто-то пытается смешать двоичные файлы хоста и цели, что может не работает, как ожидалось). Байт e_ident[EI_OSABI] заголовка ELF содержит идентификацию операционной системы / ABI. Ваша система Fedora устанавливает для него значение ELFOSABI_LINUX (3), в то время как система CentOS вашего друга устанавливает для него значение ELFOSABI_SYSV (ELFOSABI_NONE или 0).

Вы можете иметь возможность скомпилировать утилиту branBSf FreeBSD ( brandelf.c ) и использовать ее для установки OSABI на ELFOSABI_SYSV (brandelf -f 0 <file> или brandelf -t SVR4 <file>.

Мне не известны какие-либо флаги gcc для указания этого значения во время компиляции / компоновки. Я считаю, что версия binutils, используемая gcc в вашей системе Fedora, отвечает за установку OSABI в Linux. Насколько я понимаю, компоновщик определяет ABI, только если символ STT_GNU_IFUNC попадает в выходной файл (подробности о STT_GNU_IFUNC см. ifunc.txt в http://groups.google.com/group/generic-abi).


Команда readelf (1) может использоваться для извлечения и отображения информации ABI, хранящейся в заголовке ELF (readelf -h <file>).


Этот аналогичный вопрос также может представлять интерес.

1 голос
/ 05 мая 2010

Скомпилированные объектные файлы обычно плохо переносятся между различными дистрибутивами Linux. Разные дистрибутивы часто имеют разные политики в отношении библиотек, где они хранятся, как они загружаются.

Между ними так много различий (да, даже в Fedora и RedHat / CentOS). Скорее всего, они будут поставлять свои собственные патчи для компонентов на каждом уровне (ядро, PHP, расположение библиотеки). Если они используют дистрибутивный PHP-пакет, дистрибутив мог бы залатать его, чтобы он лучше интегрировался в их систему.

Основная проблема, с которой вы, вероятно, столкнетесь, заключается в том, что в дистрибутиве используются другие настройки библиотек / компилятора. Проверьте, какая версия gcc находится на его компьютере, и сравните ее с тем, что у вас. (Fedora 12 имеет несколько новых библиотек, чем CentOS). Вот где ваша проблема может быть.

Другая возможная проблема в том, что ваш бинарный файл в порядке, но он несовместим со всеми используемыми библиотеками. Я не уверен, есть ли хороший способ обойти это без компиляции на target-distribution (или varient). Вы можете увидеть, какие библиотеки использует каждый общий объект / исполняемый файл, используя команду lld <file>.

Кроме того, был ли какой-либо вывод перед ошибкой ELF file OS ABI invalid? В большинстве мест, на которые я ссылаюсь, больше информации, чем это.

0 голосов
/ 04 мая 2010

Скорее всего, ваш друг не использует 64-битную систему. ELF - это стандартный формат для исполняемых файлов Linux, но 32-разрядные системы не могут запускать 64-разрядные исполняемые файлы.

Получите вывод для uname -a от вашего друга. Если вывод не содержит «x86_64», значит он работает на 32-битной версии CentOS.

Если это так, вам нужно либо установить среду кросс-компиляции, либо виртуальную машину для компиляции 32-битных двоичных файлов, либо просто предоставить своему другу исходные коды, чтобы он мог сам скомпилировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...