facebook/zstd

[meson] unresolved symbols when linking some programs

Open

#3 732 ouverte le 22 août 2023

Voir sur GitHub
 (0 commentaires) (0 réactions) (0 assignés)C (27 100 stars) (2 481 forks)batch import
Portabilitybuildhelp wanted

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

Guide contributeur