El incidente revela una limitación fundamental en el 'large code-model' de x86-64 cuando se combina con Thread-Local Storage (TLS) para binarios que superan el límite de 2GiB. Aunque el 'large code-model' está diseñado para permitir binarios de tamaño arbitrario al utilizar relocalizaciones de 64 bits para accesos a datos y código, esta capacidad no se extiende a los accesos a TLS. La causa raíz es una omisión en la especificación del ABI x86-64, que no define una secuencia de código para el 'large code-model' que utilice offsets de TLS de 64 bits directamente en las instrucciones.
El problema se manifiesta porque las instrucciones generadas por el compilador para acceder a variables TLS, incluso bajo -mcmodel=large, utilizan relocalizaciones de 32 bits (como R_X86_64_TPOFF32, R_X86_64_GOTTPOFF, R_X86_64_TLSGD). Estas relocalizaciones tienen un rango limitado de +/- 2GiB. Cuando el offset de una variable TLS desde el Thread Pointer excede este límite (por ejemplo, en un binario con gigabytes de .tbss), el enlazador falla con un error de truncamiento. Esto contrasta con el comportamiento esperado del 'large code-model', que sí sustituye las relocalizaciones de 32 bits por sus equivalentes de 64 bits para datos globales ordinarios (.bss).
Las salvaguardas existentes, como el propio 'large code-model', fallaron porque su diseño no contempló explícitamente el caso de uso de TLS en binarios masivos. No es un bug del compilador (GCC o LLVM) sino una limitación inherente al ABI. La ausencia de una secuencia de instrucciones definida que permita un offset de TLS de 64 bits directamente en el código significa que, aunque existan tipos de relocalización de 64 bits para TLS (como R_X86_64_TPOFF64), estos solo se usan para parchear slots en la GOT, y no para los inmediatos de las instrucciones de acceso directo, que siguen siendo de 32 bits. Esto crea un cuello de botella de 32 bits en la cadena de acceso a TLS, incluso en el modo 'large code-model'.