私のCPUはタイプarmhf
なので、32ビットです。私はそれで実行Linux Kernel 5.4
します(したがって、32ビットシステムで64ビットのtime_tをサポートします)。私はプログラムをコンパイルしますglibc 2.34
(したがって、time_t を明示的に 32 ビットではなく 64 ビットに設定できます)。
今、この単純なコードを機能させようとしています (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;
}
(クロス) 次のようにコンパイルします。
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
関数が 2038 年を超える作成タイムスタンプを持つファイルを処理できないため、 Value too large for defined data typeエラーが発生するようです。lchmod(...)
どうしてこれなの?これはglibcのバグですか、それとも追加の CFLAGS で再コンパイルする必要がありglibc 2.34
ます-D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
か?
に変更lchmod(...)
するchmod(...)
と動作します。