2011-10-04 13 views
20

descargado y compilado glibc-2.13. cuando intento ejecutar un programa C de muestra que hace un malloc(). Consigo siguiente error elf file OS ABI invalidglibc: archivo elf OS ABI no válido

Puede alguien por favor pase a mi cualquier puntero útil para resolver esta nota issue.Please que mi versión del kernel es linux-2.6.35.9

+0

La información es un poco escasa. ¿Estás seguro de que estás vinculando y corriendo contra esa libc? – Mat

Respuesta

29

No es su versión del núcleo que es el problema.

El cargador en su sistema no es compatible con el nuevo Linux ABI. Hasta hace relativamente poco tiempo, los binarios ELF de Linux usaban System V ABI. Recientemente, en apoyo de STT_GNU_IFUNC, se agregó Linux ABI. Debería actualizar su biblioteca de sistema C para tener un cargador que soporte STT_GNU_IFUNC, y luego también reconocerá objetos ELF con el tipo ABI Linux.

Consulte Dave Miller's blog entry on STT_GNU_IFUNC for Sparc para obtener una comprensión de lo que hace STT_GNU_IFUNC, si le importa.

+1

Hola gracias mkj. Esa fue una buena información. Acabo de reemplazar el ld-linux.so (básicamente, ld-2.13.so) y las cosas comenzaron a funcionar para mí. En caso de que sienta curiosidad, mi configuración es como si hubiera creado un objetivo sin disco para Linux y lo ejecutara en una caja virtual. El problema comenzó a aparecer cuando en el root-fs había reemplazado libc.so.6 (glibc-2.9 o más) a libc.so.6 (glibc-2.13) .Y al comparar el OS-ABI del libc.so anterior. 6 mostraba el "sistema V", donde el más nuevo tenía "Linux", como dijiste. – Kapil

+0

Ah, no me di cuenta de que había reemplazado la biblioteca del sistema C sin reemplazar el cargador, o hubiera sido más específico en mi consejo. Supuse que estaba haciendo algo como usar LD_LIBRARY_PATH para cargar una biblioteca alternativa. Me alegro de haber ayudado! – mkj

2

Es posible que su glibc fue construido con la bandera --enable-multiarch que obligó a utilizar ifunc y nueva LINUX ABI

1

De lo que puedo decir es que --enable-multiarch es el valor predeterminado y que debe desactivarlo mediante el establecimiento de --enable-multiarch=no.

0

Si pone sus manos en el cargador de un sistema más nuevo, puede hacer que funcione usando eso. Pero tendrás que llevar el cargador a donde sea que vaya tu programa. Puede compilar su programa para usar ese cargador como se explica en here, o compilar su programa y parchearlo más tarde usando patchelf, de forma similar a lo que menciono here. Pude ejecutar un programa que me estaba dando el error OS ABI invalid en un Linux 2.6.18 (más antiguo que el tuyo) que tenía ld-2.5.so, al copiar un ld-2.15.so desde otro lugar.

NOTA: do NO sobrescribe su sistema ld * .so o ld-linux. ; -/