[PATCH v1 4/6] perf: build: Only link libebl.a for old libdw

Leo Yan posted 6 patches 1 year, 8 months ago
There is a newer version of this series
[PATCH v1 4/6] perf: build: Only link libebl.a for old libdw
Posted by Leo Yan 1 year, 8 months ago
Since libdw version 0.177, elfutils has merged libebl.a into libdw (see
the commit "libebl: Don't install libebl.a, libebl.h and remove backends
from spec." in the elfutils repository).

As a result, libebl.a does not exist on Debian Bullseye and newer
releases, causing static perf builds to fail on these distributions.

This commit checks the libdw version and only links libebl.a if it
detects that the libdw version is older than 0.177.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/build/feature/Makefile | 12 +++++++++++-
 tools/perf/Makefile.config   | 12 +++++++++++-
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 6f52f892f9a3..2f4cfb7b8c14 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -159,7 +159,17 @@ $(OUTPUT)test-libopencsd.bin:
 
 DWARFLIBS := -ldw
 ifeq ($(findstring -static,${LDFLAGS}),-static)
-DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
+  DWARFLIBS += -lelf -lz -llzma -lbz2
+
+  LIBDW_VERSION := $(shell $(PKG_CONFIG) --modversion libdw)
+  LIBDW_VERSION_1 := $(word 1, $(subst ., ,$(LIBDW_VERSION)))
+  LIBDW_VERSION_2 := $(word 2, $(subst ., ,$(LIBDW_VERSION)))
+
+  # Elfutils merged libebl.a into libdw.a starting from version 0.177,
+  # Link libebl.a only if libdw is older than this version.
+  ifeq ($(shell test $(LIBDW_VERSION_2) -lt 177; echo $$?),0)
+    DWARFLIBS += -lebl
+  endif
 endif
 
 $(OUTPUT)test-dwarf.bin:
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 646e5af0ed51..e8d3713b081c 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -152,7 +152,17 @@ ifdef LIBDW_DIR
 endif
 DWARFLIBS := -ldw
 ifeq ($(findstring -static,${LDFLAGS}),-static)
-  DWARFLIBS += -lelf -lebl -ldl -lz -llzma -lbz2
+  DWARFLIBS += -lelf -ldl -lz -llzma -lbz2
+
+  LIBDW_VERSION := $(shell $(PKG_CONFIG) --modversion libdw)
+  LIBDW_VERSION_1 := $(word 1, $(subst ., ,$(LIBDW_VERSION)))
+  LIBDW_VERSION_2 := $(word 2, $(subst ., ,$(LIBDW_VERSION)))
+
+  # Elfutils merged libebl.a into libdw.a starting from version 0.177,
+  # Link libebl.a only if libdw is older than this version.
+  ifeq ($(shell test $(LIBDW_VERSION_2) -lt 177; echo $$?),0)
+    DWARFLIBS += -lebl
+  endif
 endif
 FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
 FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) $(DWARFLIBS)
