1*7594170eSAndroid Build Coastguard Worker#!/bin/bash 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Copyright 2021 Google Inc. All rights reserved. 4*7594170eSAndroid Build Coastguard Worker# 5*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*7594170eSAndroid Build Coastguard Worker# 11*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*7594170eSAndroid Build Coastguard Worker# limitations under the License. 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Workerset -euo pipefail 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Workersource "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" 20*7594170eSAndroid Build Coastguard Worker 21*7594170eSAndroid Build Coastguard WorkerNM="$1" 22*7594170eSAndroid Build Coastguard WorkerREADELF="$2" 23*7594170eSAndroid Build Coastguard Worker 24*7594170eSAndroid Build Coastguard Worker# This should be abstracted to a unit-test library when it has more uses. 25*7594170eSAndroid Build Coastguard Workerfunction assert_contains_regex() { 26*7594170eSAndroid Build Coastguard Worker local needle="$1" 27*7594170eSAndroid Build Coastguard Worker local haystack="$2" 28*7594170eSAndroid Build Coastguard Worker local message="${3:-Expected regexp "$needle" not found in\n"$haystack"}" 29*7594170eSAndroid Build Coastguard Worker echo "${haystack}" | grep "${needle}" && return 0 30*7594170eSAndroid Build Coastguard Worker 31*7594170eSAndroid Build Coastguard Worker echo -e "$message" 32*7594170eSAndroid Build Coastguard Worker exit 1 33*7594170eSAndroid Build Coastguard Worker} 34*7594170eSAndroid Build Coastguard Worker 35*7594170eSAndroid Build Coastguard Worker# Test that a library is a static library. 36*7594170eSAndroid Build Coastguard Workerfunction test_is_static_library() { 37*7594170eSAndroid Build Coastguard Worker local filepath="$(readlink -f $1)"; shift 38*7594170eSAndroid Build Coastguard Worker local metadata="$($READELF -h ${filepath})" 39*7594170eSAndroid Build Coastguard Worker assert_contains_regex "Type:.*REL (Relocatable file)" "${metadata}" 40*7594170eSAndroid Build Coastguard Worker} 41*7594170eSAndroid Build Coastguard Worker 42*7594170eSAndroid Build Coastguard Worker# Test that a library is a shared library. 43*7594170eSAndroid Build Coastguard Workerfunction test_is_shared_library() { 44*7594170eSAndroid Build Coastguard Worker local filepath="$(readlink -f $1)"; shift 45*7594170eSAndroid Build Coastguard Worker local metadata="$($READELF -h ${filepath})" 46*7594170eSAndroid Build Coastguard Worker assert_contains_regex "Type:.*DYN (Shared object file)" "${metadata}" 47*7594170eSAndroid Build Coastguard Worker} 48*7594170eSAndroid Build Coastguard Worker 49*7594170eSAndroid Build Coastguard Worker# Test that the shared library contains a symbol 50*7594170eSAndroid Build Coastguard Workerfunction test_shared_library_symbols() { 51*7594170eSAndroid Build Coastguard Worker local filepath="$(readlink -f $1)"; shift 52*7594170eSAndroid Build Coastguard Worker local symbols=("$@"); shift 53*7594170eSAndroid Build Coastguard Worker local nm_output="$($NM -D "${filepath}")" 54*7594170eSAndroid Build Coastguard Worker for symbol in "${symbols[@]}"; do 55*7594170eSAndroid Build Coastguard Worker assert_contains_regex "${symbol}" "${nm_output}" 56*7594170eSAndroid Build Coastguard Worker done 57*7594170eSAndroid Build Coastguard Worker} 58*7594170eSAndroid Build Coastguard Worker 59*7594170eSAndroid Build Coastguard Worker# Test file contents of //bionic/linker:ld-android 60*7594170eSAndroid Build Coastguard Workerfunction test_ld-android() { 61*7594170eSAndroid Build Coastguard Worker local shared_library="$(rlocation __main__/bionic/linker/ld-android/ld-android.so)" 62*7594170eSAndroid Build Coastguard Worker local static_library="$(rlocation __main__/bionic/linker/libld-android_bp2build_cc_library_static.a)" 63*7594170eSAndroid Build Coastguard Worker 64*7594170eSAndroid Build Coastguard Worker test_is_shared_library "${shared_library}" 65*7594170eSAndroid Build Coastguard Worker test_is_static_library "${static_library}" 66*7594170eSAndroid Build Coastguard Worker 67*7594170eSAndroid Build Coastguard Worker symbols=( 68*7594170eSAndroid Build Coastguard Worker __loader_add_thread_local_dtor 69*7594170eSAndroid Build Coastguard Worker __loader_android_create_namespace 70*7594170eSAndroid Build Coastguard Worker __loader_android_dlopen_ext 71*7594170eSAndroid Build Coastguard Worker __loader_android_dlwarning 72*7594170eSAndroid Build Coastguard Worker __loader_android_get_application_target_sdk_version 73*7594170eSAndroid Build Coastguard Worker __loader_android_get_exported_namespace 74*7594170eSAndroid Build Coastguard Worker __loader_android_get_LD_LIBRARY_PATH 75*7594170eSAndroid Build Coastguard Worker __loader_android_init_anonymous_namespace 76*7594170eSAndroid Build Coastguard Worker __loader_android_link_namespaces 77*7594170eSAndroid Build Coastguard Worker __loader_android_link_namespaces_all_libs 78*7594170eSAndroid Build Coastguard Worker __loader_android_set_application_target_sdk_version 79*7594170eSAndroid Build Coastguard Worker __loader_android_update_LD_LIBRARY_PATH 80*7594170eSAndroid Build Coastguard Worker __loader_cfi_fail 81*7594170eSAndroid Build Coastguard Worker __loader_dladdr 82*7594170eSAndroid Build Coastguard Worker __loader_dlclose 83*7594170eSAndroid Build Coastguard Worker __loader_dlerror 84*7594170eSAndroid Build Coastguard Worker __loader_dl_iterate_phdr 85*7594170eSAndroid Build Coastguard Worker __loader_dlopen 86*7594170eSAndroid Build Coastguard Worker __loader_dlsym 87*7594170eSAndroid Build Coastguard Worker __loader_dlvsym 88*7594170eSAndroid Build Coastguard Worker __loader_remove_thread_local_dtor 89*7594170eSAndroid Build Coastguard Worker __loader_shared_globals 90*7594170eSAndroid Build Coastguard Worker _db_dlactivity 91*7594170eSAndroid Build Coastguard Worker ) 92*7594170eSAndroid Build Coastguard Worker 93*7594170eSAndroid Build Coastguard Worker test_shared_library_symbols "${shared_library}" "${symbols[@]}" 94*7594170eSAndroid Build Coastguard Worker} 95*7594170eSAndroid Build Coastguard Worker 96*7594170eSAndroid Build Coastguard Workerfunction test_libdl_android() { 97*7594170eSAndroid Build Coastguard Worker local shared_library="$(rlocation __main__/bionic/libdl/libdl_android/libdl_android.so)" 98*7594170eSAndroid Build Coastguard Worker local static_library="$(rlocation __main__/bionic/libdl/liblibdl_android_bp2build_cc_library_static.a)" 99*7594170eSAndroid Build Coastguard Worker 100*7594170eSAndroid Build Coastguard Worker test_is_shared_library "${shared_library}" 101*7594170eSAndroid Build Coastguard Worker test_is_static_library "${static_library}" 102*7594170eSAndroid Build Coastguard Worker 103*7594170eSAndroid Build Coastguard Worker symbols=( 104*7594170eSAndroid Build Coastguard Worker android_create_namespace 105*7594170eSAndroid Build Coastguard Worker android_dlwarning 106*7594170eSAndroid Build Coastguard Worker android_get_exported_namespace 107*7594170eSAndroid Build Coastguard Worker android_get_LD_LIBRARY_PATH 108*7594170eSAndroid Build Coastguard Worker android_init_anonymous_namespace 109*7594170eSAndroid Build Coastguard Worker android_link_namespaces 110*7594170eSAndroid Build Coastguard Worker android_set_application_target_sdk_version 111*7594170eSAndroid Build Coastguard Worker android_update_LD_LIBRARY_PATH 112*7594170eSAndroid Build Coastguard Worker ) 113*7594170eSAndroid Build Coastguard Worker 114*7594170eSAndroid Build Coastguard Worker test_shared_library_symbols "${shared_library}" "${symbols[@]}" 115*7594170eSAndroid Build Coastguard Worker} 116*7594170eSAndroid Build Coastguard Worker 117*7594170eSAndroid Build Coastguard Workerfunction test_libc() { 118*7594170eSAndroid Build Coastguard Worker local shared_library="$(rlocation __main__/bionic/libc/libc/libc.so)" 119*7594170eSAndroid Build Coastguard Worker local static_library="$(rlocation __main__/bionic/libc/liblibc_bp2build_cc_library_static.a)" 120*7594170eSAndroid Build Coastguard Worker 121*7594170eSAndroid Build Coastguard Worker test_is_shared_library "${shared_library}" 122*7594170eSAndroid Build Coastguard Worker test_is_static_library "${static_library}" 123*7594170eSAndroid Build Coastguard Worker 124*7594170eSAndroid Build Coastguard Worker symbols=( 125*7594170eSAndroid Build Coastguard Worker __libc_get_static_tls_bounds 126*7594170eSAndroid Build Coastguard Worker __libc_register_thread_exit_callback 127*7594170eSAndroid Build Coastguard Worker __libc_iterate_dynamic_tls 128*7594170eSAndroid Build Coastguard Worker __libc_register_dynamic_tls_listeners 129*7594170eSAndroid Build Coastguard Worker android_reset_stack_guards 130*7594170eSAndroid Build Coastguard Worker ffsl 131*7594170eSAndroid Build Coastguard Worker ffsll 132*7594170eSAndroid Build Coastguard Worker pidfd_getfd 133*7594170eSAndroid Build Coastguard Worker pidfd_open 134*7594170eSAndroid Build Coastguard Worker pidfd_send_signal 135*7594170eSAndroid Build Coastguard Worker process_madvise 136*7594170eSAndroid Build Coastguard Worker _Unwind_Backtrace # apex llndk 137*7594170eSAndroid Build Coastguard Worker _Unwind_DeleteException # apex llndk 138*7594170eSAndroid Build Coastguard Worker _Unwind_Find_FDE # apex llndk 139*7594170eSAndroid Build Coastguard Worker _Unwind_FindEnclosingFunction # apex llndk 140*7594170eSAndroid Build Coastguard Worker _Unwind_GetCFA # apex llndk 141*7594170eSAndroid Build Coastguard Worker _Unwind_GetDataRelBase # apex llndk 142*7594170eSAndroid Build Coastguard Worker _Unwind_GetGR # apex llndk 143*7594170eSAndroid Build Coastguard Worker _Unwind_GetIP # apex llndk 144*7594170eSAndroid Build Coastguard Worker _Unwind_GetIPInfo # apex llndk 145*7594170eSAndroid Build Coastguard Worker _Unwind_GetLanguageSpecificData # apex llndk 146*7594170eSAndroid Build Coastguard Worker _Unwind_GetRegionStart # apex llndk 147*7594170eSAndroid Build Coastguard Worker _Unwind_GetTextRelBase # apex llndk 148*7594170eSAndroid Build Coastguard Worker _Unwind_RaiseException # apex llndk 149*7594170eSAndroid Build Coastguard Worker _Unwind_Resume # apex llndk 150*7594170eSAndroid Build Coastguard Worker _Unwind_Resume_or_Rethrow # apex llndk 151*7594170eSAndroid Build Coastguard Worker _Unwind_SetGR # apex llndk 152*7594170eSAndroid Build Coastguard Worker _Unwind_SetIP # apex llndk 153*7594170eSAndroid Build Coastguard Worker ) 154*7594170eSAndroid Build Coastguard Worker 155*7594170eSAndroid Build Coastguard Worker test_shared_library_symbols "${shared_library}" "${symbols[@]}" 156*7594170eSAndroid Build Coastguard Worker} 157*7594170eSAndroid Build Coastguard Worker 158*7594170eSAndroid Build Coastguard Workertest_ld-android 159*7594170eSAndroid Build Coastguard Workertest_libdl_android 160*7594170eSAndroid Build Coastguard Workertest_libc 161