void memtag_stack_dlopen_callback() { if (__pthread_internal_remap_stack_with_mte()) {
async_safe_format_log(ANDROID_LOG_DEBUG, "libc", "remapped stacks as PROT_MTE");
}
}
// Use an initializer so __libc_sysinfo will have a fallback implementation // while .preinit_array constructors run. #ifdefined(__i386__)
__LIBC_HIDDEN__ void* __libc_sysinfo = reinterpret_cast<void*>(__libc_int0x80); #endif
// We need a helper function for __libc_preinit because compiling with LTO may // inline functions requiring a stack protector check, but __stack_chk_guard is // not initialized at the start of __libc_preinit. __libc_preinit_impl will run // after __stack_chk_guard is initialized and therefore can safely have a stack // protector.
__attribute__((noinline)) staticvoid __libc_preinit_impl() { #ifdefined(__i386__)
__libc_init_sysinfo(); #endif
// Register libc.so's copy of the TLS generation variable so the linker can // update it when it loads or unloads a shared object.
TlsModules& tls_modules = __libc_shared_globals()->tls_modules;
tls_modules.generation_libc_so = &__libc_tls_generation_copy;
__libc_tls_generation_copy = tls_modules.generation;
#if __has_feature(hwaddress_sanitizer) // Notify the HWASan runtime library whenever a library is loaded or unloaded // so that it can update its shadow memory. // This has to happen before _libc_init_malloc which might dlopen to load // profiler libraries.
__libc_shared_globals()->load_hook = __hwasan_library_loaded;
__libc_shared_globals()->unload_hook = __hwasan_library_unloaded; #endif
// Hooks for various libraries to let them know that we're starting up.
__libc_globals.mutate(__libc_init_malloc);
// Install reserved signal handlers for assisting the platform's profilers.
__libc_init_profiling_handlers();
// Wait until everything is initialized before enabled systracing.
__get_bionic_tls().bionic_systrace_enabled = true;
}
// We flag the __libc_preinit function as a constructor to ensure that // its address is listed in libc.so's .init_array section. // This ensures that the function is called by the dynamic linker as // soon as the shared library is loaded. // We give this constructor priority 1 because we want libc's constructor // to run before any others (such as the jemalloc constructor), and lower // is better (http://b/68046352).
__attribute__((constructor(1))) staticvoid __libc_preinit() { // The linker has initialized its copy of the global stack_chk_guard, and filled in the main // thread's TLS slot with that value. Initialize the local global stack guard with its value.
__stack_chk_guard = reinterpret_cast<uintptr_t>(__get_tls()[TLS_SLOT_STACK_GUARD]);
__libc_preinit_impl();
}
// This function is called from the executable's _start entry point // (see arch-$ARCH/bionic/crtbegin.c), which is itself called by the dynamic // linker after it has loaded all shared libraries the executable depends on. // // Note that the dynamic linker has also run all constructors in the // executable at this point.
__noreturn void __libc_init(void* raw_args, void*, int (*main)(int, char**, char**),
structors_array_t const * const structors) {
BIONIC_STOP_UNWIND;
KernelArgumentBlock args(raw_args);
// The executable may have its own destructors listed in its .fini_array // so we need to ensure that these are called when the program exits // normally. if (structors->fini_array) {
__cxa_atexit(__libc_fini,structors->fini_array,nullptr);
}
__libc_init_mte_late();
// This roundabout way is needed so we don't use the static libc linked into the linker, which // will not affect the process.
__libc_shared_globals()->memtag_stack_dlopen_callback = memtag_stack_dlopen_callback;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet am 2026-06-28)
¤