zstd
zstd copied to clipboard
[meson] unresolved symbols when linking some programs
Describe the bug
When compiling for a Linux platform with an old glibc using the meson build (default options), the zstd
and zstd-frugal
programs fail to link:
ninja: Entering directory `.b'
[1/2] Linking target build/meson/programs/zstd
FAILED: build/meson/programs/zstd
/usr/bin/ccache arm-kindlepw2-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mthumb -mfloat-abi=softfp -o build/meson/programs/zstd build/meson/programs/zstd.p/.._.._.._programs_zstdcli.c.o build/meson/programs/zstd.p/.._.._.._programs_util.c.o build/meson/programs/zstd.p/.._.._.._programs_timefn.c.o build/meson/programs/zstd.p/.._.._.._programs_fileio.c.o build/meson/programs/zstd.p/.._.._.._programs_fileio_asyncio.c.o build/meson/programs/zstd.p/.._.._.._programs_benchfn.c.o build/meson/programs/zstd.p/.._.._.._programs_benchzstd.c.o build/meson/programs/zstd.p/.._.._.._programs_datagen.c.o build/meson/programs/zstd.p/.._.._.._programs_dibio.c.o build/meson/programs/zstd.p/.._.._.._programs_zstdcli_trace.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 '-Wl,-rpath,$ORIGIN/../lib' -Wl,-rpath-link,[…]/zstd-1.5.4/.b/build/meson/lib -Wl,--start-group build/meson/lib/libzstd.so.1.5.4 build/meson/lib/libzstd_objlib.a -Wl,--end-group -pthread
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd.p/.._.._.._programs_timefn.c.o: in function `UTIL_getTime':
timefn.c:(.text+0x12): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd.p/.._.._.._programs_timefn.c.o: in function `UTIL_clockSpanMicro':
timefn.c:(.text+0x78): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd.p/.._.._.._programs_timefn.c.o: in function `UTIL_clockSpanNano':
timefn.c:(.text+0xcc): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd.p/.._.._.._programs_timefn.c.o: in function `UTIL_waitForNextTick':
timefn.c:(.text+0x114): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: timefn.c:(.text+0x136): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
[2/2] Linking target build/meson/programs/zstd-frugal
FAILED: build/meson/programs/zstd-frugal
/usr/bin/ccache arm-kindlepw2-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mthumb -mfloat-abi=softfp -o build/meson/programs/zstd-frugal build/meson/programs/zstd-frugal.p/.._.._.._programs_zstdcli.c.o build/meson/programs/zstd-frugal.p/.._.._.._programs_timefn.c.o build/meson/programs/zstd-frugal.p/.._.._.._programs_util.c.o build/meson/programs/zstd-frugal.p/.._.._.._programs_fileio.c.o build/meson/programs/zstd-frugal.p/.._.._.._programs_fileio_asyncio.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 '-Wl,-rpath,$ORIGIN/../lib' -Wl,-rpath-link,[…]/zstd-1.5.4/.b/build/meson/lib -Wl,--start-group build/meson/lib/libzstd.so.1.5.4 build/meson/lib/libzstd_objlib.a -Wl,--end-group -pthread
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd-frugal.p/.._.._.._programs_timefn.c.o: in function `UTIL_getTime':
timefn.c:(.text+0x12): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd-frugal.p/.._.._.._programs_timefn.c.o: in function `UTIL_clockSpanMicro':
timefn.c:(.text+0x78): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd-frugal.p/.._.._.._programs_timefn.c.o: in function `UTIL_clockSpanNano':
timefn.c:(.text+0xcc): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: build/meson/programs/zstd-frugal.p/.._.._.._programs_timefn.c.o: in function `UTIL_waitForNextTick':
timefn.c:(.text+0x114): undefined reference to `clock_gettime'
[…]/arm-kindlepw2-linux-gnueabi/bin/../lib/gcc/arm-kindlepw2-linux-gnueabi/11.2.0/../../../../arm-kindlepw2-linux-gnueabi/bin/ld.bfd: timefn.c:(.text+0x136): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
ninja: build stopped: cannot make progress due to previous errors.
This is because before glibc 2.17, clock_gettime
is provided by the real-time library (see manpage).
ZSTD version: 1.5.4, reproduced on 9662fe16834f62e2ae837068e853d088821243c1
Tentative patch (for the later):
build/meson/programs/meson.build | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git i/build/meson/programs/meson.build w/build/meson/programs/meson.build
index 0b5a9305..506252d6 100644
--- i/build/meson/programs/meson.build
+++ w/build/meson/programs/meson.build
@@ -21,10 +21,13 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'),
join_paths(zstd_rootdir, 'programs/dibio.c'),
join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')]
-zstd_deps = [ libzstd_internal_dep ]
+# Needed for `clock_gettime` before glibc 2.17.
+rt_dep = cc.find_library('rt', required: false)
+
+zstd_deps = [ libzstd_internal_dep, rt_dep ]
zstd_c_args = libzstd_debug_cflags
-zstd_frugal_deps = [ libzstd_internal_dep ]
+zstd_frugal_deps = [ libzstd_internal_dep, rt_dep ]
zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ]
if use_multi_thread