Intereting Posts

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

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