platform_bionic/tests/Android.bp
Kalesh Singh 944164c5e2 RELAND: bionic: loader: Extend LOAD segment VMAs
When the page_size < p_align of the ELF load segment, the loader
will end up creating extra PROT_NONE gap VMA mappings between the
LOAD segments. This problem is exacerbated by Android's zygote
model, where the number of loaded .so's can lead to ~30MB increase
in vm_area_struct unreclaimable slab memory.

Extend the LOAD segment VMA's to cover the range between the
segment's end and the start of the next segment, being careful
to avoid touching regions of the extended mapping where the offset
would overrun the size of the file. This avoids the loader
creating an additional gap VMA for each LOAD segment.

Consider a system with 4KB page size and the ELF files with 64K
alignment. e.g:

$ readelf -Wl /system/lib64/bootstrap/libc.so | grep 'Type\|LOAD'

Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x0441a8 0x0441a8 R   0x10000
LOAD           0x0441b0 0x00000000000541b0 0x00000000000541b0 0x091860 0x091860 R E 0x10000
LOAD           0x0d5a10 0x00000000000f5a10 0x00000000000f5a10 0x003d40 0x003d40 RW  0x10000
LOAD           0x0d9760 0x0000000000109760 0x0000000000109760 0x0005c0 0x459844 RW  0x10000

Before this patch:

$ cat /proc/1/maps | grep -A1 libc.so

7fa1d4a90000-7fa1d4ad5000 r--p 00000000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7fa1d4ad5000-7fa1d4ae4000 ---p 00000000 00:00 0
7fa1d4ae4000-7fa1d4b76000 r-xp 00044000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7fa1d4b76000-7fa1d4b85000 ---p 00000000 00:00 0
7fa1d4b85000-7fa1d4b8a000 r--p 000d5000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7fa1d4b8a000-7fa1d4b99000 ---p 00000000 00:00 0
7fa1d4b99000-7fa1d4b9a000 rw-p 000d9000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7fa1d4b9a000-7fa1d4feb000 rw-p 00000000 00:00 0                          [anon:.bss]

3 additional PROT_NONE (---p) VMAs for gap mappings.

After this patch:

$ cat /proc/1/maps | grep -A1 libc.so

7f468f069000-7f468f0bd000 r--p 00000000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7f468f0bd000-7f468f15e000 r-xp 00044000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7f468f15e000-7f468f163000 r--p 000d5000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7f468f163000-7f468f172000 rw-p 000da000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7f468f172000-7f468f173000 rw-p 000d9000 fe:09 20635520                   /system/lib64/bootstrap/libc.so
7f468f173000-7f468f5c4000 rw-p 00000000 00:00 0                          [anon:.bss]

No additional gap VMAs. However notice there is an extra RW VMA at
offset 0x000da000. This is caused by the RO protection of the
GNU_RELRO segment, which causes the extended RW VMA to split.
The GNU_RELRO protection extension is handled in the subsequent
patch in this series.

Bug: 316403210
Bug: 300367402
Bug: 307803052
Bug: 312550202
Test: atest -c linker-unit-tests
Test: atest -c bionic-unit-tests
Change-Id: I7150ed22af0723cc0b2d326c046e4e4a8b56ad09
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
2024-02-27 06:13:11 +00:00

1303 lines
35 KiB
Text

