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