From c0a6c60fabfb6b023f2be45f81621397686a8ea6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20S=C3=A1nchez=20L=C3=B3pez?=
<1175054+carlossanlop@users.noreply.github.com>
Date: Thu, 4 Jul 2024 12:55:21 -0700
Subject: [PATCH] Reapply "Migrate to zlib-ng, part 2: consume it in runtime
(#102403)" (#104414)
This reverts commit 5b86dca8e75627d1f5ad77f1dcffafa96e4f5049.
---
Directory.Build.props | 1 +
eng/native/configurecompiler.cmake | 9 ++-
eng/native/configureplatform.cmake | 6 ++
eng/native/functions.cmake | 4 +-
.../Microsoft.NETCore.Native.Unix.targets | 4 +-
.../Microsoft.NETCore.Native.Windows.targets | 1 +
.../Directory.Build.props | 2 +
src/mono/CMakeLists.txt | 23 +++---
src/mono/browser/browser.proj | 1 +
src/mono/browser/runtime/CMakeLists.txt | 1 +
src/mono/cmake/config.h.in | 3 -
src/mono/mono.proj | 3 +
src/mono/mono/eventpipe/test/CMakeLists.txt | 11 ++-
src/mono/mono/metadata/CMakeLists.txt | 18 ++++-
src/mono/mono/metadata/debug-mono-ppdb.c | 6 +-
src/mono/mono/mini/CMakeLists.txt | 77 +++++++++++++++----
src/mono/mono/profiler/CMakeLists.txt | 10 ++-
src/mono/mono/profiler/log.c | 6 +-
src/mono/mono/profiler/mprof-report.c | 6 +-
.../msbuild/apple/build/AppleBuild.targets | 3 +-
src/mono/wasi/runtime/CMakeLists.txt | 1 +
src/mono/wasi/wasi.proj | 1 +
src/native/external/zlib-intel.cmake | 29 -------
src/native/external/zlib-ng.cmake | 33 ++++++++
src/native/external/zlib.cmake | 41 ----------
src/native/libs/Common/pal_utilities.h | 6 +-
.../CMakeLists.txt | 60 ++++++++++-----
.../extra_libs.cmake | 15 ++--
.../System.IO.Compression.Native/pal_zlib.c | 19 +++--
.../System.IO.Compression.Native/pal_zlib.h | 18 ++---
.../zlib_allocator.h | 8 ++
.../zlib_allocator_unix.c | 11 ++-
.../zlib_allocator_win.c | 13 ++--
33 files changed, 267 insertions(+), 183 deletions(-)
delete mode 100644 src/native/external/zlib-intel.cmake
create mode 100644 src/native/external/zlib-ng.cmake
delete mode 100644 src/native/external/zlib.cmake
create mode 100644 src/native/libs/System.IO.Compression.Native/zlib_allocator.h
diff --git a/Directory.Build.props b/Directory.Build.props
index 3e494e19c3d9e..61edda987ed6d 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -324,6 +324,7 @@
true
ClrFullNativeBuild;ClrRuntimeSubset;ClrJitSubset;ClrPalTestsSubset;ClrAllJitsSubset;ClrILToolsSubset;ClrNativeAotSubset;ClrSpmiSubset;ClrCrossComponentsSubset;ClrDebugSubset;HostArchitecture;PgoInstrument;NativeOptimizationDataSupported;CMakeArgs;CxxStandardLibrary;CxxStandardLibraryStatic;CxxAbiLibrary
+ true
diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake
index 76c441de6f2f5..aedc482527300 100644
--- a/eng/native/configurecompiler.cmake
+++ b/eng/native/configurecompiler.cmake
@@ -12,6 +12,11 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
+# We need to set this to Release as there's no way to intercept configuration-specific linker flags
+# for try_compile-style tests (like check_c_source_compiles) and some of the default Debug flags
+# (ie. /INCREMENTAL) conflict with our own flags.
+set(CMAKE_TRY_COMPILE_CONFIGURATION Release)
+
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckLinkerFlag)
@@ -58,6 +63,7 @@ if (MSVC)
define_property(TARGET PROPERTY CLR_CONTROL_FLOW_GUARD INHERITED BRIEF_DOCS "Controls the /guard:cf flag presence" FULL_DOCS "Set this property to ON or OFF to indicate if the /guard:cf compiler and linker flag should be present")
define_property(TARGET PROPERTY CLR_EH_CONTINUATION INHERITED BRIEF_DOCS "Controls the /guard:ehcont flag presence" FULL_DOCS "Set this property to ON or OFF to indicate if the /guard:ehcont compiler flag should be present")
define_property(TARGET PROPERTY CLR_EH_OPTION INHERITED BRIEF_DOCS "Defines the value of the /EH option" FULL_DOCS "Set this property to one of the valid /EHxx options (/EHa, /EHsc, /EHa-, ...)")
+ define_property(TARGET PROPERTY MSVC_WARNING_LEVEL INHERITED BRIEF_DOCS "Define the warning level for the /Wn option" FULL_DOCS "Set this property to one of the valid /Wn options (/W0, /W1, /W2, /W3, /W4)")
set_property(GLOBAL PROPERTY CLR_CONTROL_FLOW_GUARD ON)
@@ -779,7 +785,8 @@ if (MSVC)
# [[! Microsoft.Security.SystemsADM.10086 !]] - SDL required warnings
# set default warning level to 4 but allow targets to override it.
- add_compile_options($<$:/W$>,$,4>>>)
+ set_property(GLOBAL PROPERTY MSVC_WARNING_LEVEL 4)
+ add_compile_options($<$:/W$>)
add_compile_options($<$:/WX>) # treat warnings as errors
add_compile_options($<$:/Oi>) # enable intrinsics
add_compile_options($<$:/Oy->) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls
diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake
index 20851f8617423..1dfc2458d11e8 100644
--- a/eng/native/configureplatform.cmake
+++ b/eng/native/configureplatform.cmake
@@ -500,3 +500,9 @@ if(LOWERCASE_CMAKE_BUILD_TYPE STREQUAL debug)
string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
endif()
+
+if (CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS OR CLR_CMAKE_HOST_ARCH_ARMV6)
+ # Our zlib-ng copy should only be used in non-mobile platforms only.
+ # In mobile platforms we should use the zlib package provided by the system.
+ set(CLR_CMAKE_USE_SYSTEM_ZLIB 1)
+endif()
diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake
index 6629e926afacf..b1cb09d662043 100644
--- a/eng/native/functions.cmake
+++ b/eng/native/functions.cmake
@@ -221,7 +221,7 @@ function(preprocess_file inputFilename outputFilename)
get_compile_definitions(PREPROCESS_DEFINITIONS)
get_include_directories(PREPROCESS_INCLUDE_DIRECTORIES)
get_source_file_property(SOURCE_FILE_DEFINITIONS ${inputFilename} COMPILE_DEFINITIONS)
-
+
foreach(DEFINITION IN LISTS SOURCE_FILE_DEFINITIONS)
list(APPEND PREPROCESS_DEFINITIONS -D${DEFINITION})
endforeach()
@@ -508,7 +508,7 @@ function(install_static_library targetName destination component)
if (WIN32)
set_target_properties(${targetName} PROPERTIES
COMPILE_PDB_NAME "${targetName}"
- COMPILE_PDB_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
+ COMPILE_PDB_OUTPUT_DIRECTORY "$"
)
install (FILES "$/${targetName}.pdb" DESTINATION ${destination} COMPONENT ${component})
endif()
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
index d3dc85e04f82e..3ff044e94d9d2 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
@@ -24,6 +24,7 @@ The .NET Foundation licenses this file to you under the MIT license.
lld
bfd
1572864
+ true
@@ -129,6 +130,7 @@ The .NET Foundation licenses this file to you under the MIT license.
+
@@ -188,7 +190,7 @@ The .NET Foundation licenses this file to you under the MIT license.
-
+
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
index 8035484bf04a5..7be88b5fde991 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
@@ -46,6 +46,7 @@ The .NET Foundation licenses this file to you under the MIT license.
+
diff --git a/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props b/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props
index 0de334e7ff211..70c526efac38c 100644
--- a/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props
+++ b/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props
@@ -277,6 +277,8 @@
+
+
diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt
index ba41fa4d9a489..fac1d9fb0e33c 100644
--- a/src/mono/CMakeLists.txt
+++ b/src/mono/CMakeLists.txt
@@ -249,7 +249,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "emscripten")
set(DISABLE_SHARED_LIBS 1)
# sys/random.h exists, but its not found
set(HAVE_SYS_RANDOM_H 1)
- set(INTERNAL_ZLIB 1)
elseif(CLR_CMAKE_HOST_OS STREQUAL "wasi")
set(HOST_WASI 1)
add_definitions(-D_WASI_EMULATED_PROCESS_CLOCKS -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -DHOST_WASI)
@@ -261,7 +260,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "wasi")
add_compile_options(-Wno-unused-but-set-variable)
set(ENABLE_PERFTRACING 0)
set(DISABLE_SHARED_LIBS 1)
- set(INTERNAL_ZLIB 1)
set(DISABLE_EXECUTABLES 1)
set(STATIC_COMPONENTS 1)
elseif(CLR_CMAKE_HOST_OS STREQUAL "windows")
@@ -270,7 +268,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "windows")
set(HOST_NO_SYMLINKS 1)
set(MONO_KEYWORD_THREAD "__declspec (thread)")
set(MONO_ZERO_LEN_ARRAY 1)
- set(INTERNAL_ZLIB 1)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") # statically link VC runtime library
add_compile_options($<$:/W4>) # set warning level 4
add_compile_options($<$:/WX>) # treat warnings as errors
@@ -511,16 +508,15 @@ if ((HOST_MACCAT AND HOST_ARM64) OR (TARGET_MACCAT AND TARGET_ARM64))
set(TARGET_APPLE_MOBILE 1)
endif()
-# Decide if we need zlib, and if so whether we want the system zlib or the in-tree copy.
+# Decide if we need zlib-ng.
if(NOT DISABLE_EMBEDDED_PDB OR NOT DISABLE_LOG_PROFILER_GZ)
- if(INTERNAL_ZLIB)
- # defines ZLIB_SOURCES
- include(${CLR_SRC_NATIVE_DIR}/external/zlib.cmake)
- else()
- # if we're not on a platform where we use the in-tree zlib, require system zlib
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB)
+ # if we're not on a platform where we use the in-tree zlib-ng, require system zlib
include(${CLR_SRC_NATIVE_DIR}/libs/System.IO.Compression.Native/extra_libs.cmake)
set(Z_LIBS)
append_extra_compression_libs(Z_LIBS)
+ else()
+ include(${CLR_SRC_NATIVE_DIR}/external/zlib-ng.cmake)
endif()
endif()
@@ -664,12 +660,17 @@ if(LLVM_PREFIX)
endif()
set(llvm_includedir "${LLVM_PREFIX}/include")
+ set(llvm_system_libs "")
if(HOST_LINUX)
# llvm-config --system-libs
- set(llvm_system_libs ${MONO_cxx_lib} "-lz" "-lrt" "-ldl" "-lpthread" "-lm")
+ list(APPEND llvm_system_libs ${MONO_cxx_lib} "-lrt" "-ldl" "-lpthread" "-lm")
elseif(HOST_OSX)
# llvm-config --system-libs
- set(llvm_system_libs "-lz" "-lm")
+ list(APPEND llvm_system_libs "-lm")
+ endif()
+
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB AND (HOST_LINUX OR HOST_OSX))
+ list(APPEND llvm_system_libs "-lz")
endif()
# llvm-config --libs analysis core bitwriter mcjit orcjit
diff --git a/src/mono/browser/browser.proj b/src/mono/browser/browser.proj
index 81768d43e6a53..47a351fb53b41 100644
--- a/src/mono/browser/browser.proj
+++ b/src/mono/browser/browser.proj
@@ -63,6 +63,7 @@
+
diff --git a/src/mono/browser/runtime/CMakeLists.txt b/src/mono/browser/runtime/CMakeLists.txt
index 8b7939330f8c3..f707431fc38d5 100644
--- a/src/mono/browser/runtime/CMakeLists.txt
+++ b/src/mono/browser/runtime/CMakeLists.txt
@@ -28,6 +28,7 @@ target_link_libraries(dotnet.native
${MONO_ARTIFACTS_DIR}/libmono-wasm-${CONFIGURATION_INTERPSIMDTABLES_LIB}.a
${MONO_ARTIFACTS_DIR}/libmono-profiler-aot.a
${MONO_ARTIFACTS_DIR}/libmono-profiler-browser.a
+ ${MONO_ARTIFACTS_DIR}/libz.a
${NATIVE_BIN_DIR}/wasm-bundled-timezones.a
${NATIVE_BIN_DIR}/libSystem.Native.a
${NATIVE_BIN_DIR}/libSystem.Globalization.Native.a
diff --git a/src/mono/cmake/config.h.in b/src/mono/cmake/config.h.in
index e972500d1cd81..8ac0c0f7c3c29 100644
--- a/src/mono/cmake/config.h.in
+++ b/src/mono/cmake/config.h.in
@@ -168,9 +168,6 @@
/* Define to 1 if you have the header file. */
#cmakedefine HAVE_UNWIND_H 1
-/* Use in-tree zlib */
-#cmakedefine INTERNAL_ZLIB 1
-
/* Define to 1 if you have the header file. */
#cmakedefine HAVE_POLL_H 1
diff --git a/src/mono/mono.proj b/src/mono/mono.proj
index 14056eb3a7e24..ceb783599086e 100644
--- a/src/mono/mono.proj
+++ b/src/mono/mono.proj
@@ -1189,6 +1189,9 @@ JS_ENGINES = [NODE_JS]
<_MonoRuntimeArtifacts Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(BuildMonoAOTCrossCompilerOnly)' != 'true'" Include="$(MonoObjDir)out\lib\libmono-wasm-nosimd.a">
$(RuntimeBinDir)libmono-wasm-nosimd.a
+ <_MonoRuntimeArtifacts Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(BuildMonoAOTCrossCompilerOnly)' != 'true'" Include="$(MonoObjDir)_deps\fetchzlibng-build\libz.a">
+ $(RuntimeBinDir)libz.a
+
<_MonoICorDebugArtifacts Condition="'$(MonoMsCorDbi)' == 'true'" Include="$(MonoObjDir)out\lib\$(LibPrefix)mscordbi$(LibSuffix)">
$(RuntimeBinDir)$(LibPrefix)mscordbi$(LibSuffix)
diff --git a/src/mono/mono/eventpipe/test/CMakeLists.txt b/src/mono/mono/eventpipe/test/CMakeLists.txt
index d313e630adaab..92ddfb3ce17f9 100644
--- a/src/mono/mono/eventpipe/test/CMakeLists.txt
+++ b/src/mono/mono/eventpipe/test/CMakeLists.txt
@@ -39,7 +39,16 @@ if(ENABLE_PERFTRACING)
set(CMAKE_SKIP_RPATH 1)
add_executable(ep-test ${EVENTPIPE_TEST_SOURCES} ${EVENTPIPE_TEST_HEADERS})
target_sources(ep-test PRIVATE "${mono-components-objects}")
- target_link_libraries(ep-test PRIVATE eglib_api monosgen-static ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS} monoapi)
+
+ set(EPTEST_LINKABLE_LIBS "")
+ list(APPEND EPTEST_LINKABLE_LIBS eglib_api monosgen-static ${OS_LIBS} ${LLVM_LIBS} monoapi)
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND EPTEST_LINKABLE_LIBS ${EPTEST_LINKABLE_LIBS} ${Z_LIBS})
+ else()
+ list(APPEND EPTEST_LINKABLE_LIBS ${EPTEST_LINKABLE_LIBS} zlib)
+ endif()
+ target_link_libraries(ep-test PRIVATE ${EPTEST_LINKABLE_LIBS})
+
install_with_stripped_symbols(ep-test TARGETS bin)
else(ENABLE_EVENTPIPE_TEST AND STATIC_COMPONENTS AND (NOT DISABLE_COMPONENTS) AND (NOT DISABLE_LIBS) AND (NOT DISABLE_EXECUTABLES))
message(VERBOSE "Skip building native EventPipe library test runner.")
diff --git a/src/mono/mono/metadata/CMakeLists.txt b/src/mono/mono/metadata/CMakeLists.txt
index 773381d6c1c9a..e3463b514d0c0 100644
--- a/src/mono/mono/metadata/CMakeLists.txt
+++ b/src/mono/mono/metadata/CMakeLists.txt
@@ -200,7 +200,14 @@ set(metadata_sources "${metadata_platform_sources};${metadata_common_sources};${
if(HOST_WIN32 AND NOT DISABLE_SHARED_LIBS)
add_library(metadata_objects_shared OBJECT ${metadata_sources})
target_compile_definitions(metadata_objects_shared PRIVATE ${metadata_compile_definitions})
- target_link_libraries(metadata_objects_shared PRIVATE monoapi eglib_api utils_objects_shared)
+
+ set(METADATAOBJECTSSHARED_LINKABLE_LIBS "")
+ list(APPEND METADATAOBJECTSSHARED_LINKABLE_LIBS monoapi eglib_api utils_objects_shared)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND METADATAOBJECTSSHARED_LINKABLE_LIBS zlib)
+ endif()
+ target_link_libraries(metadata_objects_shared PRIVATE ${METADATAOBJECTSSHARED_LINKABLE_LIBS})
+
# note: metadata_objects is an object library, so this doesn't force linking with sgen,
# it just adds the relevant include directories - which we need even with Boehm
target_link_libraries(metadata_objects_shared PRIVATE sgen_objects_shared)
@@ -212,7 +219,14 @@ endif()
add_library(metadata_objects OBJECT ${metadata_sources})
target_compile_definitions(metadata_objects PRIVATE ${metadata_compile_definitions})
-target_link_libraries(metadata_objects PRIVATE monoapi eglib_api utils_objects)
+
+set(METADATAOBJECTS_LINKABLE_LIBS "")
+list(APPEND METADATAOBJECTS_LINKABLE_LIBS monoapi eglib_api utils_objects)
+if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND METADATAOBJECTS_LINKABLE_LIBS zlib)
+endif()
+target_link_libraries(metadata_objects PRIVATE ${METADATAOBJECTS_LINKABLE_LIBS})
+
# note: metadata_objects is an object library, so this doesn't force linking with sgen,
# it just adds the relevant include directories - which we need even with Boehm
target_link_libraries(metadata_objects PRIVATE sgen_objects)
diff --git a/src/mono/mono/metadata/debug-mono-ppdb.c b/src/mono/mono/metadata/debug-mono-ppdb.c
index bcbbb4c7f2be0..3ed40e9243dad 100644
--- a/src/mono/mono/metadata/debug-mono-ppdb.c
+++ b/src/mono/mono/metadata/debug-mono-ppdb.c
@@ -30,12 +30,8 @@
#include
#ifndef DISABLE_EMBEDDED_PDB
-#ifdef INTERNAL_ZLIB
-#include
-#else
#include
-#endif
-#endif
+#endif // DISABLE_EMBEDDED_PDB
#include "debug-mono-ppdb.h"
diff --git a/src/mono/mono/mini/CMakeLists.txt b/src/mono/mono/mini/CMakeLists.txt
index 93ff6c431ef03..af9987869f5ac 100644
--- a/src/mono/mono/mini/CMakeLists.txt
+++ b/src/mono/mono/mini/CMakeLists.txt
@@ -314,10 +314,7 @@ elseif(NOT HOST_BROWSER AND NOT HOST_WASI)
set(mini_sources "${mini_sources};${VERSION_FILE_PATH}") # this is generated by GenerateNativeVersionFile in Arcade
endif()
-set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_DEFINITIONS "${ZLIB_COMPILE_DEFINITIONS}")
-set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_OPTIONS "${ZLIB_COMPILE_OPTIONS}")
-
-set(monosgen-sources "${mini_sources};${ZLIB_SOURCES}")
+set(monosgen-sources "${mini_sources}")
if(HOST_WIN32 AND NOT DISABLE_SHARED_LIBS)
add_library(monosgen-objects_shared OBJECT "${monosgen-sources}")
@@ -326,7 +323,14 @@ if(HOST_WIN32 AND NOT DISABLE_SHARED_LIBS)
endif()
add_library(monosgen-objects OBJECT "${monosgen-sources}")
-target_link_libraries (monosgen-objects PRIVATE monoapi eglib_api utils_objects sgen_objects metadata_objects)
+
+set(MONOSGEN_OBJECTS_LINKABLE_LIBS "")
+list(APPEND MONOSGEN_OBJECTS_LINKABLE_LIBS monoapi eglib_api utils_objects sgen_objects metadata_objects)
+if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND MONOSGEN_OBJECTS_LINKABLE_LIBS zlib)
+endif()
+target_link_libraries (monosgen-objects PRIVATE ${MONOSGEN_OBJECTS_LINKABLE_LIBS})
+
if(NOT HOST_WIN32)
target_compile_definitions(monosgen-objects PRIVATE -DMONO_DLL_EXPORT)
endif()
@@ -353,15 +357,23 @@ if(NOT DISABLE_SHARED_LIBS)
# musl-libc implements ucontext in a different library on s390x
if(CLR_CMAKE_TARGET_LINUX_MUSL AND TARGET_S390X)
target_link_libraries(monosgen-shared PRIVATE ucontext)
- endif(CLR_CMAKE_TARGET_LINUX_MUSL AND TARGET_S390X)
+ endif()
set_target_properties(monosgen-shared PROPERTIES OUTPUT_NAME ${MONO_SHARED_LIB_NAME})
if(MONO_SET_RPATH_ORIGIN)
set_target_properties(monosgen-shared PROPERTIES INSTALL_RPATH "$ORIGIN")
endif()
+
+ set(MONOSGENSHARED_LINKABLE_LIBS "")
+ list(APPEND MONOSGENSHARED_LINKABLE_LIBS monoapi eglib_objects dn-containers)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND MONOSGENSHARED_LINKABLE_LIBS zlib)
+ endif()
if(HOST_WIN32)
- target_link_libraries(monosgen-shared PRIVATE monoapi eglib_objects utils_objects_shared sgen_objects_shared metadata_objects_shared dn-containers)
+ list(APPEND MONOSGENSHARED_LINKABLE_LIBS utils_objects_shared sgen_objects_shared metadata_objects_shared)
+ target_link_libraries(monosgen-shared PRIVATE ${MONOSGENSHARED_LINKABLE_LIBS})
else()
- target_link_libraries(monosgen-shared PRIVATE monoapi eglib_objects utils_objects sgen_objects metadata_objects dn-containers)
+ list(APPEND MONOSGENSHARED_LINKABLE_LIBS utils_objects sgen_objects metadata_objects)
+ target_link_libraries(monosgen-shared PRIVATE ${MONOSGENSHARED_LINKABLE_LIBS})
endif()
target_include_directories (monosgen-shared PRIVATE monoapi)
if(TARGET_WIN32)
@@ -369,11 +381,16 @@ if(NOT DISABLE_SHARED_LIBS)
# to avoid a conflict we rename the import library with the .import.lib suffix
set_target_properties(monosgen-shared PROPERTIES IMPORT_SUFFIX ".import.lib")
endif()
- if(CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS)
- target_link_libraries(monosgen-shared PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS})
+
+ set(MONOSGENSHARED_LINKABLE_EXTRALIBS "")
+ list(APPEND MONOSGENSHARED_LINKABLE_EXTRALIBS ${OS_LIBS} ${LLVM_LIBS})
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND MONOSGENSHARED_LINKABLE_EXTRALIBS ${Z_LIBS})
else()
- target_link_libraries(monosgen-shared PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS})
+ list(APPEND MONOSGENSHARED_LINKABLE_EXTRALIBS zlib)
endif()
+ target_link_libraries(monosgen-shared PRIVATE ${MONOSGENSHARED_LINKABLE_EXTRALIBS})
+
if(TARGET_DARWIN)
set_property(TARGET monosgen-shared APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-compatibility_version -Wl,2.0 -Wl,-current_version -Wl,2.0")
endif()
@@ -417,8 +434,22 @@ if(NOT DISABLE_SHARED_LIBS)
endif()
add_library(${frameworkconfig} SHARED $)
target_compile_definitions(${frameworkconfig} PRIVATE -DMONO_DLL_EXPORT)
- target_link_libraries(${frameworkconfig} PRIVATE monoapi eglib_objects utils_objects sgen_objects metadata_objects dn-containers)
- target_link_libraries(${frameworkconfig} PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS})
+
+ set(FRAMEWORKCONFIG_LINKABLE_LIBS "")
+ list(APPEND FRAMEWORKCONFIG_LINKABLE_LIBS monoapi eglib_objects utils_objects sgen_objects metadata_objects dn-containers)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND FRAMEWORKCONFIG_LINKABLE_LIBS zlib)
+ endif()
+ target_link_libraries(${frameworkconfig} PRIVATE ${FRAMEWORKCONFIG_LINKABLE_LIBS})
+
+ set(FRAMEWORKCONFIG_LINKABLE_EXTRALIBS "")
+ list(APPEND FRAMEWORKCONFIG_LINKABLE_EXTRALIBS ${OS_LIBS} ${LLVM_LIBS})
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND FRAMEWORKCONFIG_LINKABLE_EXTRALIBS zlib)
+ else()
+ list(APPEND FRAMEWORKCONFIG_LINKABLE_EXTRALIBS ${Z_LIBS})
+ endif()
+ target_link_libraries(${frameworkconfig} PRIVATE ${FRAMEWORKCONFIG_LINKABLE_EXTRALIBS})
set_property(TARGET ${frameworkconfig} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-compatibility_version -Wl,2.0 -Wl,-current_version -Wl,2.0")
string(REPLACE "*" ";" componentsobjects-whitespace "${componentsobjects}")
@@ -534,11 +565,27 @@ if(NOT DISABLE_EXECUTABLES)
set_target_properties(mono-sgen PROPERTIES INSTALL_RPATH "$ORIGIN")
endif()
endif()
- target_link_libraries(mono-sgen PRIVATE monoapi eglib_api monosgen-static dn-containers)
+
+ set(MONOSGEN_LINKABLE_LIBS "")
+ list(APPEND MONOSGEN_LINKABLE_LIBS monoapi eglib_api monosgen-static dn-containers)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND MONOSGEN_LINKABLE_LIBS zlib)
+ endif()
+ target_link_libraries(mono-sgen PRIVATE ${MONOSGEN_LINKABLE_LIBS})
+
if (HOST_WASM)
target_link_libraries(mono-sgen PRIVATE mono-wasm-nosimd)
endif()
- target_link_libraries(mono-sgen PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS})
+
+ set(MONOSGEN_LINKABLE_EXTRALIBS "")
+ list(APPEND MONOSGEN_LINKABLE_EXTRALIBS ${OS_LIBS} ${LLVM_LIBS})
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB)
+ list(APPEND MONOSGEN_LINKABLE_EXTRALIBS ${Z_LIBS})
+ else()
+ list(APPEND MONOSGEN_LINKABLE_EXTRALIBS zlib)
+ endif()
+ target_link_libraries(mono-sgen PRIVATE ${MONOSGEN_LINKABLE_EXTRALIBS})
+
# musl-libc implements ucontext in a different library on s390x
if(CLR_CMAKE_TARGET_LINUX_MUSL AND TARGET_S390X)
target_link_libraries(mono-sgen PRIVATE ucontext)
diff --git a/src/mono/mono/profiler/CMakeLists.txt b/src/mono/mono/profiler/CMakeLists.txt
index 511c19dbe5a32..e172774a6ebc5 100644
--- a/src/mono/mono/profiler/CMakeLists.txt
+++ b/src/mono/mono/profiler/CMakeLists.txt
@@ -12,9 +12,7 @@ include_directories(
if(NOT DISABLE_LIBS)
if(HOST_ANDROID OR HOST_IOS OR HOST_TVOS OR HOST_S390X)
# Build the logging profiler only for certain platforms
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_DEFINITIONS "${ZLIB_COMPILE_DEFINITIONS}")
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_OPTIONS "${ZLIB_COMPILE_OPTIONS}")
- add_library(mono-profiler-log SHARED helper.c log.c log-args.c ${ZLIB_SOURCES})
+ add_library(mono-profiler-log SHARED helper.c log.c log-args.c)
target_compile_definitions(mono-profiler-log PRIVATE -DMONO_DLL_EXPORT)
target_link_libraries(mono-profiler-log PRIVATE monosgen-shared monoapi eglib_objects)
if(HOST_ANDROID)
@@ -28,7 +26,11 @@ if(NOT DISABLE_LIBS)
install(TARGETS mono-profiler-log-static LIBRARY)
if(NOT DISABLE_LOG_PROFILER_GZ)
- target_link_libraries(mono-profiler-log PRIVATE ${Z_LIBS})
+ if (CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(mono-profiler-log PRIVATE ${Z_LIBS})
+ else()
+ target_link_libraries(mono-profiler-log PRIVATE zlib)
+ endif()
endif()
endif()
diff --git a/src/mono/mono/profiler/log.c b/src/mono/mono/profiler/log.c
index 9d4304faae3ec..abe5f3f479f57 100644
--- a/src/mono/mono/profiler/log.c
+++ b/src/mono/mono/profiler/log.c
@@ -72,12 +72,8 @@
#include
#endif
#ifndef DISABLE_LOG_PROFILER_GZ
-#ifdef INTERNAL_ZLIB
-#include
-#else
#include
-#endif
-#endif
+#endif // DISABLE_LOG_PROFILER_GZ
#ifdef HOST_WIN32
#include
diff --git a/src/mono/mono/profiler/mprof-report.c b/src/mono/mono/profiler/mprof-report.c
index 35c88fe0a2fd9..5e2cc5ad7a20e 100644
--- a/src/mono/mono/profiler/mprof-report.c
+++ b/src/mono/mono/profiler/mprof-report.c
@@ -23,12 +23,8 @@
#endif
#include
#ifndef DISABLE_LOG_PROFILER_GZ
-#ifdef INTERNAL_ZLIB
-#include
-#else
#include
-#endif
-#endif
+#endif // DISABLE_LOG_PROFILER_GZ
#include
#include
#include
diff --git a/src/mono/msbuild/apple/build/AppleBuild.targets b/src/mono/msbuild/apple/build/AppleBuild.targets
index 35d0f16c35b4b..483ae04924a72 100644
--- a/src/mono/msbuild/apple/build/AppleBuild.targets
+++ b/src/mono/msbuild/apple/build/AppleBuild.targets
@@ -6,6 +6,7 @@
false
<_ProcessRuntimeComponentsForLibraryMode Condition="'$(_IsLibraryMode)' == 'true' and '$(UseNativeAOTRuntime)' != 'true'">_ProcessRuntimeComponentsForLibraryMode
false
+ true
- <_CommonLinkerArgs Include="-lz" />
+ <_CommonLinkerArgs Include="-lz" Condition="'$(UseSystemZlib)' == 'true'" />
<_CommonLinkerArgs Include="-lc++" />
<_CommonLinkerArgs Include="-liconv" />
<_CommonLinkerArgs Include="-licucore" />
diff --git a/src/mono/wasi/runtime/CMakeLists.txt b/src/mono/wasi/runtime/CMakeLists.txt
index 1d2a220494779..ec45f3aa2e488 100644
--- a/src/mono/wasi/runtime/CMakeLists.txt
+++ b/src/mono/wasi/runtime/CMakeLists.txt
@@ -27,6 +27,7 @@ target_link_libraries(dotnet
${MONO_ARTIFACTS_DIR}/libmonosgen-2.0.a
${MONO_ARTIFACTS_DIR}/libmono-icall-table.a
${MONO_ARTIFACTS_DIR}/libmono-wasm-${CONFIGURATION_INTERPSIMDTABLES_LIB}.a
+ ${MONO_ARTIFACTS_DIR}/libz.a
${NATIVE_BIN_DIR}/wasm-bundled-timezones.a
${NATIVE_BIN_DIR}/libSystem.Native.a
${NATIVE_BIN_DIR}/libSystem.Globalization.Native.a
diff --git a/src/mono/wasi/wasi.proj b/src/mono/wasi/wasi.proj
index 9c386481a26e1..99bf8a6ee54f8 100644
--- a/src/mono/wasi/wasi.proj
+++ b/src/mono/wasi/wasi.proj
@@ -49,6 +49,7 @@
+
diff --git a/src/native/external/zlib-intel.cmake b/src/native/external/zlib-intel.cmake
deleted file mode 100644
index a664f154dbef0..0000000000000
--- a/src/native/external/zlib-intel.cmake
+++ /dev/null
@@ -1,29 +0,0 @@
-# IMPORTANT: do not use add_compile_options(), add_definitions() or similar functions here since it will leak to the including projects
-
-set(ZLIB_SOURCES_BASE
- adler32.c
- compress.c
- crc_folding.c
- crc32.c
- deflate_medium.c
- deflate_quick.c
- deflate.c
- inffast.c
- inflate.c
- inftrees.c
- match.c
- slide_sse.c
- trees.c
- x86.c
- zutil.c
- ../../libs/System.IO.Compression.Native/zlib_allocator_win.c
-)
-
-addprefix(ZLIB_SOURCES "${CMAKE_CURRENT_LIST_DIR}/zlib-intel" "${ZLIB_SOURCES_BASE}")
-
-# enable custom zlib allocator
-set(ZLIB_COMPILE_DEFINITIONS "MY_ZCALLOC")
-
-if(HOST_WIN32 OR CLR_CMAKE_TARGET_WIN32)
- set(ZLIB_COMPILE_OPTIONS "/wd4127;/wd4131")
-endif()
diff --git a/src/native/external/zlib-ng.cmake b/src/native/external/zlib-ng.cmake
new file mode 100644
index 0000000000000..3f005eaa54f3d
--- /dev/null
+++ b/src/native/external/zlib-ng.cmake
@@ -0,0 +1,33 @@
+include(FetchContent)
+
+FetchContent_Declare(
+ fetchzlibng
+ SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/zlib-ng")
+
+set(ZLIB_COMPAT ON)
+set(ZLIB_ENABLE_TESTS OFF)
+set(ZLIBNG_ENABLE_TESTS OFF)
+set(Z_PREFIX ON)
+
+add_compile_options($<$:-Wno-unused-command-line-argument>) # clang : error : argument unused during compilation: '-fno-semantic-interposition'
+add_compile_options($<$:-Wno-logical-op-parentheses>) # place parentheses around the '&&' expression to silence this warning
+add_compile_options($<$:/wd4127>) # warning C4127: conditional expression is constant
+add_compile_options($<$:/wd4242>) # 'function': conversion from 'unsigned int' to 'Pos', possible loss of data, in various deflate_*.c files
+add_compile_options($<$:/wd4244>) # 'function': conversion from 'unsigned int' to 'Pos', possible loss of data, in various deflate_*.c files
+
+# 'aligned_alloc' is not available in browser/wasi, yet it is set by zlib-ng/CMakeLists.txt.
+if (CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI)
+ set(HAVE_ALIGNED_ALLOC FALSE CACHE BOOL "have aligned_alloc" FORCE)
+endif()
+
+set(BUILD_SHARED_LIBS OFF) # Shared libraries aren't supported in wasm
+set(SKIP_INSTALL_ALL ON)
+FetchContent_MakeAvailable(fetchzlibng)
+set(SKIP_INSTALL_ALL OFF)
+
+set_property(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/zlib-ng PROPERTY MSVC_WARNING_LEVEL 3) # Set the MSVC warning level for all zlib-ng targets to 3.
+target_compile_options(zlib PRIVATE $<$:-Wno-unused-command-line-argument>) # Make sure MacOS respects ignoring unused CLI arguments
+target_compile_options(zlib PRIVATE $<$:-Wno-logical-op-parentheses>) # place parentheses around the '&&' expression to silence this warning
+target_compile_options(zlib PRIVATE $<$:/guard:cf>) # Enable CFG always for zlib-ng so we don't need to build two flavors.
+
+set_target_properties(zlib PROPERTIES DEBUG_POSTFIX "") # Workaround: zlib's debug lib name is zlibd.lib
diff --git a/src/native/external/zlib.cmake b/src/native/external/zlib.cmake
deleted file mode 100644
index 498ec977960e0..0000000000000
--- a/src/native/external/zlib.cmake
+++ /dev/null
@@ -1,41 +0,0 @@
-# IMPORTANT: do not use add_compile_options(), add_definitions() or similar functions here since it will leak to the including projects
-
-set(ZLIB_SOURCES_BASE
- adler32.c
- compress.c
- crc32.c
- uncompr.c
- deflate.c
- gzguts.h
- trees.c
- zutil.c
- inflate.c
- infback.c
- inftrees.c
- inffast.c
- crc32.h
- deflate.h
- inffast.h
- inffixed.h
- inflate.h
- inftrees.h
- trees.h
- zconf.h
- zlib.h
- zutil.h
-)
-
-if(HOST_WIN32 OR CLR_CMAKE_TARGET_WIN32)
- set(ZLIB_SOURCES_BASE ${ZLIB_SOURCES_BASE} ../../libs/System.IO.Compression.Native/zlib_allocator_win.c)
-else()
- set(ZLIB_SOURCES_BASE ${ZLIB_SOURCES_BASE} ../../libs/System.IO.Compression.Native/zlib_allocator_unix.c)
-endif()
-
-addprefix(ZLIB_SOURCES "${CMAKE_CURRENT_LIST_DIR}/zlib" "${ZLIB_SOURCES_BASE}")
-
-# enable custom zlib allocator
-set(ZLIB_COMPILE_DEFINITIONS "MY_ZCALLOC")
-
-if(HOST_WIN32 OR CLR_CMAKE_TARGET_WIN32)
- set(ZLIB_COMPILE_OPTIONS "/wd4127;/wd4131")
-endif()
diff --git a/src/native/libs/Common/pal_utilities.h b/src/native/libs/Common/pal_utilities.h
index 7b5fa63b6cac0..a1a57c8ed0e8c 100644
--- a/src/native/libs/Common/pal_utilities.h
+++ b/src/native/libs/Common/pal_utilities.h
@@ -12,7 +12,9 @@
#include
#include
#include
-#include
+#ifndef _WIN32
+ #include
+#endif
#include
#include
@@ -69,6 +71,7 @@ inline static int ToFileDescriptorUnchecked(intptr_t fd)
return (int)fd;
}
+#ifndef _WIN32
/**
* Converts an intptr_t to a file descriptor.
* intptr_t is the type used to marshal file descriptors so we can use SafeHandles effectively.
@@ -86,6 +89,7 @@ static inline bool CheckInterrupted(ssize_t result)
{
return result < 0 && errno == EINTR;
}
+#endif
inline static uint32_t Int32ToUint32(int32_t value)
{
diff --git a/src/native/libs/System.IO.Compression.Native/CMakeLists.txt b/src/native/libs/System.IO.Compression.Native/CMakeLists.txt
index 089363cf5554e..69d333ae53f9c 100644
--- a/src/native/libs/System.IO.Compression.Native/CMakeLists.txt
+++ b/src/native/libs/System.IO.Compression.Native/CMakeLists.txt
@@ -2,10 +2,24 @@ project(System.IO.Compression.Native C)
include(${CMAKE_CURRENT_LIST_DIR}/extra_libs.cmake)
+if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ include(${CLR_SRC_NATIVE_DIR}/external/zlib-ng.cmake)
+endif()
+
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/../Common/pal_config.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/pal_config.h)
+
set(NATIVECOMPRESSION_SOURCES
pal_zlib.c
)
+if (HOST_WIN32 OR CLR_CMAKE_TARGET_WIN32)
+ list(APPEND NATIVECOMPRESSION_SOURCES "zlib_allocator_win.c")
+else()
+ list(APPEND NATIVECOMPRESSION_SOURCES "zlib_allocator_unix.c")
+endif()
+
if (NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI)
if (CLR_CMAKE_USE_SYSTEM_BROTLI)
@@ -29,14 +43,6 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI)
set(NATIVE_LIBS_EXTRA)
append_extra_compression_libs(NATIVE_LIBS_EXTRA)
- if (CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI)
- include(${CLR_SRC_NATIVE_DIR}/external/zlib.cmake)
- add_definitions(-DINTERNAL_ZLIB)
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_DEFINITIONS "${ZLIB_COMPILE_DEFINITIONS}")
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_OPTIONS "${ZLIB_COMPILE_OPTIONS}")
- set(NATIVECOMPRESSION_SOURCES ${ZLIB_SOURCES} ${NATIVECOMPRESSION_SOURCES})
- endif()
-
# Disable implicit fallthrough warning for Zlib and Brotli
set(FLAGS -Wno-implicit-fallthrough)
@@ -96,24 +102,16 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI)
${NATIVECOMPRESSION_SOURCES}
)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(System.IO.Compression.Native-Static PRIVATE zlibstatic)
+ endif()
+
set_target_properties(System.IO.Compression.Native-Static PROPERTIES OUTPUT_NAME System.IO.Compression.Native CLEAN_DIRECT_OUTPUT 1)
else ()
if (GEN_SHARED_LIB)
include (GenerateExportHeader)
endif ()
- if (CLR_CMAKE_HOST_ARCH_I386 OR CLR_CMAKE_HOST_ARCH_AMD64)
- include(${CLR_SRC_NATIVE_DIR}/external/zlib-intel.cmake)
- add_definitions(-DINTERNAL_ZLIB_INTEL)
- else ()
- include(${CLR_SRC_NATIVE_DIR}/external/zlib.cmake)
- endif ()
-
- add_definitions(-DINTERNAL_ZLIB)
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_DEFINITIONS "${ZLIB_COMPILE_DEFINITIONS}")
- set_source_files_properties(${ZLIB_SOURCES} PROPERTIES COMPILE_OPTIONS "${ZLIB_COMPILE_OPTIONS}")
- set(NATIVECOMPRESSION_SOURCES ${ZLIB_SOURCES} ${NATIVECOMPRESSION_SOURCES})
-
if (GEN_SHARED_LIB)
add_definitions(-DVER_FILEDESCRIPTION_STR="System.IO.Compression.Native")
add_library(System.IO.Compression.Native
@@ -122,6 +120,10 @@ else ()
System.IO.Compression.Native.def
${VERSION_FILE_RC_PATH}
)
+
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(System.IO.Compression.Native PRIVATE zlib)
+ endif()
endif ()
if (NOT GEN_SHARED_LIB AND NOT CLR_CMAKE_TARGET_MACCATALYST AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS AND NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI)
@@ -133,11 +135,20 @@ else ()
${NATIVECOMPRESSION_SOURCES}
)
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(System.IO.Compression.Native-Static PRIVATE zlibstatic)
+ endif()
+
if(STATIC_LIBS_ONLY)
add_library(System.IO.Compression.Native.Aot
STATIC
${NATIVECOMPRESSION_SOURCES}
)
+
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(System.IO.Compression.Native.Aot PRIVATE zlibstatic)
+ endif()
+
set_target_properties(System.IO.Compression.Native.Aot PROPERTIES CLR_CONTROL_FLOW_GUARD OFF)
set_target_properties(System.IO.Compression.Native.Aot PROPERTIES INTERPROCEDURAL_OPTIMIZATION OFF)
@@ -145,6 +156,11 @@ else ()
STATIC
${NATIVECOMPRESSION_SOURCES}
)
+
+ if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
+ target_link_libraries(System.IO.Compression.Native.Aot.GuardCF PRIVATE zlibstatic)
+ endif()
+
set_target_properties(System.IO.Compression.Native.Aot.GuardCF PROPERTIES INTERPROCEDURAL_OPTIMIZATION OFF)
endif()
@@ -167,4 +183,8 @@ else ()
endif ()
+if((NOT CLR_CMAKE_USE_SYSTEM_ZLIB) AND STATIC_LIBS_ONLY)
+ install_static_library(zlib aotsdk nativeaot)
+endif()
+
install (TARGETS System.IO.Compression.Native-Static DESTINATION ${STATIC_LIB_DESTINATION} COMPONENT libs)
diff --git a/src/native/libs/System.IO.Compression.Native/extra_libs.cmake b/src/native/libs/System.IO.Compression.Native/extra_libs.cmake
index 78530ae98e8ff..6ad60233fce3f 100644
--- a/src/native/libs/System.IO.Compression.Native/extra_libs.cmake
+++ b/src/native/libs/System.IO.Compression.Native/extra_libs.cmake
@@ -1,16 +1,19 @@
-
macro(append_extra_compression_libs NativeLibsExtra)
+ set(ZLIB_LIBRARIES "")
# TODO: remove the mono-style HOST_ variable checks once Mono is using eng/native/configureplatform.cmake to define the CLR_CMAKE_TARGET_ defines
if (CLR_CMAKE_TARGET_BROWSER OR HOST_BROWSER OR CLR_CMAKE_TARGET_WASI OR HOST_WASI)
# nothing special to link
elseif (CLR_CMAKE_TARGET_ANDROID OR HOST_ANDROID)
# need special case here since we want to link against libz.so but find_package() would resolve libz.a
- set(ZLIB_LIBRARIES z)
- elseif (CLR_CMAKE_TARGET_SUNOS OR HOST_SOLARIS)
- set(ZLIB_LIBRARIES z m)
- else ()
+ list(APPEND ZLIB_LIBRARIES z)
+ elseif (CLR_CMAKE_HOST_ARCH_ARMV6)
+ find_package(ZLIB REQUIRED)
+ list(APPEND ZLIB_LIBRARIES z)
+ elseif (CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS)
find_package(ZLIB REQUIRED)
- set(ZLIB_LIBRARIES ${ZLIB_LIBRARIES} m)
+ list(APPEND ZLIB_LIBRARIES m)
+ else()
+ list(APPEND ZLIB_LIBRARIES zlib)
endif ()
list(APPEND ${NativeLibsExtra} ${ZLIB_LIBRARIES})
diff --git a/src/native/libs/System.IO.Compression.Native/pal_zlib.c b/src/native/libs/System.IO.Compression.Native/pal_zlib.c
index bed37d1955f48..87b7043ea20ff 100644
--- a/src/native/libs/System.IO.Compression.Native/pal_zlib.c
+++ b/src/native/libs/System.IO.Compression.Native/pal_zlib.c
@@ -5,19 +5,14 @@
#include
#include "pal_zlib.h"
-#ifdef INTERNAL_ZLIB
- #ifdef _WIN32
- #define c_static_assert(e) static_assert((e),"")
- #endif
- #ifdef INTERNAL_ZLIB_INTEL
- #include
- #else
- #include
- #endif
+#ifdef _WIN32
+ #define c_static_assert(e) static_assert((e),"")
+ #include "../Common/pal_utilities.h"
#else
#include "pal_utilities.h"
- #include
#endif
+#include
+#include
c_static_assert(PAL_Z_NOFLUSH == Z_NO_FLUSH);
c_static_assert(PAL_Z_FINISH == Z_FINISH);
@@ -44,6 +39,10 @@ Initializes the PAL_ZStream by creating and setting its underlying z_stream.
static int32_t Init(PAL_ZStream* stream)
{
z_stream* zStream = (z_stream*)calloc(1, sizeof(z_stream));
+
+ zStream->zalloc = z_custom_calloc;
+ zStream->zfree = z_custom_cfree;
+
stream->internalState = zStream;
if (zStream != NULL)
diff --git a/src/native/libs/System.IO.Compression.Native/pal_zlib.h b/src/native/libs/System.IO.Compression.Native/pal_zlib.h
index b317091b843f6..efb090b0631ae 100644
--- a/src/native/libs/System.IO.Compression.Native/pal_zlib.h
+++ b/src/native/libs/System.IO.Compression.Native/pal_zlib.h
@@ -5,12 +5,12 @@
#include
#include
#define FUNCTIONEXPORT
- #define FUNCTIONCALLINGCONVENCTION WINAPI
+ #define FUNCTIONCALLINGCONVENTION WINAPI
#else
#include "pal_types.h"
#include "pal_compiler.h"
#define FUNCTIONEXPORT PALEXPORT
- #define FUNCTIONCALLINGCONVENCTION
+ #define FUNCTIONCALLINGCONVENTION
#endif
/*
@@ -84,7 +84,7 @@ Initializes the PAL_ZStream so the Deflate function can be invoked on it.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_DeflateInit2_(
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_DeflateInit2_(
PAL_ZStream* stream, int32_t level, int32_t method, int32_t windowBits, int32_t memLevel, int32_t strategy);
/*
@@ -93,21 +93,21 @@ compressed bytes in nextOut.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_Deflate(PAL_ZStream* stream, int32_t flush);
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_Deflate(PAL_ZStream* stream, int32_t flush);
/*
All dynamically allocated data structures for this stream are freed.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_DeflateEnd(PAL_ZStream* stream);
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_DeflateEnd(PAL_ZStream* stream);
/*
Initializes the PAL_ZStream so the Inflate function can be invoked on it.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_InflateInit2_(PAL_ZStream* stream, int32_t windowBits);
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_InflateInit2_(PAL_ZStream* stream, int32_t windowBits);
/*
Inflates (uncompresses) the bytes in the PAL_ZStream's nextIn buffer and puts the
@@ -115,14 +115,14 @@ uncompressed bytes in nextOut.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_Inflate(PAL_ZStream* stream, int32_t flush);
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_Inflate(PAL_ZStream* stream, int32_t flush);
/*
All dynamically allocated data structures for this stream are freed.
Returns a PAL_ErrorCode indicating success or an error number on failure.
*/
-FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENCTION CompressionNative_InflateEnd(PAL_ZStream* stream);
+FUNCTIONEXPORT int32_t FUNCTIONCALLINGCONVENTION CompressionNative_InflateEnd(PAL_ZStream* stream);
/*
Update a running CRC-32 with the bytes buffer[0..len-1] and return the
@@ -130,4 +130,4 @@ updated CRC-32.
Returns the updated CRC-32.
*/
-FUNCTIONEXPORT uint32_t FUNCTIONCALLINGCONVENCTION CompressionNative_Crc32(uint32_t crc, uint8_t* buffer, int32_t len);
+FUNCTIONEXPORT uint32_t FUNCTIONCALLINGCONVENTION CompressionNative_Crc32(uint32_t crc, uint8_t* buffer, int32_t len);
diff --git a/src/native/libs/System.IO.Compression.Native/zlib_allocator.h b/src/native/libs/System.IO.Compression.Native/zlib_allocator.h
new file mode 100644
index 0000000000000..cadd00bb5879c
--- /dev/null
+++ b/src/native/libs/System.IO.Compression.Native/zlib_allocator.h
@@ -0,0 +1,8 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#include // voidpf
+
+voidpf z_custom_calloc(voidpf opaque, unsigned items, unsigned size);
+
+void z_custom_cfree(voidpf opaque, voidpf ptr);
diff --git a/src/native/libs/System.IO.Compression.Native/zlib_allocator_unix.c b/src/native/libs/System.IO.Compression.Native/zlib_allocator_unix.c
index 9eb4bbf267105..b2c898f70a4e3 100644
--- a/src/native/libs/System.IO.Compression.Native/zlib_allocator_unix.c
+++ b/src/native/libs/System.IO.Compression.Native/zlib_allocator_unix.c
@@ -3,7 +3,10 @@
#include
#include
-#include
+#include
+#include
+#include
+#include
/* A custom allocator for zlib that provides some defense-in-depth over standard malloc / free.
* (non-Windows version)
@@ -70,7 +73,7 @@ static void WriteAllocCookieUnaligned(void* pDest, DOTNET_ALLOC_COOKIE vCookie)
const size_t DOTNET_ALLOC_HEADER_COOKIE_SIZE_WITH_PADDING = (sizeof(DOTNET_ALLOC_COOKIE) + MEMORY_ALLOCATION_ALIGNMENT - 1) & ~((size_t)MEMORY_ALLOCATION_ALIGNMENT - 1);
const size_t DOTNET_ALLOC_TRAILER_COOKIE_SIZE = sizeof(DOTNET_ALLOC_COOKIE);
-voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
+voidpf z_custom_calloc(opaque, items, size)
voidpf opaque;
unsigned items;
unsigned size;
@@ -79,7 +82,7 @@ voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
// If initializing a fixed-size structure, zero the memory.
bool fZeroMemory = (items == 1);
-
+
size_t cbRequested;
if (sizeof(items) + sizeof(size) <= sizeof(cbRequested))
{
@@ -119,7 +122,7 @@ static void zcfree_trash_cookie(void* pCookie)
memset(pCookie, 0, sizeof(DOTNET_ALLOC_COOKIE));
}
-void ZLIB_INTERNAL zcfree(opaque, ptr)
+void z_custom_cfree(opaque, ptr)
voidpf opaque;
voidpf ptr;
{
diff --git a/src/native/libs/System.IO.Compression.Native/zlib_allocator_win.c b/src/native/libs/System.IO.Compression.Native/zlib_allocator_win.c
index 9bdf694495e68..fefba550c16ed 100644
--- a/src/native/libs/System.IO.Compression.Native/zlib_allocator_win.c
+++ b/src/native/libs/System.IO.Compression.Native/zlib_allocator_win.c
@@ -7,11 +7,10 @@
#include
#include /* _ASSERTE */
-#ifdef INTERNAL_ZLIB_INTEL
-#include
-#else
-#include
-#endif
+#include
+#include
+#include
+#include
/* A custom allocator for zlib that provides some defense-in-depth over standard malloc / free.
* (Windows-specific version)
@@ -92,7 +91,7 @@ typedef struct _DOTNET_ALLOC_COOKIE
const SIZE_T DOTNET_ALLOC_HEADER_COOKIE_SIZE_WITH_PADDING = (sizeof(DOTNET_ALLOC_COOKIE) + MEMORY_ALLOCATION_ALIGNMENT - 1) & ~((SIZE_T)MEMORY_ALLOCATION_ALIGNMENT - 1);
const SIZE_T DOTNET_ALLOC_TRAILER_COOKIE_SIZE = sizeof(DOTNET_ALLOC_COOKIE);
-voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
+voidpf z_custom_calloc(opaque, items, size)
voidpf opaque;
unsigned items;
unsigned size;
@@ -150,7 +149,7 @@ void zcfree_cookie_check_failed()
__fastfail(FAST_FAIL_HEAP_METADATA_CORRUPTION);
}
-void ZLIB_INTERNAL zcfree(opaque, ptr)
+void z_custom_cfree(opaque, ptr)
voidpf opaque;
voidpf ptr;
{