| package { | 
 |     default_team: "trendy_team_native_tools_libraries", | 
 |     default_applicable_licenses: ["bionic_linker_license"], | 
 | } | 
 |  | 
 | license { | 
 |     name: "bionic_linker_license", | 
 |     visibility: [":__subpackages__"], | 
 |     license_kinds: [ | 
 |         "SPDX-license-identifier-BSD", | 
 |     ], | 
 |     license_text: [ | 
 |         "NOTICE", | 
 |     ], | 
 | } | 
 |  | 
 | linker_common_flags = [ | 
 |     "-fno-stack-protector", | 
 |     "-Wstrict-overflow=5", | 
 |     "-fvisibility=hidden", | 
 |     "-Wall", | 
 |     "-Wextra", | 
 |     "-Wunused", | 
 |     "-Werror", | 
 | ] | 
 |  | 
 | // ======================================================== | 
 | // linker_wrapper - Linux Bionic (on the host) | 
 | // ======================================================== | 
 |  | 
 | // This is used for bionic on (host) Linux to bootstrap our linker embedded into | 
 | // a binary. | 
 | // | 
 | // Host bionic binaries do not have a PT_INTERP section, instead this gets | 
 | // embedded as the entry point, and the linker is embedded as ELF sections in | 
 | // each binary. There's a linker script that sets all of that up (generated by | 
 | // extract_linker), and defines the extern symbols used in this file. | 
 | cc_object { | 
 |     name: "linker_wrapper", | 
 |     host_supported: true, | 
 |     device_supported: false, | 
 |     enabled: false, | 
 |     target: { | 
 |         linux_bionic: { | 
 |             enabled: true, | 
 |         }, | 
 |     }, | 
 |  | 
 |     cflags: linker_common_flags, | 
 |  | 
 |     srcs: [ | 
 |         "linker_wrapper.cpp", | 
 |     ], | 
 |     arch: { | 
 |         arm64: { | 
 |             srcs: ["arch/arm64/linker_wrapper_begin.S"], | 
 |         }, | 
 |         riscv64: { | 
 |             srcs: ["arch/riscv64/linker_wrapper_begin.S"], | 
 |         }, | 
 |         x86_64: { | 
 |             srcs: ["arch/x86_64/linker_wrapper_begin.S"], | 
 |         }, | 
 |     }, | 
 |  | 
 |     header_libs: ["libc_headers"], | 
 |  | 
 |     // We need to access Bionic private headers in the linker. | 
 |     include_dirs: ["bionic/libc"], | 
 | } | 
 |  | 
 | // ======================================================== | 
 | // linker default configuration | 
 | // ======================================================== | 
 |  | 
 | // Configuration for the linker binary and any of its static libraries. | 
 | cc_defaults { | 
 |     name: "linker_defaults", | 
 |     arch: { | 
 |         arm: { | 
 |             cflags: ["-D__work_around_b_24465209__"], | 
 |         }, | 
 |         x86: { | 
 |             cflags: ["-D__work_around_b_24465209__"], | 
 |         }, | 
 |     }, | 
 |  | 
 |     cflags: linker_common_flags, | 
 |     asflags: linker_common_flags, | 
 |  | 
 |     product_variables: { | 
 |         debuggable: { | 
 |             cppflags: ["-DUSE_LD_CONFIG_FILE"], | 
 |         }, | 
 |     }, | 
 |  | 
 |     cppflags: ["-Wold-style-cast"], | 
 |  | 
 |     static_libs: [ | 
 |         "libziparchive", | 
 |         "libbase", | 
 |         "libz", | 
 |  | 
 |         "libasync_safe", | 
 |  | 
 |         "liblog_for_runtime_apex", | 
 |     ], | 
 |  | 
 |     // We need to access Bionic private headers in the linker. | 
 |     include_dirs: ["bionic/libc"], | 
 | } | 
 |  | 
 | // ======================================================== | 
 | // linker components | 
 | // ======================================================== | 
 |  | 
 | // Enable a module on all targets the linker runs on (ordinary Android targets, Linux Bionic, and | 
 | // native bridge implementations). | 
 | cc_defaults { | 
 |     name: "linker_all_targets", | 
 |     defaults: ["linux_bionic_supported"], | 
 |     recovery_available: true, | 
 |     vendor_ramdisk_available: true, | 
 |     native_bridge_supported: true, | 
 | } | 
 |  | 
 | cc_library_static { | 
 |     name: "liblinker_main", | 
 |     defaults: [ | 
 |         "linker_defaults", | 
 |         "linker_all_targets", | 
 |     ], | 
 |     srcs: ["linker_main.cpp"], | 
 |  | 
 |     // Ensure that the compiler won't insert string function calls before ifuncs are resolved. | 
 |     cflags: ["-ffreestanding"], | 
 |     apex_available: [ | 
 |         "com.android.runtime", | 
 |     ], | 
 | } | 
 |  | 
 | cc_library_static { | 
 |     name: "liblinker_malloc", | 
 |     defaults: [ | 
 |         "linker_defaults", | 
 |         "linker_all_targets", | 
 |     ], | 
 |     srcs: ["linker_memory.cpp"], | 
 |     apex_available: [ | 
 |         "com.android.runtime", | 
 |     ], | 
 | } | 
 |  | 
 | cc_library_static { | 
 |     name: "liblinker_debuggerd_stub", | 
 |     defaults: [ | 
 |         "linker_defaults", | 
 |         "linker_all_targets", | 
 |     ], | 
 |     srcs: ["linker_debuggerd_stub.cpp"], | 
 | } | 
 |  | 
 | // ======================================================== | 
 | // template for the linker binary | 
 | // ======================================================== | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources", | 
 |     srcs: [ | 
 |         "dlfcn.cpp", | 
 |         "linker.cpp", | 
 |         "linker_auxv.cpp", | 
 |         "linker_block_allocator.cpp", | 
 |         "linker_dlwarning.cpp", | 
 |         "linker_cfi.cpp", | 
 |         "linker_config.cpp", | 
 |         "linker_debug.cpp", | 
 |         "linker_gdb_support.cpp", | 
 |         "linker_globals.cpp", | 
 |         "linker_libc_support.c", | 
 |         "linker_libcxx_support.cpp", | 
 |         "linker_namespaces.cpp", | 
 |         "linker_logger.cpp", | 
 |         "linker_mapped_file_fragment.cpp", | 
 |         "linker_note_gnu_property.cpp", | 
 |         "linker_phdr.cpp", | 
 |         "linker_relocate.cpp", | 
 |         "linker_sdk_versions.cpp", | 
 |         "linker_soinfo.cpp", | 
 |         "linker_transparent_hugepage_support.cpp", | 
 |         "linker_tls.cpp", | 
 |         "linker_utils.cpp", | 
 |         "rt.cpp", | 
 |     ], | 
 | } | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources_arm", | 
 |     srcs: [ | 
 |         "arch/arm/begin.S", | 
 |         "arch/arm_neon/linker_gnu_hash_neon.cpp", | 
 |     ], | 
 | } | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources_arm64", | 
 |     srcs: [ | 
 |         "arch/arm64/begin.S", | 
 |         "arch/arm64/tlsdesc_resolver.S", | 
 |         "arch/arm_neon/linker_gnu_hash_neon.cpp", | 
 |     ], | 
 | } | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources_riscv64", | 
 |     srcs: [ | 
 |         "arch/riscv64/begin.S", | 
 |         "arch/riscv64/tlsdesc_resolver.S", | 
 |     ], | 
 | } | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources_x86", | 
 |     srcs: [ | 
 |         "arch/x86/begin.S", | 
 |     ], | 
 | } | 
 |  | 
 | filegroup { | 
 |     name: "linker_sources_x86_64", | 
 |     srcs: [ | 
 |         "arch/x86_64/begin.S", | 
 |     ], | 
 | } | 
 |  | 
 | cc_defaults { | 
 |     name: "linker_version_script_overlay", | 
 |     arch: { | 
 |         arm: { | 
 |             version_script: "linker.arm.map", | 
 |         }, | 
 |         arm64: { | 
 |             version_script: "linker.generic.map", | 
 |         }, | 
 |         riscv64: { | 
 |             version_script: "linker.generic.map", | 
 |         }, | 
 |         x86: { | 
 |             version_script: "linker.generic.map", | 
 |         }, | 
 |         x86_64: { | 
 |             version_script: "linker.generic.map", | 
 |         }, | 
 |     }, | 
 | } | 
 |  | 
 | // A template for the linker binary. May be inherited by native bridge implementations. | 
 | cc_defaults { | 
 |     name: "linker_bin_template", | 
 |     defaults: [ | 
 |         "linker_defaults", | 
 |         "keep_symbols", | 
 |     ], | 
 |  | 
 |     srcs: [":linker_sources"], | 
 |  | 
 |     arch: { | 
 |         arm: { | 
 |             srcs: [":linker_sources_arm"], | 
 |         }, | 
 |         arm64: { | 
 |             srcs: [":linker_sources_arm64"], | 
 |         }, | 
 |         riscv64: { | 
 |             srcs: [":linker_sources_riscv64"], | 
 |         }, | 
 |         x86: { | 
 |             srcs: [":linker_sources_x86"], | 
 |         }, | 
 |         x86_64: { | 
 |             srcs: [":linker_sources_x86_64"], | 
 |         }, | 
 |     }, | 
 |  | 
 |     static_executable: true, | 
 |  | 
 |     // -shared is used to overwrite the -Bstatic and -static flags triggered by enabling | 
 |     // static_executable. The dynamic linker is actually a shared object linked with static | 
 |     // libraries. | 
 |     ldflags: [ | 
 |         "-shared", | 
 |         "-Wl,-Bsymbolic", | 
 |         "-Wl,--exclude-libs,ALL", | 
 |         "-Wl,-soname,ld-android.so", | 
 |         // When the linker applies its own IRELATIVE relocations, it will only read DT_REL[A] and | 
 |         // DT_JMPREL, not DT_ANDROID_REL[A], which can also theoretically contain IRELATIVE | 
 |         // relocations. lld has been taught to not store them there as a bug workaround (see | 
 |         // https://llvm.org/pr86751) but the workaround could be removed at some point in the | 
 |         // future. So we explicitly prevent it from doing so by disabling DT_ANDROID_REL[A] when | 
 |         // linking the linker (DT_RELR cannot encode IRELATIVE relocations). | 
 |         "-Wl,--pack-dyn-relocs=relr", | 
 |     ], | 
 |  | 
 |     // We link libc++_static manually because otherwise the build system will | 
 |     // automatically add libdl to the list of static libraries. | 
 |     stl: "none", | 
 |  | 
 |     // We don't want crtbegin.o (because we have our own arch/*/begin.o), | 
 |     // so unset it just for this module. | 
 |     nocrt: true, | 
 |  | 
 |     // Insert an extra objcopy step to add prefix to symbols. This is needed to prevent gdb | 
 |     // looking up symbols in the linker by mistake. | 
 |     prefix_symbols: "__dl_", | 
 |  | 
 |     sanitize: { | 
 |         hwaddress: false, | 
 |         memtag_stack: false, | 
 |     }, | 
 |  | 
 |     static_libs: [ | 
 |         "liblinker_main", | 
 |         "liblinker_malloc", | 
 |  | 
 |         // We use a version of libc++ built without exceptions, | 
 |         // because accessing EH globals uses ELF TLS, | 
 |         // which is not supported in the loader. | 
 |         "libc++_static_noexcept", | 
 |  | 
 |         "libc_nomalloc", | 
 |         "libc_dynamic_dispatch", | 
 |         "libm", | 
 |         "libunwind", | 
 |     ], | 
 |  | 
 |     system_shared_libs: [], | 
 |  | 
 |     // Opt out of native_coverage when opting out of system_shared_libs | 
 |     native_coverage: false, | 
 | } | 
 |  | 
 | // ======================================================== | 
 | // linker[_asan][64] binary | 
 | // ======================================================== | 
 |  | 
 | cc_binary { | 
 |     name: "linker", | 
 |     defaults: [ | 
 |         "linker_bin_template", | 
 |         "linux_bionic_supported", | 
 |         "linker_version_script_overlay", | 
 |     ], | 
 |  | 
 |     srcs: [ | 
 |         "linker_translate_path.cpp", | 
 |     ], | 
 |  | 
 |     symlinks: ["linker_asan"], | 
 |     arch: { | 
 |         arm64: { | 
 |             symlinks: ["linker_hwasan"], | 
 |         }, | 
 |     }, | 
 |     multilib: { | 
 |         lib64: { | 
 |             suffix: "64", | 
 |         }, | 
 |     }, | 
 |  | 
 |     compile_multilib: "both", | 
 |  | 
 |     recovery_available: true, | 
 |     vendor_ramdisk_available: true, | 
 |     apex_available: [ | 
 |         "//apex_available:platform", | 
 |         "com.android.runtime", | 
 |     ], | 
 |  | 
 |     target: { | 
 |         android: { | 
 |             srcs: [ | 
 |                 "linker_debuggerd_android.cpp", | 
 |             ], | 
 |             static_libs: [ | 
 |                 "libc++demangle_noexcept", | 
 |                 "libdebuggerd_handler_fallback", | 
 |             ], | 
 |         }, | 
 |         linux_bionic: { | 
 |             static_libs: [ | 
 |                 "liblinker_debuggerd_stub", | 
 |             ], | 
 |         }, | 
 |     }, | 
 |  | 
 |     afdo: true, | 
 | } | 
 |  | 
 | // ======================================================== | 
 | // assorted modules | 
 | // ======================================================== | 
 |  | 
 | sh_binary { | 
 |     name: "ldd", | 
 |     src: "ldd.sh", | 
 | } | 
 |  | 
 | // Used to generate binaries that can be backed by transparent hugepages. | 
 | cc_defaults { | 
 |     name: "linker_hugepage_aligned", | 
 |     arch: { | 
 |         arm64: { | 
 |             ldflags: ["-z max-page-size=0x200000"], | 
 |         }, | 
 |         x86_64: { | 
 |             ldflags: ["-z max-page-size=0x200000"], | 
 |         }, | 
 |     }, | 
 | } | 
 |  | 
 | cc_library { | 
 |     srcs: ["ld_android.cpp"], | 
 |     cflags: [ | 
 |         "-Wall", | 
 |         "-Wextra", | 
 |         "-Wunused", | 
 |         "-Werror", | 
 |     ], | 
 |     stl: "none", | 
 |  | 
 |     name: "ld-android", | 
 |     defaults: [ | 
 |         "linux_bionic_supported", | 
 |         "linker_version_script_overlay", | 
 |     ], | 
 |     ramdisk_available: true, | 
 |     vendor_ramdisk_available: true, | 
 |     recovery_available: true, | 
 |     native_bridge_supported: true, | 
 |  | 
 |     nocrt: true, | 
 |     system_shared_libs: [], | 
 |     header_libs: ["libc_headers"], | 
 |  | 
 |     // Opt out of native_coverage when opting out of system_shared_libs | 
 |     native_coverage: false, | 
 |  | 
 |     sanitize: { | 
 |         never: true, | 
 |     }, | 
 |  | 
 |     apex_available: [ | 
 |         "//apex_available:platform", | 
 |         "com.android.runtime", | 
 |     ], | 
 | } | 
 |  | 
 | cc_test { | 
 |     name: "linker-unit-tests", | 
 |     test_suites: ["device-tests"], | 
 |  | 
 |     cflags: [ | 
 |         "-g", | 
 |         "-Wall", | 
 |         "-Wextra", | 
 |         "-Wunused", | 
 |         "-Werror", | 
 |     ], | 
 |  | 
 |     // We need to access Bionic private headers in the linker. | 
 |     include_dirs: ["bionic/libc"], | 
 |  | 
 |     srcs: [ | 
 |         // Tests. | 
 |         "linker_block_allocator_test.cpp", | 
 |         "linker_config_test.cpp", | 
 |         "linked_list_test.cpp", | 
 |         "linker_note_gnu_property_test.cpp", | 
 |         "linker_sleb128_test.cpp", | 
 |         "linker_utils_test.cpp", | 
 |         "linker_gnu_hash_test.cpp", | 
 |         "linker_crt_pad_segment_test.cpp", | 
 |  | 
 |         // Parts of the linker that we're testing. | 
 |         ":elf_note_sources", | 
 |         "linker_block_allocator.cpp", | 
 |         "linker_config.cpp", | 
 |         "linker_debug.cpp", | 
 |         "linker_note_gnu_property.cpp", | 
 |         "linker_test_globals.cpp", | 
 |         "linker_utils.cpp", | 
 |         "linker_phdr.cpp", | 
 |         "linker_mapped_file_fragment.cpp", | 
 |         "linker_sdk_versions.cpp", | 
 |         "linker_dlwarning.cpp", | 
 |     ], | 
 |  | 
 |     static_libs: [ | 
 |         "libasync_safe", | 
 |         "libbase", | 
 |         "liblog_for_runtime_apex", | 
 |         "libprocinfo", // For procinfo::MappedFileSize() | 
 |     ], | 
 |  | 
 |     data_libs: [ | 
 |         "crt_pad_segment_disabled", | 
 |         "crt_pad_segment_enabled", | 
 |         "no_crt_pad_segment", | 
 |     ], | 
 |  | 
 |     arch: { | 
 |         arm: { | 
 |             srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], | 
 |         }, | 
 |         arm64: { | 
 |             srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], | 
 |         }, | 
 |     }, | 
 | } | 
 |  | 
 | cc_benchmark { | 
 |     name: "linker-benchmarks", | 
 |  | 
 |     srcs: [ | 
 |         "linker_gnu_hash_benchmark.cpp", | 
 |     ], | 
 |  | 
 |     arch: { | 
 |         arm: { | 
 |             srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], | 
 |         }, | 
 |         arm64: { | 
 |             srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], | 
 |         }, | 
 |     }, | 
 | } |