zstd icon indicating copy to clipboard operation
zstd copied to clipboard

[meson] unresolved symbols when linking some programs

Open benoit-pierre opened this issue 11 months ago • 0 comments

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

benoit-pierre avatar Aug 22 '23 01:08 benoit-pierre