添加_TIME_BITS=64后仍遇Y2038问题,timestamp返回-1求解
解决Buildroot系统中
date +%s在2038年后返回-1的问题 问题分析
虽然你已添加_TIME_BITS=64宏定义,系统能设置2038年后的时间,但date +%s返回-1,说明date工具本身未以64位时间支持编译,或全局64位时间配置未完全覆盖用户空间程序。
解决步骤
1. 确认Buildroot的glibc 64位时间配置
- 进入Buildroot配置界面:
make menuconfig - 导航到
Toolchain->C library->glibc,确保Enable 64-bit time support (_TIME_BITS=64)已勾选 - 针对32位目标架构(如armhf),额外检查
Target options下的BR2_TOOLCHAIN_BUILDROOT_GLIBC_TIME_BITS_64配置项是否设为y
2. 确保coreutils(date工具所属包)启用64位时间编译
- 在Buildroot配置中进入
Package->Utils->coreutils - 确认编译参数包含
-D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64:- 若使用默认配置,可在
Build options->Target CFLAGS中全局添加上述参数,确保所有用户空间程序继承该编译宏
- 若使用默认配置,可在
3. 验证目标系统的time_t类型
在目标系统上编译运行以下测试程序,确认time_t是否为64位:
#include <stdio.h> #include <time.h> #include <stddef.h> int main() { printf("size of time_t: %zu bytes\n", sizeof(time_t)); time_t t; time(&t); printf("current time_t value: %lld\n", (long long)t); return 0; }
交叉编译时需添加-D_TIME_BITS=64参数,若输出size of time_t: 8 bytes,则系统层面64位时间支持正常,问题仅出在date工具;若为4字节,需重新检查全局编译宏配置。
4. 重新编译整个系统
修改配置后执行make clean && make,确保glibc、coreutils等所有组件都用新编译选项重新构建,避免旧目标文件残留。
5. 检查内核的64位时间支持
针对32位目标架构,需确认内核配置中CONFIG_64BIT_TIME已启用:
- 进入Buildroot的
Kernel配置界面,搜索并勾选该选项 - 重新编译内核并烧写到目标设备
内容的提问来源于stack exchange,提问作者jnafm324
相关产品推荐
相关产品推荐

