我的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(...)
时,它可以工作。
1条答案
按热度按时间dzjeubhm1#
这确实是一个glibc错误,你需要一个包含commit 118a2aee07f64d605b6668cbe195c1f44eac6be6的版本,也就是v2.36或更新版本。