From: Hans Kristian Rosbach Date: Mon, 11 Jan 2021 17:44:09 +0000 (+0100) Subject: Disallow semantic interposition in ELF shared libraries if supported by the compiler. X-Git-Tag: v2.0.0-RC1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f5890d760ffeb6a37d94e027e5eb0e1b865d607;p=thirdparty%2Fzlib-ng.git Disallow semantic interposition in ELF shared libraries if supported by the compiler. This disallows calls to our own exported functions being replaced by LD_PRELOAD, thus avoiding the potential bugs and allowing the compiler to optimize better. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ee04048..372f7f69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,6 +364,17 @@ elseif(WITH_SANITIZER STREQUAL "Memory") elseif(WITH_SANITIZER STREQUAL "Undefined") add_undefined_sanitizer() endif() + +# +# Check whether compiler supports -fno-semantic-interposition parameter +# +set(CMAKE_REQUIRED_FLAGS "-fno-semantic-interposition") +check_c_source_compiles( + "int main() { return 0; }" + HAVE_NO_INTERPOSITION +) +set(CMAKE_REQUIRED_FLAGS) + # # Check if we can hide zlib internal symbols that are linked between separate source files using hidden # @@ -936,6 +947,9 @@ if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) endif() if(UNIX) + if(HAVE_NO_INTERPOSITION) + set_target_properties(zlib PROPERTIES COMPILE_FLAGS "-fno-semantic-interposition") + endif() if(NOT APPLE) set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.map\"") diff --git a/configure b/configure index b5a44628..945f6ba9 100755 --- a/configure +++ b/configure @@ -856,6 +856,18 @@ else leave 1 fi +# Check for -fno-semantic-interposition compiler support +echo "" > test.c + cat > $test.c <> configure.log 2>&1; then + echo "Checking for -no-semantic-interposition... Yes." | tee -a configure.log + SFLAGS="$SFLAGS -fno-semantic-interposition" +else + echo "Checking for -no-semantic-interposition... No." | tee -a configure.log +fi + # see if we can hide zlib internal symbols that are linked between separate source files using hidden if test "$gcc" -eq 1; then echo >> configure.log