|
From 46da4c4e090e0412cee0777f1e8b219964781da7 Mon Sep 17 00:00:00 2001
|
|
From: Eneas U de Queiroz <cotequeiroz@gmail.com>
|
|
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 <cotequeiroz@gmail.com>
|
|
---
|
|
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)
|