Как я компилирую на Linux для совместного использования со всеми дистрибутивами?

Я скомпилировал расширение 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, никакая идея как все же. Какие-либо указатели?

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

5
задан Gabe 2 May 2011 в 06:02
поделиться

3 ответа

Утверждение: "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 ).


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

8
ответ дан 14 December 2019 в 04:32
поделиться

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

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

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

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

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

1
ответ дан 14 December 2019 в 04:32
поделиться

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

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

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

-1
ответ дан 14 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: