Я скомпилировал расширение PHP на Ядре Fedora 12, но когда я отправляю его кому-то использование CentOS, они получают ошибку: "Файл ELF ОС недопустимый ABI"
Я не уверен, что вызывает это, петляние обеспечивает следующую информацию: ELF 64-разрядный общий объект LSB, AMD x86-64, версия 1 (GNU/Linux), не разделенный
Расширение, которое загружается прекрасный, обеспечивает следование из файла: ELF 64-разрядный общий объект LSB, AMD x86-64, версия 1 (SYSV), не разделенный
Таким образом, кажется, что я должен генерировать файл типа SYSV для некоторых дистрибутивов, вместо файла GNU/LINUX, никакая идея как все же. Какие-либо указатели?
Также я должен статически связываться?
Утверждение: "ELF file OS ABI invalid", означает, что Application Binary Interface несовместим между используемыми двоичными файлами (т.е. пытаются смешать хостовый и целевой двоичные файлы, что может не работать, как ожидалось). Байт e_ident[EI_OSABI]
заголовка ELF содержит идентификатор операционной системы/ABI. Ваша система Fedora имеет значение ELFOSABI_LINUX
(3
), а система CentOS вашего друга имеет значение ELFOSABI_SYSV
(ELFOSABI_NONE
или 0
).
Вы возможно сможете скомпилировать утилиту FreeBSD brandelf (brandelf.c) и использовать ее для установки OSABI в ELFOSABI_SYSV
(brandelf -f 0
или brandelf -t SVR4
).
Я не знаю никаких флагов 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
).
Этот похожий вопрос также может представлять интерес.
Скомпилированные объектные файлы обычно плохо передаются между разными дистрибутивами Linux. Различные дистрибутивы часто имеют разные политики в отношении библиотек, где они хранятся и как загружаются.
Между ними так много различий (да, даже в Fedora и RedHat / CentOS). Они, вероятно, предоставят свои собственные исправления для компонентов на каждом уровне (ядро, PHP, расположение библиотеки). Если они используют дистрибутивный пакет PHP, возможно, дистрибутив исправил его, чтобы лучше интегрировать в их систему.
Основная проблема, с которой вы, вероятно, столкнетесь, заключается в том, что в дистрибутиве использовались другие настройки библиотек / компилятора. Проверьте, какая версия gcc установлена на его компьютере, и сравните ее с тем, что у вас. (Fedora 12 имеет несколько более новых библиотек, чем CentOS). Вот где может быть ваша проблема.
Другая возможная проблема заключается в том, что ваш двоичный файл в порядке, но несовместим со всеми используемыми библиотеками. Я не уверен, есть ли хороший способ обойти это без компиляции целевого дистрибутива (или варианта). Вы можете увидеть, какие библиотеки использует каждый общий объект / исполняемый файл, используя команду lld
.
Кроме того, был ли какой-либо вывод перед ошибкой ELF-файл OS ABI invalid
? В большинстве мест, где я вижу, что на него ссылаются, есть больше информации, чем это.
Скорее всего, ваш друг не использует 64-битную систему. ELF - это стандартный формат исполняемых файлов Linux, но 32-битные системы не могут запускать 64-битные исполняемые файлы.
Получите от вашего друга вывод для uname -a
. Если результат не содержит "x86_64", значит, он работает на 32-битной версии CentOS.
Если это так, то вам нужно либо создать кросс-компилируемую среду, либо виртуальную машину для компиляции 32-битных двоичных файлов, либо просто предоставить вашему другу исходники, чтобы он мог скомпилировать их сам.