//
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package {
default_team: "trendy_team_native_tools_libraries",
default_applicable_licenses: ["bionic_tests_license"],
}
license {
name: "bionic_tests_license",
visibility: [":__subpackages__"],
license_kinds: [
"SPDX-license-identifier-Apache-2.0",
"SPDX-license-identifier-BSD",
],
license_text: [
"NOTICE",
],
}
cc_defaults {
name: "bionic_tests_defaults",
host_supported: true,
target: {
darwin: {
enabled: false,
},
android: {
header_libs: ["bionic_libc_platform_headers"],
},
linux_bionic: {
header_libs: ["bionic_libc_platform_headers"],
},
},
cflags: [
"-fstack-protector-all",
"-g",
"-Wall",
"-Wextra",
"-Wunused",
"-Werror",
"-fno-builtin",
// We want to test deprecated API too.
"-Wno-deprecated-declarations",
// Needed to test pthread_internal_t layout.
"-Wno-invalid-offsetof",
// This warning does not provide any benefit to the tests.
"-Wno-reorder-init-list",
],
header_libs: [
"libcutils_headers",
"gwp_asan_headers",
],
stl: "libc++",
// Ensure that the tests exercise shadow call stack support.
// We don't use `scs: true` here because that would give us a second
// variant of this library where we actually just want to say "this
// library should always be built this way".
arch: {
arm64: {
cflags: ["-fsanitize=shadow-call-stack"],
},
riscv64: {
cflags: ["-fsanitize=shadow-call-stack"],
},
},
sanitize: {
address: false,
},
// Use the bootstrap version of bionic because some tests call private APIs
// that aren't exposed by the APEX bionic stubs.
bootstrap: true,
}
// -----------------------------------------------------------------------------
// Prebuilt shared libraries for use in tests.
// -----------------------------------------------------------------------------
cc_prebuilt_test_library_shared {
name: "libtest_invalid-rw_load_segment",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-rw_load_segment.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-rw_load_segment.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-rw_load_segment.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-rw_load_segment.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-rw_load_segment.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-unaligned_shdr_offset",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-unaligned_shdr_offset.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-unaligned_shdr_offset.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-unaligned_shdr_offset.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-unaligned_shdr_offset.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-unaligned_shdr_offset.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-zero_shentsize",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-zero_shentsize.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shentsize.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shentsize.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shentsize.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-zero_shentsize.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-zero_shstrndx",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-zero_shstrndx.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shstrndx.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shstrndx.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shstrndx.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-zero_shstrndx.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-empty_shdr_table",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-empty_shdr_table.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-empty_shdr_table.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-empty_shdr_table.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-empty_shdr_table.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-empty_shdr_table.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-zero_shdr_table_offset",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-zero_shdr_table_offset.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shdr_table_offset.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_offset.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shdr_table_offset.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-zero_shdr_table_offset.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-zero_shdr_table_content",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-zero_shdr_table_content.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shdr_table_content.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_content.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shdr_table_content.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-zero_shdr_table_content.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-textrels",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-textrels.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-textrels.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-textrels.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-textrels.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-textrels.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-textrels2",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-textrels2.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-textrels2.so"],
},
riscv64: {
srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-textrels2.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-textrels2.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-textrels2.so"],
},
},
}
cc_prebuilt_test_library_shared {
name: "libtest_invalid-local-tls",
strip: {
none: true,
},
check_elf_files: false,
relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
arch: {
arm: {
srcs: ["prebuilt-elf-files/arm/libtest_invalid-local-tls.so"],
},
arm64: {
srcs: ["prebuilt-elf-files/arm64/libtest_invalid-local-tls.so"],
},
x86: {
srcs: ["prebuilt-elf-files/x86/libtest_invalid-local-tls.so"],
},
x86_64: {
srcs: ["prebuilt-elf-files/x86_64/libtest_invalid-local-tls.so"],
},
},
}
// -----------------------------------------------------------------------------
// All standard tests.
// -----------------------------------------------------------------------------
// Test diagnostics emitted by clang. The library that results is useless; we
// just want to run '-Xclang -verify', which will fail if the diagnostics don't
// match up with what the source file says they should be.
cc_test_library {
name: "clang_diagnostic_tests",
cflags: [
"-Xclang",
"-verify",
],
srcs: ["sys_ioctl_diag_test.cpp"],
}
cc_test_library {
name: "libBionicStandardTests",
defaults: ["bionic_tests_defaults"],
tidy_disabled_srcs: [
"malloc_test.cpp", // timed out with clang-tidy, and too many warnings
],
srcs: [
"__aeabi_read_tp_test.cpp",
"__cxa_atexit_test.cpp",
"__cxa_demangle_test.cpp",
"alloca_test.cpp",
"android_get_device_api_level.cpp",
"android_set_abort_message_test.cpp",
"arpa_inet_test.cpp",
"async_safe_test.cpp",
"assert_test.cpp",
"buffer_tests.cpp",
"bug_26110743_test.cpp",
"byteswap_test.cpp",
"complex_test.cpp",
"ctype_test.cpp",
"dirent_test.cpp",
"elf_test.cpp",
"endian_test.cpp",
"errno_test.cpp",
"error_test.cpp",
"eventfd_test.cpp",
"fcntl_test.cpp",
"fdsan_test.cpp",
"fdtrack_test.cpp",
"fenv_test.cpp",
"_FILE_OFFSET_BITS_test.cpp",
"float_test.cpp",
"fnmatch_test.cpp",
"ftw_test.cpp",
"getauxval_test.cpp",
"getcwd_test.cpp",
"glob_test.cpp",
"grp_pwd_test.cpp",
"grp_pwd_file_test.cpp",
"heap_tagging_level_test.cpp",
"iconv_test.cpp",
"ifaddrs_test.cpp",
"ifunc_test.cpp",
"inttypes_test.cpp",
"iso646_test.c",
"langinfo_test.cpp",
"leak_test.cpp",
"libgen_basename_test.cpp",
"libgen_test.cpp",
"limits_test.cpp",
"linux_swab_test.cpp",
"locale_test.cpp",
"malloc_iterate_test.cpp",
"malloc_test.cpp",
"math_test.cpp",
"membarrier_test.cpp",
"memtag_stack_test.cpp",
"mntent_test.cpp",
"mte_test.cpp",
"netdb_test.cpp",
"net_if_test.cpp",
"netinet_ether_test.cpp",
"netinet_in_test.cpp",
"netinet_ip_icmp_test.cpp",
"netinet_udp_test.cpp",
"nl_types_test.cpp",
"pidfd_test.cpp",
"poll_test.cpp",
"prio_ctor_test.cpp",
"pthread_test.cpp",
"pty_test.cpp",
"regex_test.cpp",
"resolv_test.cpp",
"sched_test.cpp",
"scs_test.cpp",
"scsi_sg_test.cpp",
"search_test.cpp",
"semaphore_test.cpp",
"setjmp_test.cpp",
"signal_test.cpp",
"spawn_test.cpp",
"stack_protector_test.cpp",
"stack_protector_test_helper.cpp",
"stack_unwinding_test.cpp",
"stdalign_test.cpp",
"stdarg_test.cpp",
"stdatomic_test.cpp",
"stdbool_test.c",
"stdint_test.cpp",
"stdio_nofortify_test.cpp",
"stdio_test.cpp",
"stdio_ext_test.cpp",
"stdlib_test.cpp",
"stdnoreturn_test.cpp",
"string_nofortify_test.cpp",
"string_test.cpp",
"string_posix_strerror_r_test.cpp",
"string_posix_strerror_r_wrapper.cpp",
"strings_nofortify_test.cpp",
"strings_test.cpp",
"struct_layout_test.cpp",
"sstream_test.cpp",
"sys_auxv_test.cpp",
"sys_cachectl_test.cpp",
"sys_epoll_test.cpp",
"sys_hwprobe_test.cpp",
"sys_mman_test.cpp",
"sys_msg_test.cpp",
"sys_param_test.cpp",
"sys_personality_test.cpp",
"sys_prctl_test.cpp",
"sys_procfs_test.cpp",
"sys_ptrace_test.cpp",
"sys_quota_test.cpp",
"sys_random_test.cpp",
"sys_resource_test.cpp",
"sys_select_test.cpp",
"sys_sem_test.cpp",
"sys_sendfile_test.cpp",
"sys_shm_test.cpp",
"sys_signalfd_test.cpp",
"sys_socket_test.cpp",
"sys_stat_test.cpp",
"sys_statvfs_test.cpp",
"sys_syscall_test.cpp",
"sys_sysinfo_test.cpp",
"sys_sysmacros_test.cpp",
"sys_time_test.cpp",
"sys_timex_test.cpp",
"sys_ttydefaults_test.cpp",
"sys_types_test.cpp",
"sys_uio_test.cpp",
"sys_un_test.cpp",
"sys_vfs_test.cpp",
"sys_wait_test.cpp",
"sys_xattr_test.cpp",
"syslog_test.cpp",
"system_properties_test.cpp",
"system_properties_test2.cpp",
"termios_test.cpp",
"tgmath_test.c",
"threads_test.cpp",
"time_test.cpp",
"uchar_test.cpp",
"unistd_nofortify_test.cpp",
"unistd_test.cpp",
"utils.cpp",
"utmp_test.cpp",
"utmpx_test.cpp",
"wchar_test.cpp",
"wctype_test.cpp",
],
include_dirs: [
"bionic/libc",
],
target: {
bionic: {
whole_static_libs: [
"libasync_safe",
"libprocinfo",
"libsystemproperties",
],
},
musl: {
exclude_srcs: [
// musl doesn't have error.h
"error_test.cpp",
// musl doesn't define noreturn for C++
"stdnoreturn_test.cpp",
// unsupported relocation type 37
"ifunc_test.cpp",
// musl #defines utmp to utmpx, causing a collision with
// utmpx_test.cpp
"utmp_test.cpp",
],
},
},
static_libs: [
"libtinyxml2",
"liblog",
"libbase",
],
shared: {
enabled: false,
},
generated_headers: ["generated_android_ids"],
// Bug: http://b/218788252 IR verifier too strict for ifunc resolver that
// accept parameters.
lto: {
never: true,
},
}
cc_test_library {
name: "libBionicElfTlsTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"elftls_test.cpp",
],
include_dirs: [
"bionic/libc",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libBionicElfTlsLoaderTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"elftls_dl_test.cpp",
],
include_dirs: [
"bionic/libc",
],
static_libs: [
"liblog",
"libbase",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libBionicFramePointerTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"android_unsafe_frame_pointer_chase_test.cpp",
],
include_dirs: [
"bionic/libc",
],
cflags: [
"-fno-omit-frame-pointer",
],
}
// -----------------------------------------------------------------------------
// Fortify tests.
// -----------------------------------------------------------------------------
cc_defaults {
name: "bionic_clang_fortify_tests_w_flags",
cflags: [
"-Wno-builtin-memcpy-chk-size",
"-Wno-format-security",
"-Wno-format-zero-length",
"-Wno-fortify-source",
"-Wno-memset-transposed-args",
"-Wno-strlcpy-strlcat-size",
"-Wno-strncat-size",
],
static_libs: [
"libbase",
],
}
cc_defaults {
name: "bionic_fortify_tests_defaults",
cflags: [
"-U_FORTIFY_SOURCE",
],
srcs: ["fortify_test_main.cpp"],
static_libs: [
"libbase",
],
tidy: false,
target: {
musl: {
// Musl doesn't have fortify
enabled: false,
},
},
}
// Ensure we don't use FORTIFY'ed functions with the static analyzer/clang-tidy:
// it can confuse these tools pretty easily. If this builds successfully, then
// __clang_analyzer__ overrode FORTIFY. Otherwise, FORTIFY was incorrectly
// enabled. The library that results from building this is meant to be unused.
cc_test_library {
name: "fortify_disabled_for_tidy",
defaults: [
"bionic_clang_fortify_tests_w_flags",
],
cflags: [
"-Werror",
"-D_FORTIFY_SOURCE=2",
"-D__clang_analyzer__",
],
srcs: ["clang_fortify_tests.cpp"],
tidy: false,
}
cc_test_library {
name: "libfortify1-tests-clang",
defaults: [
"bionic_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=1",
"-DTEST_NAME=Fortify1_clang",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libfortify2-tests-clang",
defaults: [
"bionic_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=2",
"-DTEST_NAME=Fortify2_clang",
],
shared: {
enabled: false,
},
}
cc_defaults {
name: "bionic_new_fortify_tests_defaults",
defaults: [
"bionic_clang_fortify_tests_w_flags",
],
cflags: [
"-U_FORTIFY_SOURCE",
],
srcs: ["clang_fortify_tests.cpp"],
tidy: false,
target: {
host: {
cflags: ["-D__clang__"],
},
},
}
cc_test_library {
name: "libfortify1-new-tests-clang",
defaults: [
"bionic_new_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=1",
"-DTEST_NAME=Fortify1_clang_new",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libfortify2-new-tests-clang",
defaults: [
"bionic_new_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=2",
"-DTEST_NAME=Fortify2_clang_new",
],
shared: {
enabled: false,
},
}
// -----------------------------------------------------------------------------
// Library of all tests (excluding the dynamic linker tests).
// -----------------------------------------------------------------------------
cc_test_library {
name: "libBionicTests",
defaults: ["bionic_tests_defaults"],
host_supported: false,
whole_static_libs: [
"libBionicStandardTests",
"libBionicElfTlsTests",
"libBionicFramePointerTests",
"libfortify1-tests-clang",
"libfortify1-new-tests-clang",
"libfortify2-tests-clang",
"libfortify2-new-tests-clang",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libBionicLoaderTests",
defaults: [
"bionic_tests_defaults",
],
srcs: [
"atexit_test.cpp",
"dl_test.cpp",
"dlfcn_symlink_support.cpp",
"dlfcn_test.cpp",
"execinfo_test.cpp",
"link_test.cpp",
"pthread_dlfcn_test.cpp",
],
static_libs: [
"libbase",
"libprocinfo",
],
include_dirs: [
"bionic/libc",
],
shared: {
enabled: false,
},
target: {
android: {
srcs: [
"cfi_test.cpp",
"dlext_test.cpp",
"libdl_test.cpp",
],
static_libs: [
"libmeminfo",
"libprocinfo",
"libziparchive",
],
},
},
}
// -----------------------------------------------------------------------------
// Library of bionic customized gtest main function, with normal gtest output format,
// which is needed by bionic cts test.
// -----------------------------------------------------------------------------
cc_test_library {
name: "libBionicCtsGtestMain",
defaults: ["bionic_tests_defaults"],
srcs: [
"gtest_globals.cpp",
"gtest_main.cpp",
],
shared: {
enabled: false,
},
whole_static_libs: [
"libbase",
"libgtest_isolated",
],
}
cc_defaults {
name: "bionic_unit_tests_data",
data_bins: [
"cfi_test_helper",
"cfi_test_helper2",
"elftls_dlopen_ie_error_helper",
"exec_linker_helper",
"exec_linker_helper_lib",
"heap_tagging_async_helper",
"heap_tagging_disabled_helper",
"heap_tagging_static_async_helper",
"heap_tagging_static_disabled_helper",
"heap_tagging_static_sync_helper",
"heap_tagging_sync_helper",
"stack_tagging_helper",
"stack_tagging_static_helper",
"ld_config_test_helper",
"ld_config_test_helper_lib1",
"ld_config_test_helper_lib2",
"ld_config_test_helper_lib3",
"ld_preload_test_helper",
"ld_preload_test_helper_lib1",
"ld_preload_test_helper_lib2",
"ns_hidden_child_helper",
"preinit_getauxval_test_helper",
"preinit_syscall_test_helper",
"thread_exit_cb_helper",
"tls_properties_helper",
],
data_libs: [
"libatest_simple_zip",
"libcfi-test",
"libcfi-test-bad",
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libdlext_test",
"libdlext_test_different_soname",
"libdlext_test_fd",
"libdlext_test_norelro",
"libdlext_test_recursive",
"libdlext_test_zip",
"libgnu-hash-table-library",
"libns_hidden_child_app",
"libns_hidden_child_global",
"libns_hidden_child_internal",
"libns_hidden_child_public",
"libnstest_dlopened",
"libnstest_ns_a_public1",
"libnstest_ns_a_public1_internal",
"libnstest_ns_b_public2",
"libnstest_ns_b_public3",
"libnstest_private",
"libnstest_private_external",
"libnstest_public",
"libnstest_public_internal",
"libnstest_root",
"libnstest_root_not_isolated",
"librelocations-ANDROID_REL",
"librelocations-ANDROID_RELR",
"librelocations-RELR",
"librelocations-fat",
"libsegment_gap_inner",
"libsegment_gap_outer",
"libsysv-hash-table-library",
"libtest_atexit",
"libtest_check_order_dlsym",
"libtest_check_order_dlsym_1_left",
"libtest_check_order_dlsym_2_right",
"libtest_check_order_dlsym_3_c",
"libtest_check_order_dlsym_a",
"libtest_check_order_dlsym_b",
"libtest_check_order_dlsym_d",
"libtest_check_order_reloc_root",
"libtest_check_order_reloc_root_1",
"libtest_check_order_reloc_root_2",
"libtest_check_order_reloc_siblings",
"libtest_check_order_reloc_siblings_1",
"libtest_check_order_reloc_siblings_2",
"libtest_check_order_reloc_siblings_3",
"libtest_check_order_reloc_siblings_a",
"libtest_check_order_reloc_siblings_b",
"libtest_check_order_reloc_siblings_c",
"libtest_check_order_reloc_siblings_c_1",
"libtest_check_order_reloc_siblings_c_2",
"libtest_check_order_reloc_siblings_d",
"libtest_check_order_reloc_siblings_e",
"libtest_check_order_reloc_siblings_f",
"libtest_check_rtld_next_from_library",
"libtest_dlopen_df_1_global",
"libtest_dlopen_from_ctor",
"libtest_dlopen_from_ctor_main",
"libtest_dlopen_weak_undefined_func",
"libtest_dlsym_df_1_global",
"libtest_dlsym_from_this",
"libtest_dlsym_from_this_child",
"libtest_dlsym_from_this_grandchild",
"libtest_dlsym_weak_func",
"libtest_dt_runpath_a",
"libtest_dt_runpath_b",
"libtest_dt_runpath_c",
"libtest_dt_runpath_d",
"libtest_dt_runpath_x",
"libtest_dt_runpath_y",
"libtest_elftls_dynamic",
"libtest_elftls_dynamic_filler_1",
"libtest_elftls_dynamic_filler_2",
"libtest_elftls_dynamic_filler_3",
"libtest_elftls_shared_var",
"libtest_elftls_shared_var_ie",
"libtest_elftls_tprel",
"libtest_empty",
"libtest_ifunc",
"libtest_ifunc_variable",
"libtest_ifunc_variable_impl",
"libtest_indirect_thread_local_dtor",
"libtest_init_fini_order_child",
"libtest_init_fini_order_grand_child",
"libtest_init_fini_order_root",
"libtest_init_fini_order_root2",
"libtest_invalid-empty_shdr_table",
"libtest_invalid-local-tls",
"libtest_invalid-rw_load_segment",
"libtest_invalid-textrels",
"libtest_invalid-textrels2",
"libtest_invalid-unaligned_shdr_offset",
"libtest_invalid-zero_shdr_table_content",
"libtest_invalid-zero_shdr_table_offset",
"libtest_invalid-zero_shentsize",
"libtest_invalid-zero_shstrndx",
"libtest_missing_symbol",
"libtest_missing_symbol_child_private",
"libtest_missing_symbol_child_public",
"libtest_missing_symbol_root",
"libtest_nodelete_1",
"libtest_nodelete_2",
"libtest_nodelete_dt_flags_1",
"libtest_pthread_atfork",
"libtest_relo_check_dt_needed_order",
"libtest_relo_check_dt_needed_order_1",
"libtest_relo_check_dt_needed_order_2",
"libtest_simple",
"libtest_thread_local_dtor",
"libtest_thread_local_dtor2",
"libtest_two_parents_child",
"libtest_two_parents_parent1",
"libtest_two_parents_parent2",
"libtest_versioned_lib",
"libtest_versioned_libv1",
"libtest_versioned_libv2",
"libtest_versioned_otherlib",
"libtest_versioned_otherlib_empty",
"libtest_versioned_uselibv1",
"libtest_versioned_uselibv2",
"libtest_versioned_uselibv2_other",
"libtest_versioned_uselibv3_other",
"libtest_with_dependency",
"libtest_with_dependency_loop",
"libtest_with_dependency_loop_a",
"libtest_with_dependency_loop_b",
"libtest_with_dependency_loop_c",
"libtestshared",
],
}
// -----------------------------------------------------------------------------
// Tests for the device using bionic's .so. Run with:
// adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests
// adb shell /data/nativetest64/bionic-unit-tests/bionic-unit-tests
// -----------------------------------------------------------------------------
cc_defaults {
name: "bionic_unit_tests_defaults",
host_supported: false,
gtest: false,
defaults: [
"bionic_tests_defaults",
"bionic_unit_tests_data",
],
whole_static_libs: [
"libBionicTests",
"libBionicLoaderTests",
"libBionicElfTlsLoaderTests",
],
static_libs: [
"libtinyxml2",
"liblog",
"libbase",
"libgtest_isolated",
],
srcs: [
// TODO: Include __cxa_thread_atexit_test.cpp to glibc tests once it is upgraded (glibc 2.18+)
"__cxa_thread_atexit_test.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
"gwp_asan_test.cpp",
"thread_local_test.cpp",
],
conlyflags: [
"-fexceptions",
"-fnon-call-exceptions",
],
ldflags: ["-Wl,--export-dynamic"],
include_dirs: ["bionic/libc"],
stl: "libc++_static",
target: {
android: {
shared_libs: [
"ld-android",
"libdl",
"libdl_android",
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
static_libs: [
// The order of these libraries matters, do not shuffle them.
"libmeminfo",
"libziparchive",
"libz",
"libutils",
],
ldflags: [
"-Wl,--rpath,${ORIGIN}/bionic-loader-test-libs",
"-Wl,--enable-new-dtags",
],
},
},
}
cc_test {
name: "bionic-unit-tests",
defaults: [
"bionic_unit_tests_defaults",
],
test_suites: ["device-tests"],
data: [
":libdlext_test_runpath_zip_zipaligned",
":libdlext_test_zip_zipaligned",
],
}
cc_test {
name: "hwasan_test",
enabled: false,
// This does not use bionic_tests_defaults because it is not supported on
// host.
arch: {
arm64: {
enabled: true,
},
},
sanitize: {
hwaddress: true,
},
srcs: [
"hwasan_test.cpp",
],
shared_libs: [
"libbase",
],
data_libs: [
"libtest_simple_hwasan",
"libtest_simple_hwasan_nohwasan",
],
header_libs: ["bionic_libc_platform_headers"],
test_suites: ["device-tests"],
}
cc_test {
name: "memtag_stack_dlopen_test",
enabled: false,
// This does not use bionic_tests_defaults because it is not supported on
// host.
arch: {
arm64: {
enabled: true,
},
},
sanitize: {
memtag_heap: true,
memtag_stack: false,
},
srcs: [
"memtag_stack_dlopen_test.cpp",
],
shared_libs: [
"libbase",
],
data_libs: ["libtest_simple_memtag_stack"],
header_libs: ["bionic_libc_platform_headers"],
test_suites: ["device-tests"],
}
cc_test {
name: "bionic-stress-tests",
defaults: [
"bionic_tests_defaults",
],
// For now, these tests run forever, so do not use the isolation framework.
isolated: false,
// Running forever, do not consider unit test.
test_options: {
unit_test: false,
},
srcs: [
"malloc_stress_test.cpp",
],
shared_libs: [
"libbase",
],
target: {
android: {
static_libs: [
"libmeminfo",
"libprocinfo",
],
},
},
}
// -----------------------------------------------------------------------------
// Tests for the device linked against bionic's static library. Run with:
// adb shell /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static
// adb shell /data/nativetest64/bionic-unit-tests-static/bionic-unit-tests-static
// -----------------------------------------------------------------------------
cc_test {
name: "bionic-unit-tests-static",
gtest: false,
defaults: ["bionic_tests_defaults"],
test_suites: ["device-tests"],
host_supported: false,
srcs: [
"gtest_preinit_debuggerd.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
// The Bionic allocator has its own C++ API. It isn't packaged into its
// own library, so it can only be tested when it's part of libc.a.
"bionic_allocator_test.cpp",
],
include_dirs: [
"bionic/libc",
],
whole_static_libs: [
"libBionicTests",
],
static_libs: [
"libm",
"libc",
"libdl",
"libtinyxml2",
"liblog",
"libbase",
"libdebuggerd_handler",
"libgtest_isolated",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
static_executable: true,
stl: "libc++_static",
// Clang cannot build ifunc with LTO.
// http://b/203737712
lto: {
never: true,
},
data_bins: [
"heap_tagging_async_helper",
"heap_tagging_disabled_helper",
"heap_tagging_static_async_helper",
"heap_tagging_static_disabled_helper",
"heap_tagging_static_sync_helper",
"heap_tagging_sync_helper",
"stack_tagging_helper",
"stack_tagging_static_helper",
],
}
// -----------------------------------------------------------------------------
// Tests to run on the host and linked against glibc. Run with:
// cd bionic/tests; mm bionic-unit-tests-glibc-run
// -----------------------------------------------------------------------------
cc_test_host {
name: "bionic-unit-tests-glibc",
gtest: false,
defaults: ["bionic_tests_defaults"],
srcs: [
"atexit_test.cpp",
"dlfcn_symlink_support.cpp",
"dlfcn_test.cpp",
"dl_test.cpp",
"execinfo_test.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
"pthread_dlfcn_test.cpp",
],
shared_libs: [
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
whole_static_libs: [
"libBionicStandardTests",
"libBionicElfTlsTests",
"libBionicElfTlsLoaderTests",
"libfortify1-tests-clang",
"libfortify2-tests-clang",
],
static_libs: [
"libbase",
"liblog",
"libcutils",
"libgtest_isolated",
],
host_ldlibs: [
"-lresolv",
"-lutil",
],
include_dirs: [
"bionic/libc",
],
ldflags: [
"-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs",
"-Wl,--export-dynamic",
],
sanitize: {
never: false,
},
target: {
linux_bionic: {
enabled: false,
},
musl: {
exclude_static_libs: [
// Musl doesn't have fortify
"libfortify1-tests-clang",
"libfortify2-tests-clang",
],
},
},
}
subdirs = ["*"]