diff --git a/pkgs/development/tools/misc/elfutils/cxx-header-collision.patch b/pkgs/development/tools/misc/elfutils/cxx-header-collision.patch new file mode 100644 index 000000000000..a3442c6aa276 --- /dev/null +++ b/pkgs/development/tools/misc/elfutils/cxx-header-collision.patch @@ -0,0 +1,331 @@ +From: Tristan Ross +Date: Wed, 31 Jul 2024 04:03:03 +0000 (-0700) +Subject: Prevent binaries in src from colliding with libc++ headers +X-Git-Url: https://sourceware.org/git/?p=elfutils.git;a=commitdiff_plain;h=232b9ede92cbecabbd61291c2fc9aaf3fc61061f;hp=87a60d22299c4ba7b94cbce04a32c2abf015f98a + +Prevent binaries in src from colliding with libc++ headers + +Discovered with Nix and LLVM 17. Headers inside of libc++ can easily +collide with binaries being linked in src. This results in clang trying +to include a binary as a header. + +Fix this by removing '-I.' and '-I$(srcdir)' from AM_CPPFLAGS and +DEFAULT_INCLUDES in src/Makefile.am. + +To facilitate this config/eu.am has been refactored. New file +config/eu-common.am contains all of the old eu.am but with the +AM_CPPFLAGS definition removed. eu.am now includes eu-common.am and +contains the old AM_CPPFLAGS definition. + +eu.am functionality does not change, but src/Makefile.am can instead +include eu-common.am and define its own AM_CPPFLAGS without causing a +"multiply defined" warning during autoreconf. + +Signed-off-by: Tristan Ross +--- + +diff --git a/config/eu-common.am b/config/eu-common.am +new file mode 100644 +index 000000000..9cc7f6969 +--- /dev/null ++++ b/config/eu-common.am +@@ -0,0 +1,148 @@ ++## Common automake fragments for elfutils subdirectory makefiles. ++## ++## Copyright (C) 2010, 2014, 2016 Red Hat, Inc. ++## Copyright (C) 2023, Mark J. Wielaard ++## ++## This file is part of elfutils. ++## ++## This file is free software; you can redistribute it and/or modify ++## it under the terms of either ++## ++## * the GNU Lesser General Public License as published by the Free ++## Software Foundation; either version 3 of the License, or (at ++## your option) any later version ++## ++## or ++## ++## * the GNU General Public License as published by the Free ++## Software Foundation; either version 2 of the License, or (at ++## your option) any later version ++## ++## or both in parallel, as here. ++## ++## elfutils is distributed in the hope that it will be useful, but ++## WITHOUT ANY WARRANTY; without even the implied warranty of ++## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++## General Public License for more details. ++## ++## You should have received copies of the GNU General Public License and ++## the GNU Lesser General Public License along with this program. If ++## not, see . ++## ++ ++DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' ++ ++# Drop the 'u' flag that automake adds by default. It is incompatible ++# with deterministic archives. ++ARFLAGS = cr ++ ++# Warn about stack usage of more than 256K = 262144 bytes. ++if ADD_STACK_USAGE_WARNING ++STACK_USAGE_WARNING=-Wstack-usage=262144 ++STACK_USAGE_NO_ERROR=-Wno-error=stack-usage= ++else ++STACK_USAGE_WARNING= ++STACK_USAGE_NO_ERROR= ++endif ++ ++if SANE_LOGICAL_OP_WARNING ++LOGICAL_OP_WARNING=-Wlogical-op ++else ++LOGICAL_OP_WARNING= ++endif ++ ++if HAVE_DUPLICATED_COND_WARNING ++DUPLICATED_COND_WARNING=-Wduplicated-cond ++else ++DUPLICATED_COND_WARNING= ++endif ++ ++if HAVE_NULL_DEREFERENCE_WARNING ++NULL_DEREFERENCE_WARNING=-Wnull-dereference ++else ++NULL_DEREFERENCE_WARNING= ++endif ++ ++if HAVE_IMPLICIT_FALLTHROUGH_WARNING ++# Use strict fallthrough. Only __attribute__((fallthrough)) will prevent the ++# warning ++if HAVE_IMPLICIT_FALLTHROUGH_5_WARNING ++IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough=5 ++else ++IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough ++endif ++else ++IMPLICIT_FALLTHROUGH_WARNING= ++endif ++ ++if HAVE_TRAMPOLINES_WARNING ++TRAMPOLINES_WARNING=-Wtrampolines ++else ++TRAMPOLINES_WARNING= ++endif ++ ++if HAVE_NO_PACKED_NOT_ALIGNED_WARNING ++NO_PACKED_NOT_ALIGNED_WARNING=-Wno-packed-not-aligned ++else ++NO_PACKED_NOT_ALIGNED_WARNING= ++endif ++ ++if HAVE_USE_AFTER_FREE3_WARNING ++USE_AFTER_FREE3_WARNING=-Wuse-after-free=3 ++else ++USE_AFTER_FREE3_WARNING= ++endif ++ ++AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ ++ -Wold-style-definition -Wstrict-prototypes $(TRAMPOLINES_WARNING) \ ++ $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \ ++ $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \ ++ $(USE_AFTER_FREE3_WARNING) \ ++ $(if $($(*F)_no_Werror),,-Werror) \ ++ $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ ++ $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \ ++ $($(*F)_CFLAGS) ++ ++AM_CXXFLAGS = -std=c++11 -Wall -Wshadow \ ++ $(TRAMPOLINES_WARNING) \ ++ $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \ ++ $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \ ++ $(if $($(*F)_no_Werror),,-Werror) \ ++ $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ ++ $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \ ++ $($(*F)_CXXFLAGS) ++ ++COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) ++ ++DEFS.os = -DPIC -DSHARED ++if SYMBOL_VERSIONING ++DEFS.os += -DSYMBOL_VERSIONING ++else ++endif ++ ++%.os: %.c %.o ++if AMDEP ++ $(AM_V_CC)if $(COMPILE.os) -c -o $@ $(fpic_CFLAGS) $(DEFS.os) -MT $@ -MD -MP \ ++ -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \ ++ then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \ ++ rm -f "$(DEPDIR)/$*.Tpo"; \ ++ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++ fi ++else ++ $(AM_V_CC)$(COMPILE.os) -c -o $@ $(fpic_CFLAGS) $(DEFS.os) $< ++endif ++ ++CLEANFILES = *.gcno *.gcda ++ ++textrel_msg = echo "WARNING: TEXTREL found in '$@'" ++if FATAL_TEXTREL ++textrel_found = $(textrel_msg); exit 1 ++else ++textrel_found = $(textrel_msg) ++endif ++textrel_check = if $(READELF) -d $@ | grep -F -q TEXTREL; then $(textrel_found); fi ++ ++print-%: ++ @echo $*=$($*) +diff --git a/config/eu.am b/config/eu.am +index e6c241f9d..3aa6048aa 100644 +--- a/config/eu.am ++++ b/config/eu.am +@@ -1,4 +1,5 @@ +-## Common automake fragments for elfutils subdirectory makefiles. ++## Common automake fragments for elfutils subdirectory makefiles ++## with AM_CPPFLAGS set. + ## + ## Copyright (C) 2010, 2014, 2016 Red Hat, Inc. + ## Copyright (C) 2023, Mark J. Wielaard +@@ -30,120 +31,5 @@ + ## not, see . + ## + +-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' + AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. +- +-# Drop the 'u' flag that automake adds by default. It is incompatible +-# with deterministic archives. +-ARFLAGS = cr +- +-# Warn about stack usage of more than 256K = 262144 bytes. +-if ADD_STACK_USAGE_WARNING +-STACK_USAGE_WARNING=-Wstack-usage=262144 +-STACK_USAGE_NO_ERROR=-Wno-error=stack-usage= +-else +-STACK_USAGE_WARNING= +-STACK_USAGE_NO_ERROR= +-endif +- +-if SANE_LOGICAL_OP_WARNING +-LOGICAL_OP_WARNING=-Wlogical-op +-else +-LOGICAL_OP_WARNING= +-endif +- +-if HAVE_DUPLICATED_COND_WARNING +-DUPLICATED_COND_WARNING=-Wduplicated-cond +-else +-DUPLICATED_COND_WARNING= +-endif +- +-if HAVE_NULL_DEREFERENCE_WARNING +-NULL_DEREFERENCE_WARNING=-Wnull-dereference +-else +-NULL_DEREFERENCE_WARNING= +-endif +- +-if HAVE_IMPLICIT_FALLTHROUGH_WARNING +-# Use strict fallthrough. Only __attribute__((fallthrough)) will prevent the +-# warning +-if HAVE_IMPLICIT_FALLTHROUGH_5_WARNING +-IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough=5 +-else +-IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough +-endif +-else +-IMPLICIT_FALLTHROUGH_WARNING= +-endif +- +-if HAVE_TRAMPOLINES_WARNING +-TRAMPOLINES_WARNING=-Wtrampolines +-else +-TRAMPOLINES_WARNING= +-endif +- +-if HAVE_NO_PACKED_NOT_ALIGNED_WARNING +-NO_PACKED_NOT_ALIGNED_WARNING=-Wno-packed-not-aligned +-else +-NO_PACKED_NOT_ALIGNED_WARNING= +-endif +- +-if HAVE_USE_AFTER_FREE3_WARNING +-USE_AFTER_FREE3_WARNING=-Wuse-after-free=3 +-else +-USE_AFTER_FREE3_WARNING= +-endif +- +-AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ +- -Wold-style-definition -Wstrict-prototypes $(TRAMPOLINES_WARNING) \ +- $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \ +- $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \ +- $(USE_AFTER_FREE3_WARNING) \ +- $(if $($(*F)_no_Werror),,-Werror) \ +- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \ +- $($(*F)_CFLAGS) +- +-AM_CXXFLAGS = -std=c++11 -Wall -Wshadow \ +- $(TRAMPOLINES_WARNING) \ +- $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \ +- $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \ +- $(if $($(*F)_no_Werror),,-Werror) \ +- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \ +- $($(*F)_CXXFLAGS) +- +-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +- +-DEFS.os = -DPIC -DSHARED +-if SYMBOL_VERSIONING +-DEFS.os += -DSYMBOL_VERSIONING +-else +-endif +- +-%.os: %.c %.o +-if AMDEP +- $(AM_V_CC)if $(COMPILE.os) -c -o $@ $(fpic_CFLAGS) $(DEFS.os) -MT $@ -MD -MP \ +- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \ +- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \ +- rm -f "$(DEPDIR)/$*.Tpo"; \ +- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +- fi +-else +- $(AM_V_CC)$(COMPILE.os) -c -o $@ $(fpic_CFLAGS) $(DEFS.os) $< +-endif +- +-CLEANFILES = *.gcno *.gcda +- +-textrel_msg = echo "WARNING: TEXTREL found in '$@'" +-if FATAL_TEXTREL +-textrel_found = $(textrel_msg); exit 1 +-else +-textrel_found = $(textrel_msg) +-endif +-textrel_check = if $(READELF) -d $@ | grep -F -q TEXTREL; then $(textrel_found); fi +- +-print-%: +- @echo $*=$($*) ++include $(top_srcdir)/config/eu-common.am +diff --git a/src/Makefile.am b/src/Makefile.am +index 1d592d4de..5fcebc21d 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -16,10 +16,12 @@ + ## You should have received a copy of the GNU General Public License + ## along with this program. If not, see . + ## +-include $(top_srcdir)/config/eu.am ++include $(top_srcdir)/config/eu-common.am + DEFS += $(YYDEBUG) -DDEBUGPRED=@DEBUGPRED@ \ + -DSRCDIR=\"$(shell cd $(srcdir);pwd)\" -DOBJDIR=\"$(shell pwd)\" +-AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \ ++DEFAULT_INCLUDES = -I$(top_builddir) ++AM_CPPFLAGS = -I$(top_srcdir)/lib -I.. \ ++ -I$(srcdir)/../libelf -I$(srcdir)/../libebl \ + -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \ + -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm -I../debuginfod diff --git a/pkgs/development/tools/misc/elfutils/default.nix b/pkgs/development/tools/misc/elfutils/default.nix index 78c88f3420e9..260d385e350b 100644 --- a/pkgs/development/tools/misc/elfutils/default.nix +++ b/pkgs/development/tools/misc/elfutils/default.nix @@ -2,7 +2,7 @@ , musl-obstack, m4, zlib, zstd, bzip2, bison, flex, gettext, xz, setupDebugInfoDirs , argp-standalone , enableDebuginfod ? true, sqlite, curl, libmicrohttpd, libarchive -, gitUpdater +, gitUpdater, autoreconfHook }: # TODO: Look at the hardcoded paths to kernel, modules etc. @@ -37,7 +37,10 @@ stdenv.mkDerivation rec { url = "https://git.alpinelinux.org/aports/plain/main/elfutils/musl-strndupa.patch?id=2e3d4976eeffb4704cf83e2cc3306293b7c7b2e9"; sha256 = "sha256-7daehJj1t0wPtQzTv+/Rpuqqs5Ng/EYnZzrcf2o/Lb0="; }) - ] ++ lib.optionals stdenv.hostPlatform.isMusl [ ./musl-error_h.patch ]; + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ ./musl-error_h.patch ] + # Prevent headers and binaries from colliding which results in an error. + # https://sourceware.org/pipermail/elfutils-devel/2024q3/007281.html + ++ lib.optional (stdenv.targetPlatform.useLLVM or false) ./cxx-header-collision.patch; postPatch = '' patchShebangs tests/*.sh @@ -53,7 +56,8 @@ stdenv.mkDerivation rec { # We need bzip2 in NativeInputs because otherwise we can't unpack the src, # as the host-bzip2 will be in the path. nativeBuildInputs = [ m4 bison flex gettext bzip2 ] - ++ lib.optional enableDebuginfod pkg-config; + ++ lib.optional enableDebuginfod pkg-config + ++ lib.optional (stdenv.targetPlatform.useLLVM or false) autoreconfHook; buildInputs = [ zlib zstd bzip2 xz ] ++ lib.optionals stdenv.hostPlatform.isMusl [ argp-standalone