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 084f803093c3..b23b3e8ad5e4 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -171,7 +171,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 755fb78be76a..db3bc460d4c2 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
On Mon, Jun 10, 2024 at 10:54:30AM +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.
What about libebl.so? I'm curious why it's ok with dynamic build and
causing a problem with static builds.
>
> This commit checks the libdw version and only links libebl.a if it
> detects that the libdw version is older than 0.177.
Have you tested on the older versions too?
>
> 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 084f803093c3..b23b3e8ad5e4 100644
> --- a/tools/build/feature/Makefile
> +++ b/tools/build/feature/Makefile
> @@ -171,7 +171,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
I'm not sure if it's ok to change the order as libebl might depend on
later libraries like libz.
Thanks,
Namhyung
> + endif
> endif
>
> $(OUTPUT)test-dwarf.bin:
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 755fb78be76a..db3bc460d4c2 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
>
On 6/22/24 00:40, Namhyung Kim wrote:
>
> On Mon, Jun 10, 2024 at 10:54:30AM +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.
>
> What about libebl.so? I'm curious why it's ok with dynamic build and
> causing a problem with static builds.
For the new Debian / Ubuntu distros, libebl has been merged in libdw so
merged into libdw, so libebl.so doesn't exist.
'-lebl' is only included only for static building (see below code piece,
it detects '-static' in ${LDFLAGS}). This is why dynamic build has no
issue.
>> This commit checks the libdw version and only links libebl.a if it
>> detects that the libdw version is older than 0.177.
>
> Have you tested on the older versions too?
IIRC, I did test on the Debian buster (which contains the libdw version
is 0.176).
>> 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 084f803093c3..b23b3e8ad5e4 100644
>> --- a/tools/build/feature/Makefile
>> +++ b/tools/build/feature/Makefile
>> @@ -171,7 +171,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
>
> I'm not sure if it's ok to change the order as libebl might depend on
> later libraries like libz.
I confirmed that this change works on Debian Buster (Debian 10) and
Bookworm (Debian 12).
Thanks,
Leo
© 2016 - 2026 Red Hat, Inc.