platform_bionic/linker
Mitch Phillips e8139f585a Linker support for MTE globals.
This patch adds the necessary bionic code for the linker to protect
global data using MTE.

The implementation is described in the MemtagABI addendum to the
AArch64 ELF ABI:
https://github.com/ARM-software/abi-aa/blob/main/memtagabielf64/memtagabielf64.rst

In summary, this patch includes:

1. When MTE globals is requested, the linker maps writable SHF_ALLOC
   sections as anonymous pages with PROT_MTE (copying the file contents
   into the anonymous mapping), rather than using a file-backed private
   mapping. This is required as file-based mappings are not necessarily
   backed by the kernel with tag-capable memory. For sections already
   mapped by the kernel when the linker is invoked via. PT_INTERP, we
   unmap the contents, remap a PROT_MTE+anonymous mapping in its place,
   and re-load the file contents from disk.

2. When MTE globals is requested, the linker tags areas of global memory
   (as defined in SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC) with random tags,
   but ensuring that adjacent globals are never tagged using the same
   memory tag (to provide detemrinistic overflow detection).

3. Changes to RELATIVE, ABS64, and GLOB_DAT relocations to load and
   store tags in the right places. This ensures that the address tags are
   materialized into the GOT entries as well. These changes are a
   functional no-op to existing binaries and/or non-MTE capable hardware.

Bug: N/A
Test: atest bionic-unit-tests CtsBionicTestCases --test-filter=*Memtag*

Change-Id: Id7b1a925339b14949d5a8f607dd86928624bda0e
2023-11-20 15:53:06 +01:00
..
arch riscv64: don't use jalr when we can just say call. 2023-05-12 12:56:54 -07:00
Android.bp Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
dlfcn.cpp Linker support for MTE globals. 2023-11-20 15:53:06 +01: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 Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker.generic.map Add the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -08:00
linker.h Merge "Remove unused declarations." into main 2023-10-05 23:28:52 +00: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_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 the recoverable GWP-ASan feature. 2023-02-02 15:35:25 -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 Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker_main.h Linker support for MTE globals. 2023-11-20 15:53:06 +01: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 Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker_phdr.h Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker_reloc_iterators.h Optimize GNU hash linking for large inputs 2020-01-13 13:29:25 -08:00
linker_relocate.cpp Linker support for MTE globals. 2023-11-20 15:53:06 +01: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 Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker_sleb128_test.cpp Switch linker tests to Android.bp. 2019-02-15 14:40:08 -08:00
linker_soinfo.cpp Don't memset() in the soinfo constructor. 2023-09-29 17:09:02 +00:00
linker_soinfo.h Linker support for MTE globals. 2023-11-20 15:53:06 +01:00
linker_test_globals.cpp Switch linker tests to Android.bp. 2019-02-15 14:40:08 -08:00
linker_tls.cpp Add a thread-properties API 2020-08-11 16:51:43 +00: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 Remove PAGE_SIZE call sites. 2023-06-12 10:59:39 -07: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 linker: add LD_SHOW_AUXV support. 2023-08-22 14:25:01 -07:00
rt.cpp More dynamic linker cleanup. 2012-10-30 16:35:38 -07:00