Upgrading GCC/es

Este documento guía al usuario a través del proceso de actualizar GCC.

Introducción
Este documento trata de actualizar GCC. Cambiar a una versión más antigua de GCC podría provocar efectos laterales no deseados. Por favor, eche un vistazo a la sección de resolución de problemas para informarse de algunos problemas de los que se informa frecuentemente.

La siguiente sección ofrece una introducción rápida a las actualizaciones de GCC (y lo fáciles que son). Si desea leer el razonamiento completo detrás de las actualizaciones de GCC, por favor, continue con explicación de actualizaciones de GCC.

Versión corta
Si está actualizando GCC entonces no necesita hacer nada salvo cambiar la versión del compilador y reconstruir libtool:

Si actualiza GCC desde una versión anterior a la 3.4.0 (para las series 3.x) o la 4.1, necesitará tambiér lanzar revdep-rebuild:

Compruebe la versión actual y desinstale la versión antigua

Ya lo tiene. ¡Disfrute del nuevo compilador!

Introducción
Las actualizaciones de GCC siempre han sido rodeadas de un aura de misterio, con sugerencias que van desde "No hace falta hacer nada" hasta "Tendrá que reconstruir el sistema completo, dos veces". La mayoría de estas medias informaciones (FUD) vienen de la confusión que rodea las incompatibilidades del ABI. Antes, unas palabras sobre libtool.

libtool y fix_libtool_files.sh
Las instalaciones anteriores de GCC en Gentoo requerían ejecutar una orden específica llamado. Hace algún tiempo, la ejecución de esta orden se ha integrado en la propia instalación del paquete (a través del eclass toolchain), así que ya no es necesario que los usuarios ejecuten esta orden.

La razón por la cual necesitamos reconstruir libtool después de actualizar las versiones de gcc es debida a su función principal: libtool reúne un conjunto de herramientas que agregan código específico en un interfaz genérico permitiendo que las aplicaciones se construyan contra librerías compartidas sin tener que manejar aspectos específicos en cada plataforma de estas librerías. Para que realice su función correctamente, el guión libtool utiliza varias localizaciones en la librería con la versión de gcc previamente fijada dentro de ella.

Cambios en el ABI
Un ABI o ,Interfaz Binaria para Aplicaciones (en inglés Application Binary Interface), es un conjunto de convenciones usadas por todas las herramientas que manejan representaciones binarias de los programas, incluyendo compiladores, ensambladores, enlazadores y soporte en tiempo de ejecución (fuente: GCC Binary Compatibility). Al cambiar el ABI usado para aplicaciones binarias y librerías, existirá el riesgo de obtener errores de enlazado o programas funcionando incorrectamente si no se reconstruyen todas las librerías que usen el código C++.

Si, C++, ya que la mayoría de las incompatibilidades suceden en el ABI de C++. Si se está actualizando a GCC 4.1 o GCC 5.1 probablemente se encuentren problemas en el ABI. Por ello también se utiliza la orden revdep-rebuild contra  (desde GCC 3 hacia GCC 4.1), o  (desde GCC 4 hacia GCC 5.1).

Asi que, ¿Por qué se requiere esto para GCC hasta las versiones 3.4.0, 4.1 ó 5.1? A partir de estas versiones, GCC usa un ABI compatible a futuro, que elimina la necesidad de reconstruir las aplicaciones y librerías. Por supuesto que no se pueden dar garantía indefinidamente, pero cuando ocurra nuevamente una incompatibilidad, definitivamente la documentaremos aquí. En este caso la versión de la librería probablemente será superior.

The special case C++11 (and C++14)
While GCC (or more specifically, libstdc++) goes to great lengths to guarantee stability of the ABI, this guarantee does not extend to all parts of C++ within libstdc++. Formally, with versions starting from 3.4, GCC/libstdc++ only guarantees C++98/C++03 ABI stability and not more. This is crucial for packages that depend on C++11. GCC only makes C++11 ABI stability guarantees beginning with version 5.1. This means that switching (even minor) versions of gcc (say from 4.7.3 -> 4.7.4) might cause ABI breakage for binaries built from C++11 code.

For more information and some examples, see:


 * https://bugs.gentoo.org/show_bug.cgi?id=513386
 * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61758
 * https://blogs.gentoo.org/blueness/2015/03/10/the-c11-abi-incompatibility-problem-in-gentoo/
 * http://stackoverflow.com/a/16196475

Reconstruir todo
Algunos juran que al aparecer una nueva versión de GCC, se debe reconstruir hasta el último paquete del sistema. Por supuesto, esto no tiene sentido, ya que de todas formas hay muchas aplicaciones que no usan GCC en su proceso de construcción e instalación y por tanto nunca serían afectados por estos cambios.

Sin embargo, esto no significa que estén completamente equivocados: las versiones recientes de GCC suelen incluir soporte mejorado para los conjuntos de instrucciones de los procesadores, lo que podría influenciar el desempeño de algunas aplicaciones positivamente. Aunque se estima que estas mejoras sean generalmente marginales, en algunos casos (especialmente en aplicaciones que usan intensivamente el CPU) podrían traer mejoras notables.

Existen también casos conocidos donde un conjunto de paquetes se deben construir con el mismo compilador. Aunque la versión de estos paquetes se suele aumentar simultáneamente con el compilador (de forma que se construyan con la misma versión de GCC) el escoger selectivamente reinstalaciones de algunos de estos paquetes puede traer problemas. Los paquetes de son un ejemplo de esto.

libstdc++.so.6: version `GLIBCXX_3.4.15' not found
Durante las actualizaciones puede que obtenga un error como el siguiente:

Esto significa que está intentando construir un paquete con una versión de GCC más antigua que el usado para construir algunas de sus librerías dependientes. ¿Recuerde cuando dijimos que el ABI C++ era compatible a futuro? Esto es cierto, pero segura solamente que versiones más recientes (o iguales) de GCC se pueden utilizar para construir aplicaciones y librerías enlazadas (en comparación con la versión de GCC usada para construir esas librerías).

Para reconstruir todos los paquetes que dependen de libstdc++ se puede lanzar el siguiente guión bash.

¿Qué paquetes se sabe que deben reconstruirse?
La siguiente tabla indica los paquetes que si se instalan, se necesitarán reconstruir y el motivo por el cual necesitan reconstruirse.

Ver también

 * Actualizar GCC hasta la versión 4.1, la versión anterior a este documento.