一、修改前
date -s "2056-10-6 16:58:00"

2056年UTC秒为2709327600 秒
二、 修改内核
1. linux-5.4/include/uapi/linux/coda.h
之前的内核是将秒的long改为改为 unsigned long,但是5.4内核这里已经改为了64位,所以这里不需要修改了

2. /include/uapi/asm-generic/posix_types.h

改为typedef __kernel_ulong_t __kernel_time_t;

3. do_settimeofday64
/opt/LinuxSDK-v1.6/T113-i_v1.0/kernel/linux-5.4/kernel/time/timekeeping.c
int do_settimeofday64(const struct timespec64 *ts)

会报错,但是注释掉运行会报异常
static inline bool timespec64_valid_settod(const struct timespec64 *ts)
在include/linux/time64.h

4. 在/kernel/linux-5.4/include/linux/ktime.h
5.4版本已经不需要修改了,被改为了64位

三、 虚拟机编译器修改
/opt/LinuxSDK-v1.6/T113-i_v1.0/out/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include/bits/typesizes.h
#define __TIME_T_TYPE __SLONGWORD_TYPE 改为__ULONGWORD_TYPE

四、 LIbc库修改
NUC972用的库版本为libc 2.18
T113使用libc2.25


1. 修改库目录下/bits/typesizes.h
//#define __TIME_T_TYPE __SLONGWORD_TYPE
#define __TIME_T_TYPE __ULONGWORD_TYPE

2. 修改glibc-2.25\time\offtime.c
34行 time_t days, rem, y; --> int64_t days, rem, y;
66行 time_t yg = y + days / 365 - (days % 365 < 0); --> int64_t yg = y + days / 365 - (days % 365 < 0);
编译:
1.环境变量
export PATH=/opt/LinuxSDK-v1.6/T113-i_v1.0/out/t113_i/tlt113-minievm-nand/longan/buildroot/host/usr/bin:$PATH
2.创建编译目录 mkdir glibc-2.25-build
3.cd mkdir glibc-2.25-build
4.配置
../glibc-2.25/configure \
--prefix=$PWD/glibc_install \
--host=arm-linux-gnueabi \
--build=x86_64-linux-gnu \
CC=arm-linux-gnueabi-gcc \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes \
libc_cv_arm_tls=yes \
libc_cv_gnu99_inline=yes \
CFLAGS="-g -O2 -U_FORTIFY_SOURCE"
5.make
6.make insatll
7.在glibc-2.25-build/glibc_install/lib 中找到libc-2.25.so
8. 在sdk编译目录下/opt/LinuxSDK-v1.6/T113-i_v1.0 执行/build.sh distclean 清除命令 然后重新编译/build.sh,在编译时用上面编译好的libc-2.25.so替换sdkout路径下的

3. 重新编译BUSYBOX
然后将busybox拷贝的/bin,,注意拷贝前先加权限。如果不重新编,FTP会有问题,连不上,CPU占用率高
五、 测试
1. 内核驱动测试


2. 应用程序测试

date -s "2056-10-6 16:58:00"

2038年UTC溢出问题修改记录-T113
https://mochen.top/archives/2038nian-utcyi-chu-wen-ti-xiu-gai-ji-lu-t113
评论