platform_bionic/linker
Kalesh Singh 5134762efa bionic: loader: Drop readahead padding pages
These are padding pages are only needed to layout the ELF to be
compatible with max-page-size. They are zero-filled (holes) and
can be dropped from the page cache.

The madvise() here is a special case that also serves to hint to the
kernel what part of the segment is padding.

For example the kernel then shows these padding regions as PROT_NONE
VMAs (labeled [page size compat]) in /proc/*/maps.

Note: This doesn't use backing vm_area_structs, so doesn't consume
additional slab memory.

Before:

❯ cf-adb shell cat /proc/1/maps | grep -A1 'libbase.so$'
7f8d13600000-7f8d13614000 r--p 00000000 fe:09 21909460    /system/lib64/libbase.so
7f8d13614000-7f8d13638000 r-xp 00014000 fe:09 21909460    /system/lib64/libbase.so
7f8d13638000-7f8d1363c000 r--p 00038000 fe:09 21909460    /system/lib64/libbase.so
7f8d1363c000-7f8d1363d000 rw-p 0003c000 fe:09 21909460    /system/lib64/libbase.so

Segments appear extended in /proc/<pid>/maps

After:

❯ cf-adb shell cat /proc/1/maps | grep -A1 'libbase.so$'
7f3650043000-7f3650054000 r--p 00000000 fe:09 21906900    /system/lib64/libbase.so
7f3650054000-7f3650057000 ---p 00000000 00:00 0           [page size compat]
7f3650057000-7f3650079000 r-xp 00014000 fe:09 21906900    /system/lib64/libbase.so
7f3650079000-7f365007b000 ---p 00000000 00:00 0           [page size compat]
7f365007b000-7f365007c000 r--p 00038000 fe:09 21906900    /system/lib64/libbase.so
7f365007c000-7f365007f000 ---p 00000000 00:00 0           [page size compat]
7f365007f000-7f3650080000 rw-p 0003c000 fe:09 21906900    /system/lib64/libbase.so

Segments maintain PROT_NONE gaps ("[page size compat]") for app
compatiblity but these are not backed by actual slab VMA memory.

Bug: 330117029
Bug: 327600007
Bug: 330767927
Bug: 328266487
Bug: 329803029
Test: Manual - Launch Free Fire Chaos app
Change-Id: Ic50540e247b4294eb08f8cf70e74bd2bf6606684
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
2024-05-02 11:06:53 -07:00
..
arch tlsdesc_resolver.S: use L() macro for local labels. 2024-04-08 16:26:55 +00:00
testdata bionic: linker-unit-tests: Add crt_pad_segment tests 2024-02-07 16:20:48 -08:00
Android.bp Disable Android relocation packing in linker. 2024-03-27 18:38:28 -07:00
dlfcn.cpp Revert "Linker support for MTE globals." 2023-12-06 19:01:46 +00:00
ld.config.format.md linker: Cleanup for Android's inclusive language guidance 2020-07-31 11:37:28 +08:00
ld_android.cpp Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
ldd.sh Ignore LD_LIBRARY_PATH when determining file type in ldd. 2021-03-02 16:56:39 +00:00
linked_list.h Keep allocation of tail_ outside of LinkedList 2022-02-01 21:32:30 -08:00
linked_list_test.cpp Switch linker tests to Android.bp. 2019-02-15 14:40:08 -08:00
linker.arm.map Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
linker.cpp Call relocate_relr before the ifunc resolvers 2024-04-04 03:23:04 -07:00
linker.generic.map Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
linker.h Call relocate_relr before the ifunc resolvers 2024-04-04 03:23:04 -07:00
linker_auxv.cpp linker: add the L3 cache auxv constants. 2023-10-23 18:42:00 -07:00
linker_auxv.h linker: add LD_SHOW_AUXV support. 2023-08-22 14:25:01 -07:00
linker_block_allocator.cpp linker_block_alloctor: Remove 4k page size assumption 2023-08-04 23:08:34 +00:00
linker_block_allocator.h Change default block size alignment to be 4 for memory saving on 32-bit arch 2022-02-03 16:55:37 -08:00
linker_block_allocator_test.cpp Change default block size alignment to be 4 for memory saving on 32-bit arch 2022-02-03 16:55:37 -08:00
linker_cfi.cpp Remove PAGE_SIZE call sites. 2023-06-12 10:59:39 -07:00
linker_cfi.h Switch the rest of our internal headers to #pragma once. 2018-02-13 14:27:17 -08:00
linker_common_types.h Remove unused mips/mips64 code from the linker. 2020-02-13 15:58:48 -08:00
linker_config.cpp Introduce hwasan mode for linker 2023-04-14 01:33:30 -07:00
linker_config.h Introduce hwasan mode for linker 2023-04-14 01:33:30 -07:00
linker_config_test.cpp Introduce hwasan mode for linker 2023-04-14 01:33:30 -07:00
linker_crt_pad_segment_test.cpp loader: Only extend segments if kernel supports page size migration 2024-05-02 11:06:51 -07:00
linker_debug.cpp Create linker_log[_va_list] functions 2020-01-06 16:06:37 -08:00
linker_debug.h Fix bugprone-macro-parentheses warnings 2020-03-04 13:22:05 -08:00
linker_debuggerd.h Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
linker_debuggerd_android.cpp Add API to allow apps to attach extra information to tombstones. 2024-02-13 13:41:12 -08:00
linker_debuggerd_stub.cpp Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
linker_dlwarning.cpp Unify linker files under one license (BSD) 2017-02-15 15:35:33 -08:00
linker_dlwarning.h Switch the rest of our internal headers to #pragma once. 2018-02-13 14:27:17 -08:00
linker_gdb_support.cpp Unify linker files under one license (BSD) 2017-02-15 15:35:33 -08:00
linker_gdb_support.h Switch the rest of our internal headers to #pragma once. 2018-02-13 14:27:17 -08:00
linker_globals.cpp Enable BTI in bionic linker 2020-09-23 17:53:28 -07:00
linker_globals.h Hold the loader mutex in linker_main once constructors are running 2023-07-21 23:14:46 -07:00
linker_gnu_hash.h Neon-optimized version of the GNU symbol calculation 2020-01-13 13:29:25 -08:00
linker_gnu_hash_benchmark.cpp Neon-optimized version of the GNU symbol calculation 2020-01-13 13:29:25 -08:00
linker_gnu_hash_test.cpp Neon-optimized version of the GNU symbol calculation 2020-01-13 13:29:25 -08:00
linker_libc_support.c Unify linker files under one license (BSD) 2017-02-15 15:35:33 -08:00
linker_libcxx_support.cpp Adapt to the new libc++/libc++abi update. 2018-01-08 14:44:42 -08:00
linker_logger.cpp Remove debug.ld.greylist_disabled property 2020-07-30 19:29:17 -07:00
linker_logger.h Remove debug.ld.greylist_disabled property 2020-07-30 19:29:17 -07:00
linker_main.cpp get_executable_info: minor clarification. 2024-04-25 16:44:48 +00:00
linker_main.h Revert "Linker support for MTE globals." 2023-12-06 19:01:46 +00:00
linker_mapped_file_fragment.cpp Remove PAGE_SIZE call sites. 2023-06-12 10:59:39 -07:00
linker_mapped_file_fragment.h Clean up bionic_macros.h a bit. 2018-10-25 11:00:00 -07:00
linker_memory.cpp Add aligned_alloc to linker_memory.cpp 2023-07-24 13:08:34 -07:00
linker_namespaces.cpp linker: Cleanup for Android's inclusive language guidance 2020-07-31 11:37:28 +08:00
linker_namespaces.h linker_namespace: move sonames instead of copying 2022-12-01 16:23:03 +09:00
linker_note_gnu_property.cpp Enable BTI in bionic linker 2020-09-23 17:53:28 -07:00
linker_note_gnu_property.h Enable BTI in bionic linker 2020-09-23 17:53:28 -07:00
linker_note_gnu_property_test.cpp Enable BTI in bionic linker 2020-09-23 17:53:28 -07:00
linker_phdr.cpp bionic: loader: Drop readahead padding pages 2024-05-02 11:06:53 -07:00
linker_phdr.h loader: Only extend segments if kernel supports page size migration 2024-05-02 11:06:51 -07:00
linker_reloc_iterators.h Optimize GNU hash linking for large inputs 2020-01-13 13:29:25 -08:00
linker_relocate.cpp Call relocate_relr before the ifunc resolvers 2024-04-04 03:23:04 -07:00
linker_relocate.h Optimize GNU hash linking for large inputs 2020-01-13 13:29:25 -08:00
linker_relocs.h Use the R_RISCV_TLSDESC constant in the linker. 2023-10-18 14:12:31 -07:00
linker_sdk_versions.cpp Add some slack at the end of large allocations when target SDK level < S. 2021-03-05 14:29:17 -08:00
linker_sleb128.h Revert "Linker support for MTE globals." 2023-12-06 19:01:46 +00:00
linker_sleb128_test.cpp Switch linker tests to Android.bp. 2019-02-15 14:40:08 -08:00
linker_soinfo.cpp ldd: skip relocation processing, TLS modules, CFI 2024-03-14 14:01:04 -07:00
linker_soinfo.h Call relocate_relr before the ifunc resolvers 2024-04-04 03:23:04 -07:00
linker_test_globals.cpp bionic: linker-unit-tests: Add crt_pad_segment tests 2024-02-07 16:20:48 -08:00
linker_tls.cpp ldd: skip relocation processing, TLS modules, CFI 2024-03-14 14:01:04 -07:00
linker_tls.h Implement arm64 TLSDESC 2019-01-29 08:33:09 +00:00
linker_translate_path.cpp Refactor translateSystemPathToApexPath 2020-05-19 02:32:07 +02:00
linker_translate_path.h Copy translateSystemPathToApexPath to linker_translate_path.cpp 2020-05-14 22:17:45 +02:00
linker_transparent_hugepage_support.cpp Fix it to call the lambda function 2022-05-19 02:13:39 +00:00
linker_utils.cpp Remove PAGE_SIZE call sites. 2023-06-12 10:59:39 -07:00
linker_utils.h Remove PAGE_SIZE call sites. 2023-06-12 10:59:39 -07:00
linker_utils_test.cpp 16k: Fix linker_utils_test to support 4kb and 16kb page sizes 2023-12-08 00:01:04 +00:00
linker_wrapper.cpp Remove host_bionic_inject 2021-06-14 12:25:05 -07:00
MODULE_LICENSE_BSD Fix/update notices. 2021-02-16 15:06:50 -08:00
NOTICE Update linker/NOTICE. 2024-02-09 09:27:33 -08:00
rt.cpp More dynamic linker cleanup. 2012-10-30 16:35:38 -07:00