2012-01-12 13 views
8

Necesito implementar en un cuadro Red Hat 4.1.2 (que tiene gcc 4.1.2). Uso GCC 4.6.1 en Ubuntu 11.10 para desarrollo. Desafortunadamente, algunos de los binarios que crea mi proceso de creación no se pueden usar en la máquina RedHat. La razón parece ser un cambio ABI, que según another Stackoverflow question resultó de la introducción de símbolos STT_GNU_IFUNC. ¿Hay alguna manera de evitar la exportación de tales símbolos para que mi binario pueda usar el antiguo ABI? Utilicé nm para buscar cualquier símbolo de tipo "i" en mi binario pero no encontré ninguno.Cómo evitar los símbolos STT_GNU_IFUNC en tu binario?

Pregunto esto porque algunos de mis otros binarios, así como algunas librerías de terceros que construyo (tbb, boost) no están usando el nuevo ABI y funcionan bien en la máquina RedHat.

Espero que esté claro. Gracias por adelantado.

Respuesta

11

En general, los sistemas UNIX admiten compatibilidad binaria hacia atrás (un binario incorporado en una máquina antigua continúa ejecutándose en uno más nuevo), pero no a la inversa. No puede esperar que un binario incorporado en un nuevo sistema se ejecute en uno anterior. STT_GNU_IFUNC es solo el primer de muchos problemas que encontrará.

Si necesita construir un binario en una máquina más nueva que se ejecutará en una más antigua, consulte el documento this.

No solía ser "APGCC: Una envoltura GCC para hacer binarios portátiles" que hizo tan fácil (se hace referencia a la anterior), pero parece haber desaparecido ;-(

La opción más fácil es construir sobre una vieja máquina (que se usa para construir en RedHat 6.2, y el binario resultante corrió por todas partes ). Usted no tiene que ejecutar realmente RH-6.2 en una máquina física, simplemente tocar el tema en una máquina virtual.

La otra opción relativamente fácil es construir en un chroot, nuevamente utilizando herramientas y bibliotecas de una distribución anterior (por ejemplo, RH-6.2).

+0

Gracias, eso es lo que temía. El problema es que mi entorno de compilación aprovecha las características relativamente nuevas de python y gcc. Tendré que atenuarlo. – samwise

+0

Generalmente * puede * construir un nuevo Python y GCC en un equipo antiguo, y luego usarlos. La versión de GCC no tiene mucha importancia para la portabilidad de la biblioteca resultante; solo la versión de glibc lo hace. –

0

La compilación cruzada a un Linux más antiguo puede ser muy difícil, y este es solo uno de los muchos problemas que encontrará.

Dicho esto, el problema de compatibilidad ABI puede resolverse agregando -Wl,-fno-jump-tables.

Cuestiones relacionadas