8.10. Compiladores y herramientas de desarrollo
Los objetos compartidos no reubicados y no inicializados ya no provocan fallos si dlopen
falla
Anteriormente, si la llamada dlopen
fallaba, el enlazador dinámico de glibc
no eliminaba los objetos compartidos con la marca NODELETE
antes de informar del error. En consecuencia, los objetos compartidos no reubicados y no inicializados permanecían en la imagen del proceso, resultando eventualmente en fallos de aserción o caídas. Con esta actualización, el cargador dinámico utiliza un estado NODELETE
pendiente para eliminar los objetos compartidos ante un fallo de dlopen
, antes de marcarlos como NODELETE
de forma permanente. Como resultado, el proceso no deja ningún objeto sin ubicar. Además, los fallos de enlace perezoso mientras se ejecutan los constructores y destructores ELF ahora terminan el proceso.
Las funciones SIMD avanzadas en la arquitectura ARM de 64 bits ya no se compilan mal cuando se resuelven de forma perezosa
Anteriormente, el nuevo estándar de llamadas a procedimientos vectoriales (PCS) para la SIMD avanzada no guardaba y restauraba correctamente ciertos registros guardados en la calle al resolver perezosamente funciones de la SIMD avanzada. Como consecuencia, los binarios podían comportarse mal en tiempo de ejecución. Con esta actualización, las funciones vectoriales de SIMD avanzada y SVE en la tabla de símbolos se marcan con .variant_pcs
y, como resultado, el enlazador dinámico enlazará dichas funciones antes.
El script envolvente de sudo
ahora analiza las opciones
Anteriormente, el script envolvente /opt/redhat/devtoolset*/root/usr/bin/sudo
no analizaba correctamente las opciones de sudo
. Como consecuencia, algunas opciones de sudo
(por ejemplo, sudo -i
) no podían ser ejecutadas. Con esta actualización, más opciones de sudo
se analizan correctamente y, como resultado, el script envolvente de sudo
funciona más como /usr/bin/sudo
.
Se ha corregido la alineación de las variables TLS en glibc
Anteriormente, los datos alineados del almacenamiento local de hilos (TLS) podían, bajo ciertas condiciones, instanciarse sin la alineación esperada. Con esta actualización, la biblioteca de hilos POSIX libpthread
ha sido mejorada para asegurar la correcta alineación bajo cualquier condición. Como resultado, los datos TLS alineados son ahora instanciados correctamente para todos los hilos con la alineación correcta.
Las llamadas repetidas a pututxline
tras un error EINTR
o EAGAIN
ya no corrompen el archivo utmp
Cuando la función pututxline
intenta adquirir un bloqueo y no lo consigue a tiempo, la función devuelve con el código de error EINTR
o EAGAIN
. Anteriormente, en esta situación, si se volvía a llamar inmediatamente a pututxline
y se lograba obtener el bloqueo, no se utilizaba un espacio coincidente ya asignado en el archivo utmp
, sino que se añadía otra entrada en su lugar. Como consecuencia, estas entradas no utilizadas aumentaban sustancialmente el tamaño del archivo utmp
. Esta actualización corrige el problema, y ahora las entradas se añaden al archivo utmp
correctamente.
mtrace
ya no se cuelga cuando se producen fallos internos
Anteriormente, un defecto en la implementación de la herramienta mtrace
podía hacer que el rastreo de memoria se colgara. Para solucionar este problema, la implementación del rastreo de memoria de mtrace
se ha hecho más robusta para evitar el cuelgue incluso ante fallos internos. Como resultado, los usuarios pueden ahora llamar a mtrace
y ya no se cuelga, completándose en un tiempo limitado.
La función de bifurcación
evita ciertos bloqueos relacionados con el uso de pthread_atfork
Anteriormente, si un programa registraba un manejador de atfork
e invocaba a fork
desde un manejador de señales asíncronas, un defecto en el bloqueo interno dependiente de la implementación podía hacer que el programa se congelara. Con esta actualización, la implementación de fork
y sus manejadores atfork
se ajusta para evitar el bloqueo en programas de un solo hilo.
strstr
ya no devuelve coincidencias incorrectas para un patrón truncado
En algunas plataformas IBM Z (z15, antes conocida como arch13), la función strstr
no actualizaba correctamente un registro de la CPU al manejar patrones de búsqueda que cruzaban un límite de página. Como consecuencia, strstr
devolvía coincidencias incorrectas. Esta actualización corrige el problema, y como resultado, strstr
funciona como se espera en el escenario mencionado.
Se han corregido las expresiones de elipsis de fuente de C.UTF-8 en glibc
Anteriormente, un defecto en la configuración regional de origen C.UTF-8 hacía que todos los puntos de código Unicode por encima de U 10000 carecieran de pesos de cotejo. Como consecuencia, todos los puntos de código por encima de U 10000 no se cotejaban como se esperaba. Se ha corregido la configuración regional de origen C.UTF-8 y la configuración regional binaria recién compilada tiene ahora pesos de cotejo para todos los puntos de código Unicode. La configuración regional C.UTF-8 compilada es 5,3MiB mayor como resultado de esta corrección.
glibc
ya no falla cuando se llama a getpwent(
) sin llamar a setpwent()
Si su archivo /etc/nsswitch.conf
apuntaba al proveedor de contraseñas Berkeley DB(db
), podía solicitar datos usando la función getpwent
() sin llamar primero a setpwent( )
sólo una vez. Cuando se llamaba a la función endpwent
(), las siguientes llamadas a getpwent()
sin llamar primero a setpwent
() hacían que glibc
fallara porque endpwent()
no podía restablecer los internos para permitir una nueva consulta. Esta actualización soluciona el problema. Como resultado, después de terminar una consulta con endpwent()
, las siguientes llamadas a getpwent
() iniciarán una nueva consulta incluso si no se llama a setpwent()
.
ltrace
ahora puede rastrear las llamadas al sistema en los binarios reforzados
Anteriormente, ltrace
no producía ningún resultado en ciertos binarios reforzados, como los binarios del sistema, en las arquitecturas de 64 bits de AMD e Intel. Con esta actualización, ltrace
ahora puede rastrear las llamadas al sistema en los binarios reforzados.
(BZ#1655368)
El fallo JCC de Intel ya no provoca una pérdida de rendimiento significativa en el compilador GCC
Ciertas CPUs de Intel están afectadas por el error de código condicional de salto (JCC) que provoca la ejecución incorrecta de instrucciones de máquina. En consecuencia, las CPUs afectadas podrían no ejecutar los programas correctamente. La solución completa implica la actualización del microcódigo de las CPUs vulnerables, lo que puede causar una degradación del rendimiento. Esta actualización habilita una solución en el ensamblador que ayuda a reducir la pérdida de rendimiento. La solución está activada por defecto en not.
Para aplicar la solución, recompile un programa utilizando GCC con la opción de línea de comandos -Wa,-mbranches-within-32B-boundaries
. Un programa recompilado con esta opción de línea de comandos no se verá afectado por el fallo de JCC, pero la actualización del microcódigo sigue siendo necesaria para proteger completamente un sistema.
Tenga en cuenta que la aplicación de la solución aumentará el tamaño del programa y puede causar una ligera disminución del rendimiento, aunque debería ser menor de lo que habría sido sin la recompilación.
make
ya no se ralentiza al utilizar construcciones paralelas
Anteriormente, mientras se ejecutaban compilaciones paralelas, los subprocesos de make
podían dejar de responder temporalmente cuando esperaban su turno para ejecutarse. Como consecuencia, las construcciones con valores -j
altos se ralentizaban o se ejecutaban con valores -j
efectivos más bajos. Con esta actualización, la lógica de control de trabajos de make
es ahora no bloqueante. Como resultado, las compilaciones con valores -j
altos se ejecutan a la máxima velocidad -j
.
La herramienta ltrace
ahora informa correctamente de las llamadas a funciones
Debido a las mejoras en el endurecimiento de los binarios aplicadas a todos los componentes de RHEL, la herramienta ltrace
no podía detectar anteriormente las llamadas a funciones en los archivos binarios procedentes de los componentes de RHEL. Como consecuencia, la salida de ltrace
estaba vacía porque no informaba de ninguna llamada detectada cuando se utilizaba en dichos archivos binarios. Esta actualización corrige la forma en que ltrace
maneja las llamadas a funciones, lo que evita que se produzca el problema descrito.
(BZ#1618748)