6P by xguru 2021-12-30 | favorite | 댓글 1개

- 2038-01-09 3:14:07 UTC가 지나면 32-bit time_t 가 오버플로우 됨
- 리눅스 커널은 몇년전에 내부적으로 64-bit로 교체했고, Alpine 은 3.13부터 64-bit time_t로 바꿨음
- GNU glibc 는 2.34부터 64-bit time_t를 지원하기 시작은 했지만, 접근 방식이 기술적으로 완전치 않음

- musl 이나 다른 UNIX C library 구현들은 새 코드에서 time_t가 항상 64-bit이고, 기존 32-bit 코드에 대한 호환성 스텁들이 제공
ㅤ→ 시간이 지나면서 자동으로 Y2038 호환이 되게 되어있음

- Microsoft 는 msvcrt 에서 한걸음 더 나아가 기본으로 64-bit time_t를 사용하고, _USE_32BIT_TIME_T 매크로를 쓰면 예전 32-bit 함수에 접근 가능

- GNU glibc 는 정확히 위 두가지의 반대 방식을 취함
ㅤ→ 명시적으로 -D_TIME_BITS=64 로 요청해야 사용 가능
ㅤ→ 언젠가는 이 기본값이 바뀔수도 있겠지만, 지금까지도 전혀 하지 않음
ㅤㅤ⇨ 비슷하게 2GiB 보다 큰 파일을 처리하는데 필요한 -D_FILE_OFFSET_BITS=64 는 아직도 명시해야함
ㅤ→ 또한 32비트 시스템에서는 -D_TIME_BITS=64 를 써서 빌드하면 안됨(즉 Y2038 호환이 불가능함)

아직 16년쯤 남았습니다만, 리눅스는 오래 교체 되지 않는 장비에도 많이 들어가는 터라..