diff --git a/unix/linux/Dockerfile b/unix/linux/Dockerfile index 0e533d89..3d4baee5 100644 --- a/unix/linux/Dockerfile +++ b/unix/linux/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.10 # Disable interactive prompts on package installation ENV DEBIAN_FRONTEND noninteractive @@ -48,24 +48,10 @@ RUN apt-get update && apt-get install -y \ gcc-powerpc-linux-gnu gcc-powerpc64-linux-gnu \ gcc-powerpc64le-linux-gnu gcc-riscv64-linux-gnu \ gcc-s390x-linux-gnu gcc-sparc64-linux-gnu \ + gcc-loongarch64-linux-gnu \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -# Only for loong64, getting tools of qemu-user and gcc-cross-compiler -ENV LOONG64_BASE_URL https://github.com/loongson/build-tools/releases/download/2023.08.08 -ENV LOONG64_GCC CLFS-loongarch64-8.1-x86_64-cross-tools-gcc-glibc.tar.xz -ENV LOONG64_QEMU qemu-loongarch64 -ENV LOONG64_GCC_DOWNLOAD_URL $LOONG64_BASE_URL/$LOONG64_GCC -ENV LOONG64_QEMU_DOWNLOAD_URL $LOONG64_BASE_URL/$LOONG64_QEMU - -RUN apt-get update && apt-get install xz-utils -y && mkdir /loong64 && cd /loong64 \ - && curl -fsSL "$LOONG64_QEMU_DOWNLOAD_URL" -o /usr/bin/"$LOONG64_QEMU" \ - && chmod +x /usr/bin/"$LOONG64_QEMU" \ - && curl -fsSL "$LOONG64_GCC_DOWNLOAD_URL" -o "$LOONG64_GCC" \ - && tar xf "$LOONG64_GCC" -C /usr/local/ \ - && ln -s /usr/local/cross-tools/bin/loongarch64-unknown-linux-gnu-gcc /usr/bin/loongarch64-linux-gnu-gcc \ - && rm -rf /loong64 - # Let the scripts know they are in the docker environment ENV GOLANG_SYS_BUILD docker WORKDIR /build/unix diff --git a/unix/linux/types.go b/unix/linux/types.go index 61e82e5b..80342dd4 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -20,6 +20,21 @@ package unix #define _FILE_OFFSET_BITS 64 #define _GNU_SOURCE +// Ref: include/linux/time32.h +// +// On Linux, in order to solve the overflow problem of time_t type variables on +// 32-bit arm, mips, and powerpc in 2038, the definition of time_t is switched +// from a 32-bit field to a 64-bit field. For backward compatibility, we force +// the use of 32-bit fields. +#if defined(__ARM_EABI__) || \ + (defined(__mips__) && (_MIPS_SIM == _ABIO32)) || \ + (defined(__powerpc__) && (!defined(__powerpc64__))) +# ifdef _TIME_BITS +# undef _TIME_BITS +# endif +# define _TIME_BITS 32 +#endif + #include #include #include diff --git a/unix/mkerrors.sh b/unix/mkerrors.sh index ac54ecab..44e61936 100755 --- a/unix/mkerrors.sh +++ b/unix/mkerrors.sh @@ -158,6 +158,16 @@ includes_Linux=' #endif #define _GNU_SOURCE +// See the description in unix/linux/types.go +#if defined(__ARM_EABI__) || \ + (defined(__mips__) && (_MIPS_SIM == _ABIO32)) || \ + (defined(__powerpc__) && (!defined(__powerpc64__))) +# ifdef _TIME_BITS +# undef _TIME_BITS +# endif +# define _TIME_BITS 32 +#endif + // is broken on powerpc64, as it fails to include definitions of // these structures. We just include them copied from . #if defined(__powerpc__)