2010-05-04 13 views
5

compilé una extensión de PHP en Fedora Core 12, pero cuando envío a otra persona mediante CentOS que sale el error: "OS archivo ELF ABI no válido"¿Cómo compilo en Linux para compartir con todas las distribuciones?

no estoy seguro de lo que hace que este archivo se ejecuta proporciona la siguiente Info: ELF 64-bits LSB objeto compartido, AMD x86-64, versión 1 (GNU/Linux), no despojado

Una extensión que se carga bien ofrece las siguientes opciones del archivo: ELF 64-bits LSB objeto compartido, AMD x86-64, versión 1 (SYSV), no eliminado

Parece que necesito generar un archivo de tipo SYSV para algunas distribuciones, en lugar de un GNU/LINUX archivo, no tengo idea de cómo. ¿Alguna sugerencia?

También debería estar enlazando estáticamente?

Respuesta

8

La declaración: "OS archivo ELF ABI no válida", significa que el Application Binary Interface es no compatibles entre binarios utilizados (es decir, uno está tratando de mezclar host y de destino binarios, que puede no funcionar como se espera). El byte e_ident[EI_OSABI] del encabezado ELF contiene la identificación del sistema operativo/ABI. Su sistema Fedora establece esto en ELFOSABI_LINUX (3) mientras que el sistema CentOS de su amigo lo configura en ELFOSABI_SYSV (ELFOSABI_NONE o 0).

Usted puede ser capaz de compilar la utilidad FreeBSD brandelf (brandelf.c) y lo utilizan para establecer el OSABI a ELFOSABI_SYSV (brandelf -f 0 <file> o brandelf -t SVR4 <file>.

No estoy al tanto de cualquier banderas gcc para especificar este valor en tiempo de compilación/enlace. Creo que la versión de binutils utilizada por gcc en su sistema Fedora es responsable de establecer OSABI en Linux. Entiendo que el enlazador solo especifica el ABI si un símbolo STT_GNU_IFUNC termina en el archivo de salida (vea ifunc.txt en http://groups.google.com/group/generic-abi para detalles sobre STT_GNU_IFUNC).


El comando readelf(1) se puede utilizar para recuperar y mostrar la información almacenada en el ABI cabecera ELF (readelf -h <file>).


Este similar question también puede ser de su interés.

+0

¡Muchas gracias! para toda la información, pude compilar brandelf y cambiar el encabezado del sistema operativo. He enviado el binario modificado y espero que se ejecute. Trataré de encontrar una manera de deshacerme del símbolo STT_GNU_IFUNC, no estoy seguro de cómo lo haré; no parece una cosa simple. –

+0

Puede intentar buscar su código fuente para 'attribute ((ifunc))'. Pude cambiar la OSABI de 'ELFOSABI_LINUX' a' ELFOSABI_SYSV' en el * binario * estático * Linux/ia32 de prog.C (programa C++ con el atributo ifunc) descargado del siguiente sitio y todavía lo ejecuto sin ningún efecto secundario notorio. Este binario está vinculado estáticamente, lo que * puede * explicar la falta de efectos secundarios. - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40528 – jschmier

-1

Es muy probable que su amigo no esté ejecutando un sistema de 64 bits. ELF es el formato estándar para los ejecutables de Linux, pero los sistemas de 32 bits no pueden ejecutar ejecutables de 64 bits.

Obtenga la salida para uname -a de su amigo. Si el resultado no contiene "x86_64", entonces está en una versión de 32 bits de CentOS.

Si es así, o necesita configurar un entorno de compilación cruzada o una máquina virtual para compilar binarios de 32 bits, o simplemente proporcione a su amigo las fuentes para que pueda compilarlo él mismo.

+0

En realidad se está ejecutando en 64 bits, le había enviado previamente un archivo de 32 bits y obtuvo un error de eso. Así que tuve que instalar un sistema operativo de 64 bits para volver a compilar. La única diferencia que noto entre la extensión de PHP que envié, y la que él compiló es que dice 'SYSV' contra mío diciendo 'GNU/Linux'. –

+0

¿Ejecutaste el comando 'file' en ambos binarios en el mismo sistema? – jschmier

+0

Sí, ambos fueron gestionados por él en CentOS –

1

Los archivos de objetos compilados generalmente no se transfieren bien entre las diferentes distribuciones de Linux. Las diferentes distribuciones a menudo tienen diferentes políticas con respecto a las bibliotecas, dónde se almacenan y cómo se cargan.

Hay tantas diferencias entre ellos (sí, incluso en Fedora & RedHat/CentOS). Es probable que suministren sus propios parches a los componentes en todos los niveles (kernel, PHP, ubicación de la biblioteca). Si están usando el paquete PHP de distribución, la distribución podría haberlo parcheado mejor en su sistema.

El problema principal con el que probablemente se encontrará es que la distribución ha utilizado una biblioteca/configuración de compilador diferente. Verifique que verision gcc está en su computadora y compárelo con lo que está en su computadora. (Fedora 12 tiene bastantes bibliotecas más nuevas que CentOS). Ahí es donde podría estar tu problema.

Otro posible problema es que su binario está bien, pero es incompatible con todas las bibliotecas que utiliza. No estoy seguro de si hay una buena forma de evitar esto sin compilar en la distribución objetivo (o una variante). Puede ver qué bibliotecas utiliza cada objeto/ejecutable compartido utilizando el comando lld <file>.

Además, ¿hubo alguna salida antes del error ELF file OS ABI invalid? En la mayoría de los lugares en que veo que se hace referencia, hay más información que eso.

+0

Sé que IonCube (una extensión de php) tiene binarios para Linux que funcionan en todas las distribuciones, revisé uno de ellos con el archivo y se publicó "ELF objeto compartido LSB de 64 bits , x86-64, versión 1 (SYSV), vinculado dinámicamente, despojado ". No puedo encontrar ninguna opción para cambiar el encabezado del SO a SYSV cuando compilo en lugar de GNU/LINUX, ese parece ser el problema. ldd muestra 'no un ejecutable dinámico' en su CentOS. –

+0

Es posible que desee verificar la Base de Linux Estándar (LSB). Personalmente no tengo experiencia con él, pero podría proporcionar la compatibilidad binaria que necesita. Ioncube no es una tarea fácil desarrollar una biblioteca PHP que trabaje en distribuciones, quizás sea un poco más simple hacer solo una biblioteca que una aplicación completa como Firefox (donde en algunas distribuciones ha habido conflictos con el cliente Linux descargable de Firefox) – Reece45

Cuestiones relacionadas