Unverified Commit 429b4bdc authored by Vladimír Čunát's avatar Vladimír Čunát
Browse files

elfutils: build out of tree on libc++ (#419451)

parents 535b60b1 340cc31a
Loading
Loading
Loading
Loading
+0 −338
Original line number Diff line number Diff line
From: Tristan Ross <tristan.ross@midstall.com>
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 <tristan.ross@midstall.com>
---

diff --git a/config/eu-common.am b/config/eu-common.am
new file mode 100644
index 00000000..9cc7f696
--- /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 <mark@klomp.org>
+##
+## 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 <http://www.gnu.org/licenses/>.
+##
+
+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 0b7dab5b..3aa6048a 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 <mark@klomp.org>
@@ -30,120 +31,5 @@
 ## not, see <http://www.gnu.org/licenses/>.
 ##
 
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
-AM_CPPFLAGS = -iquote . -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 $*=$($*)
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
+include $(top_srcdir)/config/eu-common.am
diff --git a/src/Makefile.am b/src/Makefile.am
index 97a0c61a..5bb8c078 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -16,14 +16,15 @@
 ## You should have received a copy of the GNU General Public License
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ##
-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)\"
 
-DEFAULT_INCLUDES =
-AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-	    -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \
-	    -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm -I../debuginfod
+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
 
 AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw $(STACK_USAGE_NO_ERROR)
+52 −55
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@
  libmicrohttpd,
  libarchive,
  gitUpdater,
  autoreconfHook,
}:

# TODO: Look at the hardcoded paths to kernel, modules etc.
@@ -36,8 +35,7 @@ stdenv.mkDerivation rec {
    hash = "sha256-eFf0S2JPTY1CHfhRqq57FALP5rzdLYBJ8V/AfT3edjU=";
  };

  patches =
    [
  patches = [
    ./debug-info-from-env.patch
    (fetchpatch {
      name = "fix-aarch64_fregs.patch";
@@ -59,11 +57,7 @@ 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 ]
    # 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;
  ] ++ lib.optionals stdenv.hostPlatform.isMusl [ ./musl-error_h.patch ];

  postPatch =
    ''
@@ -85,16 +79,13 @@ 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 =
    [
  nativeBuildInputs = [
    m4
    bison
    flex
    gettext
    bzip2
    ]
    ++ lib.optional enableDebuginfod pkg-config
    ++ lib.optional (stdenv.targetPlatform.useLLVM or false) autoreconfHook;
  ] ++ lib.optional enableDebuginfod pkg-config;
  buildInputs =
    [
      zlib
@@ -119,8 +110,19 @@ stdenv.mkDerivation rec {

  hardeningDisable = [ "strictflexarrays3" ];

  configureFlags =
    [
  # build elfutils out-of-source-tree to avoid ./stack inclusion
  # as a c++ header on libc++: https://sourceware.org/PR33103
  preConfigure =
    if (stdenv.targetPlatform.useLLVM or false) then
      ''
        mkdir build-tree
        cd build-tree
      ''
    else
      null;
  configureScript = if (stdenv.targetPlatform.useLLVM or false) then "../configure" else null;

  configureFlags = [
    "--program-prefix=eu-" # prevent collisions with binutils
    "--enable-deterministic-archives"
    (lib.enableFeature enableDebuginfod "libdebuginfod")
@@ -129,12 +131,7 @@ stdenv.mkDerivation rec {
    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101766
    # Versioned symbols are nice to have, but we can do without.
    (lib.enableFeature (!stdenv.hostPlatform.isMicroBlaze) "symbol-versioning")
    ]
    ++ lib.optional (stdenv.targetPlatform.useLLVM or false) "--disable-demangler"
    ++ lib.optionals stdenv.cc.isClang [
      "CFLAGS=-Wno-unused-private-field"
      "CXXFLAGS=-Wno-unused-private-field"
    ];
  ] ++ lib.optional (stdenv.targetPlatform.useLLVM or false) "--disable-demangler";

  enableParallelBuilding = true;