[PATCH] bpftool: Fix failure with static linkage

Leo Yan posted 1 patch 1 year ago
tools/bpf/bpftool/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
[PATCH] bpftool: Fix failure with static linkage
Posted by Leo Yan 1 year ago
When building perf with static linkage:

  make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
  ...
  LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
  /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
  (.text+0x113): undefined reference to `ZSTD_createCCtx'
  /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
  /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
  /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
  /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
  /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
  /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
  (.text+0xbfc): undefined reference to `ZSTD_decompress'
  /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
  /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
  (.text+0xd45): undefined reference to `ZSTD_decompress'
  /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
  collect2: error: ld returned 1 exit status

Building bpftool with static linkage also fails with the same errors:

  make O=/build -C tools/bpf/bpftool/ V=1

To fix the issue, explicitly link libzstd.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/bpf/bpftool/Makefile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index a4263dfb5e03..65b2671941e0 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -130,8 +130,8 @@ include $(FEATURES_DUMP)
 endif
 endif
 
-LIBS = $(LIBBPF) -lelf -lz
-LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
+LIBS = $(LIBBPF) -lelf -lz -lzstd
+LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz -lzstd
 ifeq ($(feature-libcap), 1)
 CFLAGS += -DUSE_LIBCAP
 LIBS += -lcap
-- 
2.34.1
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Stanislav Fomichev 1 year ago
On 12/04, Leo Yan wrote:
> When building perf with static linkage:
> 
>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
>   ...
>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
>   (.text+0xd45): undefined reference to `ZSTD_decompress'
>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
>   collect2: error: ld returned 1 exit status
> 
> Building bpftool with static linkage also fails with the same errors:
> 
>   make O=/build -C tools/bpf/bpftool/ V=1
> 
> To fix the issue, explicitly link libzstd.
> 
> Signed-off-by: Leo Yan <leo.yan@arm.com>
> ---
>  tools/bpf/bpftool/Makefile | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
> index a4263dfb5e03..65b2671941e0 100644
> --- a/tools/bpf/bpftool/Makefile
> +++ b/tools/bpf/bpftool/Makefile
> @@ -130,8 +130,8 @@ include $(FEATURES_DUMP)
>  endif
>  endif
>  
> -LIBS = $(LIBBPF) -lelf -lz
> -LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
> +LIBS = $(LIBBPF) -lelf -lz -lzstd
> +LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz -lzstd
>  ifeq ($(feature-libcap), 1)
>  CFLAGS += -DUSE_LIBCAP
>  LIBS += -lcap
> -- 
> 2.34.1
> 

I'm not sure we 'offically' support -static builds, but this seems to be
ok. Tangential: maybe time to switch to pkg-config for bpftool? IIRC,
there is some flag to query for static lib dependencies... Will leave
it up to Quentin.
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Namhyung Kim 1 year ago
Hi Leo,

On Wed, Dec 04, 2024 at 09:30:59PM +0000, Leo Yan wrote:
> When building perf with static linkage:
> 
>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
>   ...
>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
>   (.text+0xd45): undefined reference to `ZSTD_decompress'
>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
>   collect2: error: ld returned 1 exit status
> 
> Building bpftool with static linkage also fails with the same errors:
> 
>   make O=/build -C tools/bpf/bpftool/ V=1
> 
> To fix the issue, explicitly link libzstd.

I was about to report exactly the same. :)

> 
> Signed-off-by: Leo Yan <leo.yan@arm.com>

Tested-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung

> ---
>  tools/bpf/bpftool/Makefile | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
> index a4263dfb5e03..65b2671941e0 100644
> --- a/tools/bpf/bpftool/Makefile
> +++ b/tools/bpf/bpftool/Makefile
> @@ -130,8 +130,8 @@ include $(FEATURES_DUMP)
>  endif
>  endif
>  
> -LIBS = $(LIBBPF) -lelf -lz
> -LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
> +LIBS = $(LIBBPF) -lelf -lz -lzstd
> +LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz -lzstd
>  ifeq ($(feature-libcap), 1)
>  CFLAGS += -DUSE_LIBCAP
>  LIBS += -lcap
> -- 
> 2.34.1
>
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Quentin Monnet 1 year ago
2024-12-04 13:36 UTC-0800 ~ Namhyung Kim <namhyung@kernel.org>
> Hi Leo,
> 
> On Wed, Dec 04, 2024 at 09:30:59PM +0000, Leo Yan wrote:
>> When building perf with static linkage:
>>
>>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
>>   ...
>>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
>>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
>>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
>>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
>>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
>>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
>>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
>>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
>>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
>>   (.text+0xd45): undefined reference to `ZSTD_decompress'
>>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
>>   collect2: error: ld returned 1 exit status
>>
>> Building bpftool with static linkage also fails with the same errors:
>>
>>   make O=/build -C tools/bpf/bpftool/ V=1
>>
>> To fix the issue, explicitly link libzstd.
> 
> I was about to report exactly the same. :)

