Los riesgos de la transición a time_t de 64 bits
- El uso del tipo
time_t de 32 bits puede hacer que las aplicaciones de 32 bits fallen en 2038
- Se propone como solución cambiar
time_t a un tipo de 64 bits
- Musl ya completó la transición, glibc la soporta como opción, y varias distribuciones como Debian ya la completaron
- Las distribuciones basadas en código fuente, como Gentoo, tienen más dificultades para hacer la transición
Volver a Large File Support
- Las arquitecturas de 32 bits usan en 32 bits
off_t para indicar offsets de archivos e ino_t para indicar números de inode
- Por eso no pueden abrir archivos de más de 2 GiB ni archivos cuyos números de inode superen el rango de 32 bits
- La introducción de Large File Support resolvió este problema, y en glibc sigue siendo opcional
- Para soportar time64 es necesario usar LFS
¿Qué ABI se usa?
- Hay tres sub-ABI posibles:
- El ABI original que usa tipos de 32 bits
- LFS, que usa
off_t e ino_t de 64 bits y time_t de 32 bits
- time64, que usa LFS +
time_t de 64 bits
- Las compilaciones de glibc pueden ser compatibles con las tres variantes, pero las bibliotecas que usan estos tipos en la API no son compatibles entre sí
¿Por qué un cambio de ABI es malo?
- Reemplazar tipos de 32 bits por tipos de 64 bits rompe la compatibilidad
- En el caso de las estructuras, si incluyen
time_t, la posición de los campos cambia y se pueden leer o escribir campos incorrectos
- En el caso de los parámetros de función, cambia la posición de los parámetros pasados en la pila y se pueden leer o escribir parámetros incorrectos
- Estos problemas pueden provocar errores en tiempo de ejecución y problemas de seguridad
¿Cómo se puede hacer de forma segura?
- Hay tres ideas:
- Cambiar la tupla de plataforma (
CHOST) para distinguir el nuevo ABI
- Cambiar
libdir para el nuevo ABI
- Introducir una distinción de ABI a nivel binario para evitar que se enlacen binarios que usan sub-ABI distintos
Cambio de la tupla de plataforma
- La tupla de plataforma identifica la plataforma a la que apunta la toolchain
- Para introducir el nuevo ABI, se puede cambiar el campo del proveedor o añadir una especificación ABI adicional al campo de libc
- Ejemplo:
i686-gentoo_t64-linux-gnu, i686-pc-linux-gnut64
Cambio de libdir
libdir es el nombre base del directorio donde se instalan las bibliotecas
- Para la variante time64, se cambia el valor de
libdir para instalar las bibliotecas time64 en un nuevo libdir
- Esto evita que los ejecutables time64 enlacen bibliotecas time32
- Se pueden conservar las bibliotecas existentes usando la función
preserved-libs de Portage
Garantizar la compatibilidad binaria
- No se pueden mezclar binarios que usan ABI distintos
- Se puede verificar la compatibilidad usando la clase ELF, el identificador de máquina, el campo de banderas, etc.
- También se considera añadir una nueva sección de nota ELF para distinguir sistemas time32 y time64
Aplicaciones precompiladas antiguas
- Las aplicaciones precompiladas antiguas enfrentan problemas de compatibilidad con las bibliotecas del sistema y el problema y2k38
- Los problemas de compatibilidad se pueden resolver usando una disposición multilib
- El problema y2k38 se puede resolver manipulando la hora del sistema o usando una VM
Resumen de GN⁺
- Las aplicaciones que usan
time_t de 32 bits pueden fallar después de 2038
- Es necesario migrar a
time_t de 64 bits, pero esto implica cambios de ABI y genera problemas complejos
- Cambiar la tupla de plataforma, cambiar
libdir y garantizar la compatibilidad binaria puede ofrecer una ruta de transición segura
- Las aplicaciones precompiladas antiguas también deben resolver problemas de compatibilidad por separado y el problema y2k38
1 comentarios
Comentarios en Hacker News
Gentoo carece de opciones para compilar sin instalar paquetes
time_tde 64 bits es un ejemplo ampliamente conocido de un cambio de ABICómo manejar cambios de ABI mediante versionado de
.so.soincluyen números de versióntime_tde 64 bits, se necesita un componente adicional que permita controlar el ABI heredadoCómo se manejaron
off_teino_ten Mac OS X64Debian tuvo dificultades para hacer la transición a
time_tde 64 bitsExperiencia reemplazando
time_ten sistemas Unix de 32 bits por un unsigned de 32 bitsExperiencia introduciendo
time_tde 64 bits al hacer el port de amd64 en FreeBSDtime_tde 64 bits desde el principioUn chiste en la sección "Bugs" de las páginas del manual de BSD
Opinión de que les gustaría cambiar de una distribución basada en código fuente a una no basada en código fuente como Debian
Diferencia en offsets de estructuras entre
time_tde 32 bits ytime_tde 64 bitsbrequiere alineación de 64 bits, por lo que se agrega paddingSe pensó que los alias de tipos en C permitirían cambiar más adelante, pero en la práctica no fue así
Opinión de que es mejor resolver el problema cuanto antes
time_tde 64 bits en todas las arquitecturas