facebook/zstd

[meson] unresolved symbols when linking some programs

Open

#3.732 aberto em 22 de ago. de 2023

Ver no GitHub
 (0 comments) (0 reactions) (0 assignees)C (2.481 forks)batch import
Portabilitybuildhelp wanted

Métricas do repositório

Stars
 (27.100 stars)
Métricas de merge de PR
 (Mesclagem média 50m) (2 fundiu PRs em 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

Guia do colaborador