Thank you both. This has been reported before [0] but I didn't find the
time to look into a proper fix.

The tricky part is that static linkage works well without libzstd for
older versions of elfutils [1], but newer versions now require this
library. Which means that we don't want to link against libzstd
unconditionally, or users trying to build bpftool may have to install
unnecessary dependencies. Instead we should add a new probe under
tools/build/feature (Note that we already have several combinations in
there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
the best approach in terms of new combinations).

Thanks,
Quentin


[0] https://github.com/libbpf/bpftool/issues/152
[1] https://github.com/libbpf/bpftool/issues/152#issuecomment-2343131810
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Andrii Nakryiko 1 year ago
On Wed, Dec 4, 2024 at 2:08 PM Quentin Monnet <qmo@kernel.org> wrote:
>
> 2024-12-04 13:36 UTC-0800 ~ Namhyung Kim <namhyung@kernel.org>
> > Hi Leo,
> >
> > On Wed, Dec 04, 2024 at 09:30:59PM +0000, Leo Yan wrote:
> >> When building perf with static linkage:
> >>
> >>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
> >>   ...
> >>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
> >>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
> >>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
> >>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
> >>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
> >>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
> >>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
> >>   (.text+0xd45): undefined reference to `ZSTD_decompress'
> >>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
> >>   collect2: error: ld returned 1 exit status
> >>
> >> Building bpftool with static linkage also fails with the same errors:
> >>
> >>   make O=/build -C tools/bpf/bpftool/ V=1
> >>
> >> To fix the issue, explicitly link libzstd.
> >
> > I was about to report exactly the same. :)
>
> Thank you both. This has been reported before [0] but I didn't find the
> time to look into a proper fix.
>
> The tricky part is that static linkage works well without libzstd for
> older versions of elfutils [1], but newer versions now require this
> library. Which means that we don't want to link against libzstd
> unconditionally, or users trying to build bpftool may have to install
> unnecessary dependencies. Instead we should add a new probe under
> tools/build/feature (Note that we already have several combinations in
> there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
> the best approach in terms of new combinations).
>

So what's the conclusion here? Do we apply this as a fix, or someone
needs to add more feature probing?

> Thanks,
> Quentin
>
>
> [0] https://github.com/libbpf/bpftool/issues/152
> [1] https://github.com/libbpf/bpftool/issues/152#issuecomment-2343131810
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Leo Yan 1 year ago
Hi Andrii,

On Tue, Dec 10, 2024 at 10:26:22AM -0800, Andrii Nakryiko wrote:

[...]

> > The tricky part is that static linkage works well without libzstd for
> > older versions of elfutils [1], but newer versions now require this
> > library. Which means that we don't want to link against libzstd
> > unconditionally, or users trying to build bpftool may have to install
> > unnecessary dependencies. Instead we should add a new probe under
> > tools/build/feature (Note that we already have several combinations in
> > there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
> > the best approach in terms of new combinations).
> >
> 
> So what's the conclusion here? Do we apply this as a fix, or someone
> needs to add more feature probing?

I am working on a new build feature.  Based on that, it will refine for
perf build and bpftool build.  Once get ready, I will send out for
review.

Thanks,
Leo
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Namhyung Kim 1 year ago
Hello,

On Wed, Dec 04, 2024 at 10:08:15PM +0000, Quentin Monnet wrote:
> 2024-12-04 13:36 UTC-0800 ~ Namhyung Kim <namhyung@kernel.org>
> > Hi Leo,
> > 
> > On Wed, Dec 04, 2024 at 09:30:59PM +0000, Leo Yan wrote:
> >> When building perf with static linkage:
> >>
> >>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
> >>   ...
> >>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
> >>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
> >>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
> >>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
> >>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
> >>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
> >>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
> >>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
> >>   (.text+0xd45): undefined reference to `ZSTD_decompress'
> >>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
> >>   collect2: error: ld returned 1 exit status
> >>
> >> Building bpftool with static linkage also fails with the same errors:
> >>
> >>   make O=/build -C tools/bpf/bpftool/ V=1
> >>
> >> To fix the issue, explicitly link libzstd.
> > 
> > I was about to report exactly the same. :)
> 
> Thank you both. This has been reported before [0] but I didn't find the
> time to look into a proper fix.
> 
> The tricky part is that static linkage works well without libzstd for
> older versions of elfutils [1], but newer versions now require this
> library. Which means that we don't want to link against libzstd
> unconditionally, or users trying to build bpftool may have to install
> unnecessary dependencies. Instead we should add a new probe under
> tools/build/feature (Note that we already have several combinations in
> there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
> the best approach in terms of new combinations).