-- 
2.34.1
Re: [PATCH v1 4/6] perf: build: Only link libebl.a for old libdw
Posted by Namhyung Kim 1 year, 8 months ago
On Tue, Jun 04, 2024 at 10:32:21AM +0100, Leo Yan wrote:
> Since libdw version 0.177, elfutils has merged libebl.a into libdw (see
> the commit "libebl: Don't install libebl.a, libebl.h and remove backends
> from spec." in the elfutils repository).
> 
> As a result, libebl.a does not exist on Debian Bullseye and newer
> releases, causing static perf builds to fail on these distributions.
> 
> This commit checks the libdw version and only links libebl.a if it
> detects that the libdw version is older than 0.177.
> 
> Signed-off-by: Leo Yan <leo.yan@arm.com>
> ---
>  tools/build/feature/Makefile | 12 +++++++++++-
>  tools/perf/Makefile.config   | 12 +++++++++++-
>  2 files changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
> index 6f52f892f9a3..2f4cfb7b8c14 100644
> --- a/tools/build/feature/Makefile
> +++ b/tools/build/feature/Makefile
> @@ -159,7 +159,17 @@ $(OUTPUT)test-libopencsd.bin:
>  
>  DWARFLIBS := -ldw
>  ifeq ($(findstring -static,${LDFLAGS}),-static)
> -DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
> +  DWARFLIBS += -lelf -lz -llzma -lbz2
> +
> +  LIBDW_VERSION := $(shell $(PKG_CONFIG) --modversion libdw)
> +  LIBDW_VERSION_1 := $(word 1, $(subst ., ,$(LIBDW_VERSION)))
> +  LIBDW_VERSION_2 := $(word 2, $(subst ., ,$(LIBDW_VERSION)))
> +
> +  # Elfutils merged libebl.a into libdw.a starting from version 0.177,
> +  # Link libebl.a only if libdw is older than this version.
> +  ifeq ($(shell test $(LIBDW_VERSION_2) -lt 177; echo $$?),0)
> +    DWARFLIBS += -lebl
> +  endif
>  endif

Is there a better way to collect required libraries using pkg-config?
I guess that's what we want to with the pkg-config in the first place.
Maybe `pkg-config --print-requires-private libdw` ?

Thanks,
Namhyung

>  
>  $(OUTPUT)test-dwarf.bin:
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 646e5af0ed51..e8d3713b081c 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -152,7 +152,17 @@ ifdef LIBDW_DIR
>  endif
>  DWARFLIBS := -ldw
>  ifeq ($(findstring -static,${LDFLAGS}),-static)
> -  DWARFLIBS += -lelf -lebl -ldl -lz -llzma -lbz2
> +  DWARFLIBS += -lelf -ldl -lz -llzma -lbz2
> +
> +  LIBDW_VERSION := $(shell $(PKG_CONFIG) --modversion libdw)
> +  LIBDW_VERSION_1 := $(word 1, $(subst ., ,$(LIBDW_VERSION)))
> +  LIBDW_VERSION_2 := $(word 2, $(subst ., ,$(LIBDW_VERSION)))
> +
> +  # Elfutils merged libebl.a into libdw.a starting from version 0.177,
> +  # Link libebl.a only if libdw is older than this version.
> +  ifeq ($(shell test $(LIBDW_VERSION_2) -lt 177; echo $$?),0)
> +    DWARFLIBS += -lebl
> +  endif
>  endif
>  FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
>  FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) $(DWARFLIBS)
> -- 
> 2.34.1
>
Re: [PATCH v1 4/6] perf: build: Only link libebl.a for old libdw
Posted by Leo Yan 1 year, 8 months ago
On 6/6/24 18:40, Namhyung Kim wrote:

[...]

>> diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
>> index 6f52f892f9a3..2f4cfb7b8c14 100644
>> --- a/tools/build/feature/Makefile
>> +++ b/tools/build/feature/Makefile
>> @@ -159,7 +159,17 @@ $(OUTPUT)test-libopencsd.bin:
>>
>>   DWARFLIBS := -ldw
>>   ifeq ($(findstring -static,${LDFLAGS}),-static)
>> -DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
>> +  DWARFLIBS += -lelf -lz -llzma -lbz2
>> +
>> +  LIBDW_VERSION := $(shell $(PKG_CONFIG) --modversion libdw)
>> +  LIBDW_VERSION_1 := $(word 1, $(subst ., ,$(LIBDW_VERSION)))
>> +  LIBDW_VERSION_2 := $(word 2, $(subst ., ,$(LIBDW_VERSION)))
>> +
>> +  # Elfutils merged libebl.a into libdw.a starting from version 0.177,
>> +  # Link libebl.a only if libdw is older than this version.
>> +  ifeq ($(shell test $(LIBDW_VERSION_2) -lt 177; echo $$?),0)
>> +    DWARFLIBS += -lebl
>> +  endif
>>   endif
> 
> Is there a better way to collect required libraries using pkg-config?
> I guess that's what we want to with the pkg-config in the first place.
> Maybe `pkg-config --print-requires-private libdw` ?

Unfortunately, `pkg-config --print-requires-private libdw` does not work 
for the libebl.a after checked on Debian:buster.

   # pkg-config --modversion libdw
   0.176

   # pkg-config --print-requires-private libdw
   zlib
   liblzma

   # pkg-config --libs-only-l libdw
   -ldw -lelf

   # ldd /usr/lib/x86_64-linux-gnu/libdw.so
	linux-vdso.so.1 (0x00007fff733e3000)
	libelf.so.1 => /usr/lib/x86_64-linux-gnu/libelf.so.1 (0x0000702e24ec6000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x0000702e24ec1000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x0000702e24ea3000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x0000702e24e7b000)
	libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x0000702e24e68000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000702e24ca8000)
	/lib64/ld-linux-x86-64.so.2 (0x0000702e24f3e000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 
(0x0000702e24c85000)


I think libdw.pc cannot reflect the required dependencies, we still need 
to use a way liked in this patch (it is a bit ugly :) to link '-lebl'.

Thanks,
Leo