Я скомпилировал расширение PHP на Fedora Core 12, но когда я отправляю его кому-то, использующему CentOS, он получает ошибку: «Файл ELF OS ABI недействителен»
Я не уверен, что заставляет этот запущенный файл предоставить следующую информацию: 64-разрядный 64-разрядный LSB-объект LSB, AMD x86-64, версия 1 (GNU / Linux), не разделенный
Расширение, которое загружает прекрасное, предоставляет следующее из файла: 64-разрядный 64-разрядный LSB-объект LSB, AMD x86-64, версия 1 (SYSV), не разделенный
Похоже, мне нужно создать файл типа SYSV для некоторых дистрибутивов, а не файл GNU / LINUX, но не знаю, как это сделать. Любые указатели?
Также следует ли статически связывать?
Утверждение: «Файл ELF OS ABI недействителен» означает, что двоичный интерфейс приложения несовместим между используемыми двоичными файлами (т. Е. Один пытается смешать двоичные файлы хоста и целевого объекта, что может не работать должным образом). e_ident[EI_OSABI]
заголовка ELF содержит идентификатор операционной системы / ABI. Ваша система Fedora устанавливает это для ELFOSABI_LINUX
( 3
), в то время как система CentOS вашего друга устанавливает его в ELFOSABI_SYSV
( ELFOSABI_NONE
или 0
).
Вы можете скомпилировать утилиту makeelf FreeBSD ( brandelf.c ) и использовать ее для установки OSABI на ELFOSABI_SYSV
( brandelf -f 0 <file>
или brandelf -t SVR4 <file>
.
Я не знаю никаких gcc-флагов для указания этого значения в момент компиляции / ссылки. Я считаю, что версия binutils, используемая gcc в вашей системе Fedora, отвечает за установку OSABI в Linux. Я понимаю, что компоновщик указывает только ABI, если в выходном файле заканчивается символ STT_GNU_IFUNC
(см. Ifunc.txt на странице http://groups.google.com/group/generic-abi для получения более подробной информации о STT_GNU_IFUNC
).
Команда readelf (1) может использоваться для извлечения и отображения информации ABI, хранящейся в заголовке ELF ( readelf -h <file>
).
Этот аналогичный вопрос может также представлять интерес.
Скомпилированные объектные файлы обычно не хорошо переносятся между различными дистрибутивами Linux. В разных дистрибутивах часто существуют разные политики в отношении библиотек, где они хранятся, как они загружаются.
Между ними так много различий (да, даже в Fedora & RedHat / CentOS). Они, скорее всего, будут поставлять свои собственные патчи для компонентов на каждом уровне (ядро, PHP, расположение библиотеки). Если они используют пакет PHP для распространения, дистрибутив может улучшить его интеграцию в свою систему.
Основная проблема, с которой вы, вероятно, столкнетесь, заключается в том, что в дистрибутиве используются разные настройки библиотек / компиляторов. Посмотрите, какая версия gcc находится на его компьютере, и сравните ее с тем, что у вас на руках. (Fedora 12 имеет довольно много новых библиотек, чем CentOS). Вот где может быть ваша проблема.
Другая возможная проблема заключается в том, что ваш двоичный файл прекрасен, но он несовместим со всеми библиотеками, которые он использует. Я не уверен, есть ли хороший способ обойти этот без компиляции на целевом дистрибутиве (или на переменном). Вы можете видеть, какие библиотеки используют каждый общий объект / исполняемый файл, используя команду lld <file>
.
Кроме того, был ли какой-либо выход до ошибки ELF file OS ABI invalid
? В большинстве мест, на которые я ссылаюсь, есть дополнительная информация.
Скорее всего, у вашего друга нет 64-битной системы. ELF является стандартным форматом для исполняемых файлов Linux, но 32-разрядные системы не могут запускать 64-разрядные исполняемые файлы.
Получите вывод для uname -a
от вашего друга. Если вывод не содержит «x86_64», то он находится на 32-битной версии CentOS.
Если это так, вам нужно либо настроить среду кросс-компиляции, либо виртуальную машину для компиляции 32-разрядных двоичных файлов, либо просто предоставить своему другу источники, чтобы он мог скомпилировать ее самостоятельно.