// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/android/library_loader/anchor_functions.h" #include "base/logging.h" // asm() macros below don't compile on x86, and haven't been validated outside // ARM. #if defined(ARCH_CPU_ARMEL) // These functions are here to, respectively: // 1. Check that functions are ordered // 2. Delimit the start of .text // 3. Delimit the end of .text // // (2) and (3) require a suitably constructed orderfile, with these // functions at the beginning and end. (1) doesn't need to be in it. // // These functions are weird: this is due to ICF (Identical Code Folding). // The linker merges functions that have the same code, which would be the case // if these functions were empty, or simple. // Gold's flag --icf=safe will *not* alias functions when their address is used // in code, but as of November 2017, we use the default setting that // deduplicates function in this case as well. // // Thus these functions are made to be unique, using inline .word in assembly. // // Note that code |CheckOrderingSanity()| below will make sure that these // functions are not aliased, in case the toolchain becomes really clever. extern "C" { void dummy_function_to_check_ordering() { asm(".word 0xe19c683d"); asm(".word 0xb3d2b56"); } void dummy_function_to_anchor_text() { asm(".word 0xe1f8940b"); asm(".word 0xd5190cda"); } void dummy_function_at_the_end_of_text() { asm(".word 0x133b9613"); asm(".word 0xdcd8c46a"); } } // extern "C" namespace base { namespace android { const size_t kStartOfText = reinterpret_cast(dummy_function_to_anchor_text); const size_t kEndOfText = reinterpret_cast(dummy_function_at_the_end_of_text); void CheckOrderingSanity() { // The linker usually keeps the input file ordering for symbols. // dummy_function_to_anchor_text() should then be after // dummy_function_to_check_ordering() without ordering. // This check is thus intended to catch the lack of ordering. CHECK_LT(kStartOfText, reinterpret_cast(&dummy_function_to_check_ordering)); CHECK_LT(kStartOfText, kEndOfText); CHECK_LT(kStartOfText, reinterpret_cast(&dummy_function_to_check_ordering)); CHECK_LT(kStartOfText, reinterpret_cast(&CheckOrderingSanity)); CHECK_GT(kEndOfText, reinterpret_cast(&CheckOrderingSanity)); } } // namespace android } // namespace base #endif // defined(ARCH_CPU_ARMEL)