1
0
Fork 0
mirror of https://github.com/VSadov/Satori.git synced 2025-06-09 17:44:48 +09:00

[Android] Link native shared libraries with 16k page alignment (#104577)

Fixes: https://github.com/dotnet/runtime/issues/103360
Context: https://developer.android.com/guide/practices/page-sizes
Context: https://github.com/android/ndk/wiki/Changelog-r27#announcements

Sometime next year Google will start requiring that all the `.so`
libraries included in applications submitted to the Play Store to be
aligned to 16k page boundary (as opposed to the current one of 4k).

Make changes to cmake scripts used to build both the BCL native
libraries and the MonoVM so that the resulting shared libraries have the
correct alignment.

Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
This commit is contained in:
Marek Habersack 2024-07-16 15:19:06 +00:00 committed by GitHub
parent 6954e80401
commit 8e6df8de02
Signed by: github
GPG key ID: B5690EEEBB952194
4 changed files with 25 additions and 0 deletions

View file

@ -494,6 +494,13 @@ if(NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
if (CLR_CMAKE_TARGET_ANDROID)
# Google requires all the native libraries to be aligned to 16 bytes (for 16k memory page size)
# This applies only to 64-bit binaries
if(CLR_CMAKE_TARGET_ARCH_ARM64 OR CLR_CMAKE_TARGET_ARCH_AMD64)
add_link_options(LINKER:-z,max-page-size=16384)
endif()
endif()
string(TOLOWER "${CMAKE_BUILD_TYPE}" LOWERCASE_CMAKE_BUILD_TYPE)
if(LOWERCASE_CMAKE_BUILD_TYPE STREQUAL debug)
# Clear _FORTIFY_SOURCE=2, if set

View file

@ -240,6 +240,11 @@ The .NET Foundation licenses this file to you under the MIT license.
<LinkerArg Include="@(ExtraLinkerArg->'-Wl,%(Identity)')" />
<LinkerArg Include="@(NativeFramework->'-framework %(Identity)')" Condition="'$(_IsApplePlatform)' == 'true'" />
<LinkerArg Include="-Wl,--eh-frame-hdr" Condition="'$(_IsApplePlatform)' != 'true'" />
<!-- Google requires all the native libraries to be aligned to 16 bytes (for 16k memory page size)
This is required only for 64-bit binaries.
-->
<LinkerArg Include="-Wl,-z,max-page-size=16384" Condition=" '$(_linuxLibcFlavor)' == 'bionic' and '$(NativeLib)' == 'Shared' and ('$(_targetArchitecture)' == 'x64' or '$(_targetArchitecture)' == 'arm64')" />
</ItemGroup>
<Exec Command="clang --version" Condition="'$(_IsApplePlatform)' == 'true'" IgnoreExitCode="true" StandardOutputImportance="Low" ConsoleToMSBuild="true">

View file

@ -897,6 +897,13 @@ if(CLR_CMAKE_HOST_APPLE)
endif()
endif()
if(HOST_ANDROID)
if(HOST_AMD64 OR HOST_ARM64)
# Google requires all the native libraries to be aligned to 16 bytes (for 16k memory page size)
# This applies only to 64-bit binaries
add_link_options(LINKER:-z,max-page-size=16384)
endif()
endif()
### End of OS specific checks
include_directories("${CLR_SRC_NATIVE_DIR}")

View file

@ -337,6 +337,12 @@ public class LibraryBuilderTask : AppBuilderTask
buildOptions.CompilerArguments.Add(IsSharedLibrary ? $"-shared -o {libraryName}" : $"-o {libraryName}");
buildOptions.IncludePaths.Add(MonoRuntimeHeaders);
buildOptions.LinkerArguments.Add($"--soname={libraryName}");
// Google requires all the native libraries to be aligned to 16 bytes (for 16k memory page size)
// This is required only for 64-bit binaries.
if (string.CompareOrdinal ("android-arm64", RuntimeIdentifier) == 0 || string.CompareOrdinal ("android-x64", RuntimeIdentifier) == 0) {
buildOptions.LinkerArguments.Add($"-z,max-page-size=16384");
}
buildOptions.LinkerArguments.AddRange(linkerArgs);
buildOptions.NativeLibraryPaths.AddRange(libs);
buildOptions.Sources.AddRange(sources);