I think you can use pkg-config if available.

  $ pkg-config --static --libs libelf
  -lelf -lz -lzstd -pthread 

Thanks,
Namhyung

> 
> [0] https://github.com/libbpf/bpftool/issues/152
> [1] https://github.com/libbpf/bpftool/issues/152#issuecomment-2343131810
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Quentin Monnet 1 year ago
2024-12-04 14:25 UTC-0800 ~ Namhyung Kim <namhyung@kernel.org>
> Hello,
> 
> On Wed, Dec 04, 2024 at 10:08:15PM +0000, Quentin Monnet wrote:
>> 2024-12-04 13:36 UTC-0800 ~ Namhyung Kim <namhyung@kernel.org>
>>> Hi Leo,
>>>
>>> On Wed, Dec 04, 2024 at 09:30:59PM +0000, Leo Yan wrote:
>>>> When building perf with static linkage:
>>>>
>>>>   make O=/build LDFLAGS="-static" -C tools/perf VF=1 DEBUG=1
>>>>   ...
>>>>   LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool
>>>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_compress':
>>>>   (.text+0x113): undefined reference to `ZSTD_createCCtx'
>>>>   /usr/bin/ld: (.text+0x2a9): undefined reference to `ZSTD_compressStream2'
>>>>   /usr/bin/ld: (.text+0x2b4): undefined reference to `ZSTD_isError'
>>>>   /usr/bin/ld: (.text+0x2db): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: (.text+0x5a0): undefined reference to `ZSTD_compressStream2'
>>>>   /usr/bin/ld: (.text+0x5ab): undefined reference to `ZSTD_isError'
>>>>   /usr/bin/ld: (.text+0x6b9): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: (.text+0x835): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: (.text+0x86f): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: (.text+0x91b): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: (.text+0xa12): undefined reference to `ZSTD_freeCCtx'
>>>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress':
>>>>   (.text+0xbfc): undefined reference to `ZSTD_decompress'
>>>>   /usr/bin/ld: (.text+0xc04): undefined reference to `ZSTD_isError'
>>>>   /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libelf.a(elf_compress.o): in function `__libelf_decompress_elf':
>>>>   (.text+0xd45): undefined reference to `ZSTD_decompress'
>>>>   /usr/bin/ld: (.text+0xd4d): undefined reference to `ZSTD_isError'
>>>>   collect2: error: ld returned 1 exit status
>>>>
>>>> Building bpftool with static linkage also fails with the same errors:
>>>>
>>>>   make O=/build -C tools/bpf/bpftool/ V=1
>>>>
>>>> To fix the issue, explicitly link libzstd.
>>>
>>> I was about to report exactly the same. :)
>>
>> Thank you both. This has been reported before [0] but I didn't find the
>> time to look into a proper fix.
>>
>> The tricky part is that static linkage works well without libzstd for
>> older versions of elfutils [1], but newer versions now require this
>> library. Which means that we don't want to link against libzstd
>> unconditionally, or users trying to build bpftool may have to install
>> unnecessary dependencies. Instead we should add a new probe under
>> tools/build/feature (Note that we already have several combinations in
>> there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
>> the best approach in terms of new combinations).
> 
> I think you can use pkg-config if available.
> 
>   $ pkg-config --static --libs libelf
>   -lelf -lz -lzstd -pthread 
> 


That's another dependency that I'd like to avoid if I can :)

Quentin
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Leo Yan 1 year ago
On Wed, Dec 04, 2024 at 10:55:32PM +0000, Quentin Monnet wrote:

[...]

> >>> I was about to report exactly the same. :)
> >>
> >> Thank you both. This has been reported before [0] but I didn't find the
> >> time to look into a proper fix.
> >>
> >> The tricky part is that static linkage works well without libzstd for
> >> older versions of elfutils [1], but newer versions now require this
> >> library. Which means that we don't want to link against libzstd
> >> unconditionally, or users trying to build bpftool may have to install
> >> unnecessary dependencies. Instead we should add a new probe under
> >> tools/build/feature (Note that we already have several combinations in
> >> there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
> >> the best approach in terms of new combinations).
> >
> > I think you can use pkg-config if available.
> >
> >   $ pkg-config --static --libs libelf
> >   -lelf -lz -lzstd -pthread
> 
> That's another dependency that I'd like to avoid if I can :)

Seems to me, pkg-config is the right tool for doing such kind thing -
not only it is nature for local building, it is also friendly for build
system (e.g. buildroot, OpenEmbedded / Yocto).  Though I have no deep
knowledge for building.

I am a bit confused why this issue is related to build features libbfd,
libbfd-liberty, libbfd-liberty-z.  Should not the issue is related to
libelf?  build/feature has several libelf checking, maybe we can add new
one libelf-zstd?

Thanks,
Leo
Re: [PATCH] bpftool: Fix failure with static linkage
Posted by Quentin Monnet 1 year ago
2024-12-05 10:23 UTC+0000 ~ Leo Yan <leo.yan@arm.com>
> On Wed, Dec 04, 2024 at 10:55:32PM +0000, Quentin Monnet wrote:
> 
> [...]
> 
>>>>> I was about to report exactly the same. :)
>>>>
>>>> Thank you both. This has been reported before [0] but I didn't find the
>>>> time to look into a proper fix.
>>>>
>>>> The tricky part is that static linkage works well without libzstd for
>>>> older versions of elfutils [1], but newer versions now require this
>>>> library. Which means that we don't want to link against libzstd
>>>> unconditionally, or users trying to build bpftool may have to install
>>>> unnecessary dependencies. Instead we should add a new probe under
>>>> tools/build/feature (Note that we already have several combinations in
>>>> there, libbfd, libbfd-liberty, libbfd-liberty-z, and I'm not sure what's
>>>> the best approach in terms of new combinations).
>>>
>>> I think you can use pkg-config if available.
>>>
>>>   $ pkg-config --static --libs libelf
>>>   -lelf -lz -lzstd -pthread
>>
>> That's another dependency that I'd like to avoid if I can :)
> 
> Seems to me, pkg-config is the right tool for doing such kind thing -
> not only it is nature for local building, it is also friendly for build
> system (e.g. buildroot, OpenEmbedded / Yocto).  Though I have no deep
> knowledge for building.


pkg-config would be nice but is not always installed by default. We've
been handling build options without it so far, if we can fix the current
issue without struggling too much with probes I'd just as well avoid
adding a build dependency.


> I am a bit confused why this issue is related to build features libbfd,
> libbfd-liberty, libbfd-liberty-z.  Should not the issue is related to
> libelf?  build/feature has several libelf checking, maybe we can add new
> one libelf-zstd?


Apologies, I was the one getting confused. You're correct, this affects
libelf and not libbfd, and yes libelf-zstd is likely the way to go.

Thank you,
Quentin