linux 我必须重新编译glibc 2.34本身才能完全支持32位硬件的64位time_t吗?

enxuqcxy  于 2023-04-20  发布在  Linux
关注(0)|答案(1)|浏览(312)

我的CPU类型是armhf,所以是32位的。我在上面运行Linux Kernel 5.4(所以它支持32位系统的64位time_t)。我针对glibc 2.34编译程序(所以time_t可以显式设置为64位而不是32位)。
现在我正在尝试让这段简单的代码(test.c)工作。

#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>

int main()
{
    int ret = 0;
    ret = lchmod ("/tmp/testme.file", 0755);
    printf("ret=%d; errno=%d, strerror=%s\n", ret, errno, strerror(errno));
    return 0;
}

(Cross-)编译如下:

arm-linux-gnueabihf-gcc -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 test.c -o test

为了测试程序,我将系统日期设置为2084-01-01(2038年以后很重要)。然后我通过运行touch /tmp/testme.file创建一个文件。这个文件的创建时间戳为2084-01-01。现在,当我运行上面的代码./test时,它给我这个错误消息:

ret=-1; errno=75, strerror=Value too large for defined data type

似乎对于定义的数据类型,值太大错误发生,因为函数lchmod(...)无法处理创建时间戳超过2038年的文件。
为什么会这样?这是一个glibc bug,还是glibc 2.34本身必须用额外的CFLAGS -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64重新编译。
当我将lchmod(...)更改为chmod(...)时,它可以工作。

dzjeubhm

dzjeubhm1#

这确实是一个glibc错误,你需要一个包含commit 118a2aee07f64d605b6668cbe195c1f44eac6be6的版本,也就是v2.36或更新版本。

相关问题