#!/bin/bash # # Copyright 2021 Google Inc. All rights reserved. # # 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. set -euo pipefail source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" READELF="$(rlocation __main__/prebuilts/clang/host/linux-x86/${CLANG_DEFAULT_VERSION}/bin/llvm-readelf)" NM="$(rlocation __main__/prebuilts/clang/host/linux-x86/${CLANG_DEFAULT_VERSION}/bin/llvm-nm)" # This should be abstracted to a unit-test library when it has more uses. function assert_contains_regex() { local needle="$1" local haystack="$2" local message="${3:-Expected regexp "$needle" not found in\n"$haystack"}" echo "${haystack}" | grep "${needle}" && return 0 echo -e "$message" exit 1 } # Test that a library is a static library. function test_is_static_library() { local filepath="$(readlink -f $1)"; shift local metadata="$($READELF -h ${filepath})" assert_contains_regex "Type:.*REL (Relocatable file)" "${metadata}" } # Test that a library is a shared library. function test_is_shared_library() { local filepath="$(readlink -f $1)"; shift local metadata="$($READELF -h ${filepath})" assert_contains_regex "Type:.*DYN (Shared object file)" "${metadata}" } # Test that the shared library contains a symbol function test_shared_library_symbols() { local filepath="$(readlink -f $1)"; shift local symbols=("$@"); shift local nm_output="$($NM -D "${filepath}")" for symbol in "${symbols[@]}"; do assert_contains_regex "${symbol}" "${nm_output}" done } # Test file contents of //bionic/linker:ld-android function test_ld-android() { local shared_library="$(rlocation __main__/bionic/linker/ld-android.so)" local static_library="$(rlocation __main__/bionic/linker/libld-android_bp2build_cc_library_static.a)" test_is_shared_library "${shared_library}" test_is_static_library "${static_library}" symbols=( __loader_add_thread_local_dtor __loader_android_create_namespace __loader_android_dlopen_ext __loader_android_dlwarning __loader_android_get_application_target_sdk_version __loader_android_get_exported_namespace __loader_android_get_LD_LIBRARY_PATH __loader_android_init_anonymous_namespace __loader_android_link_namespaces __loader_android_link_namespaces_all_libs __loader_android_set_application_target_sdk_version __loader_android_update_LD_LIBRARY_PATH __loader_cfi_fail __loader_dladdr __loader_dlclose __loader_dlerror __loader_dl_iterate_phdr __loader_dlopen __loader_dlsym __loader_dlvsym __loader_remove_thread_local_dtor __loader_shared_globals _db_dlactivity ) test_shared_library_symbols "${shared_library}" "${symbols[@]}" } function test_libdl_android() { local shared_library="$(rlocation __main__/bionic/libdl/libdl_android.so)" local static_library="$(rlocation __main__/bionic/libdl/liblibdl_android_bp2build_cc_library_static.a)" test_is_shared_library "${shared_library}" test_is_static_library "${static_library}" symbols=( android_create_namespace android_dlwarning android_get_exported_namespace android_get_LD_LIBRARY_PATH android_init_anonymous_namespace android_link_namespaces android_set_application_target_sdk_version android_update_LD_LIBRARY_PATH ) test_shared_library_symbols "${shared_library}" "${symbols[@]}" } function test_libc() { local shared_library="$(rlocation __main__/bionic/libc/libc.so)" local static_library="$(rlocation __main__/bionic/libc/liblibc_bp2build_cc_library_static.a)" test_is_shared_library "${shared_library}" test_is_static_library "${static_library}" symbols=( __libc_get_static_tls_bounds __libc_register_thread_exit_callback __libc_iterate_dynamic_tls __libc_register_dynamic_tls_listeners android_reset_stack_guards ffsl ffsll pidfd_getfd pidfd_open pidfd_send_signal process_madvise _Unwind_Backtrace # apex llndk _Unwind_DeleteException # apex llndk _Unwind_Find_FDE # apex llndk _Unwind_FindEnclosingFunction # apex llndk _Unwind_GetCFA # apex llndk _Unwind_GetDataRelBase # apex llndk _Unwind_GetGR # apex llndk _Unwind_GetIP # apex llndk _Unwind_GetIPInfo # apex llndk _Unwind_GetLanguageSpecificData # apex llndk _Unwind_GetRegionStart # apex llndk _Unwind_GetTextRelBase # apex llndk _Unwind_RaiseException # apex llndk _Unwind_Resume # apex llndk _Unwind_Resume_or_Rethrow # apex llndk _Unwind_SetGR # apex llndk _Unwind_SetIP # apex llndk ) test_shared_library_symbols "${shared_library}" "${symbols[@]}" } test_ld-android test_libdl_android test_libc