2012-08-13 6 views
5

Actualmente estoy trabajando en la actualización del sistema de compilación para una gran cantidad de código, que incluye un proyecto de Linux C++. Sería bueno si todos los desarrolladores de aquí pudieran ejecutar una compilación cuando hackean sus propias ideas, por lo que estaba examinando si sería posible construir esto en sistemas Linux vagamente modernos a pesar de que el sistema objetivo sea 2.6.18.GCC/G ++: creación sin símbolos de objetos únicos de GNU para kernels de Linux anteriores

Por 'vagamente moderno' Estoy estimando algo así como GCC 4.5+, algo que una distribución en el último año o dos podría venir con. Actualmente resuelvo el problema libstdC++ compilándolo en forma estática, y cualquier problema glibc se soluciona limpiamente reasignando a las versiones antiguas de los símbolos memcpy (y así sucesivamente) con un poco de código de contenedor. Hasta aquí todo bien.

El único problema que no puedo entender por completo es que ciertos símbolos integrados en el ejecutable de los archivos .o son del tipo 'u', que es un objeto único de GNU, una extensión del estándar ELF que 2.6.18 no parece reconocer en absoluto. Esto significa que el ejecutable no se ejecutará porque no puede encontrar los símbolos, aunque en realidad están presentes (solo del tipo '?' En el objetivo, desde 'nm').

Uno puede deshabilitar el uso de objetos únicos de GNU al compilar G ++, pero no es exactamente la solución más conveniente. No veo ninguna forma de desactivarlo cuando compilo el código (distro gcc/g ++ invariablemente tiene esta opción), y me imagino que la única manera de que el sistema objetivo lo reconozca sería actualizar ld-linux y kernel . Eso es casi seguro que no va a suceder.

¿Existe alguna opción que no haya encontrado para desactivar estos tipos de símbolos? ¿O tal vez hay alguna manera ordenada de evitar esto o algo que me falta? Estoy empezando a sospechar que solo tendrá que compilarse en G ++ 4.1.x, lo que significará una instalación anterior de Linux o compilación desde la fuente.

+0

si se trata de un tipo de símbolo de vinculación dinámica, entonces debería haber un problema con el vinculador dinámico, no con el kernel. ¿Cómo se relaciona esto con el kernel? – Hibou57

+0

Si bien no lo he probado, creo que cambiar el libld sin cambiar el kernel va a ser bastante difícil, si es posible. Por lo tanto, no está directamente relacionado con el kernel, sino más bien con el hecho de que tendría que recompilar ese kernel o simplemente actualizar todo el sistema operativo para que el enlazador reconozca estos otros símbolos, según tengo entendido. – rhickman

Respuesta

4

Estaba tratando de resolver el mismo problema (lo que me llevó a encontrar esta pregunta) y después de un montón de investigaciones llegué a la conclusión definitiva de que no, no te estás perdiendo nada, no hay forma de evitar esto además de compilar tu propio g ++. Ver esta pregunta reciente sobre la lista de distribución gcc-ayuda:

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

comparé fuentes de GCC y se encontró que se puede ir tan alto como de 4,4, como símbolos únicos se añadieron en 4.5. Sin embargo, en RHEL/CentOS 6 su valor predeterminado es 4.4, pero parcheó el soporte de símbolos únicos, por lo que, como es habitual, hay que tener cuidado con las versiones de gcc específicas de la distribución. Para mí esto es un gran problema ya que significa que las cosas compiladas en RHEL 6 no se pueden ejecutar en RHEL 5, incluso con una copia de libstdC++ hecha solo para gcc 4.4 + RHEL 5.

Aquí está el mensaje donde el símbolo único apoyo fue anunciado, por cierto:

http://www.redhat.com/archives/posix-c++-wg/2009-August/msg00002.html

Si usted busca alrededor usted encontrará que las personas se han quejado de que en otras listas, por diversas razones, pero supongo que está aquí para quedarse.

+0

Gracias por la respuesta. Tendré que quejarme más fuerte sobre la actualización del kernel de Linux :) – rhickman

Cuestiones relacionadas