facebook/zstd

[meson] unresolved symbols when linking some programs

Open

#3,732 opened on Aug 22, 2023

View on GitHub
 (0 comments) (0 reactions) (0 assignees)C (2,481 forks)batch import
Portabilitybuildhelp wanted

Repository metrics

Stars
 (27,100 stars)
PR merge metrics
 (Avg merge 50m) (2 merged PRs in 30d)

Description

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

Contributor guide