From 46da4c4e090e0412cee0777f1e8b219964781da7 Mon Sep 17 00:00:00 2001 From: Eneas U de Queiroz Date: Fri, 8 Oct 2021 14:39:52 -0300 Subject: [PATCH] Avoid problems with 64-bit time_t The clock_gettime() calls are being handled by calling syscall(__NR_clock_gettime, ...), which is not portable between systems using 32-bit and 64-bit time_t. This is being done to avoid having to link agains librt. So, use the standard function, and add a test to see if we can compile a test without the library, including it otherwise. Signed-off-by: Eneas U de Queiroz --- Makefile.flags | 6 ++++++ coreutils/date.c | 6 ++---- libbb/time.c | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) --- a/Makefile.flags +++ b/Makefile.flags @@ -124,6 +124,12 @@ CFLAGS += --sysroot=$(CONFIG_SYSROOT) export SYSROOT=$(CONFIG_SYSROOT) endif +# glibc versions before 2.17 need to link with -rt to use clock_gettime +RT_NEEDED := $(shell echo 'int main(void){struct timespec tp; return clock_gettime(CLOCK_MONOTONIC, &tp);}' >rttest.c; $(CC) $(CFLAGS) -include time.h -o /dev/null rttest.c >/dev/null 2>&1 || echo "y"; rm rttest.c) +ifeq ($(RT_NEEDED),y) +LDLIBS += rt +endif + # Android has no separate crypt library # gcc-4.2.1 fails if we try to feed C source on stdin: # echo 'int main(void){return 0;}' | $(CC) $(CFLAGS) -lcrypt -o /dev/null -xc - --- a/coreutils/date.c +++ b/coreutils/date.c @@ -37,7 +37,7 @@ //config:config FEATURE_DATE_NANO //config: bool "Support %[num]N nanosecond format specifier" //config: default n -//config: depends on DATE # syscall(__NR_clock_gettime) +//config: depends on DATE # clock_gettime() //config: select PLATFORM_LINUX //config: help //config: Support %[num]N format specifier. Adds ~250 bytes of code. @@ -265,9 +265,7 @@ int date_main(int argc UNUSED_PARAM, cha #endif } else { #if ENABLE_FEATURE_DATE_NANO - /* libc has incredibly messy way of doing this, - * typically requiring -lrt. We just skip all this mess */ - syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts); + clock_gettime(CLOCK_REALTIME, &ts); #else time(&ts.tv_sec); #endif --- a/libbb/time.c +++ b/libbb/time.c @@ -243,7 +243,7 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS( * typically requiring -lrt. We just skip all this mess */ static void get_mono(struct timespec *ts) { - if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) + if (clock_gettime(CLOCK_MONOTONIC, ts)) bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); } unsigned long long FAST_FUNC monotonic_ns(void)