You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:03:14