cc_library_static { name: "liblinker_malloc", clang: true, defaults: ["linux_bionic_supported"], srcs: [ "linker_allocator.cpp", "linker_memory.cpp", ], // We need to access Bionic private headers in the linker. include_dirs: ["bionic/libc"], } cc_binary { clang: true, defaults: ["linux_bionic_supported"], srcs: [ "dlfcn.cpp", "linker.cpp", "linker_block_allocator.cpp", "linker_dlwarning.cpp", "linker_gdb_support.cpp", "linker_globals.cpp", "linker_libc_support.c", "linker_main.cpp", "linker_namespaces.cpp", "linker_logger.cpp", "linker_mapped_file_fragment.cpp", "linker_phdr.cpp", "linker_sdk_versions.cpp", "linker_soinfo.cpp", "linker_utils.cpp", "rt.cpp", ], arch: { arm: { srcs: ["arch/arm/begin.S"], cflags: ["-D__work_around_b_24465209__"], }, arm64: { srcs: ["arch/arm64/begin.S"], }, x86: { srcs: ["arch/x86/begin.c"], cflags: ["-D__work_around_b_24465209__"], }, x86_64: { srcs: ["arch/x86_64/begin.S"], }, mips: { srcs: [ "arch/mips/begin.S", "linker_mips.cpp", ], }, mips64: { srcs: [ "arch/mips64/begin.S", "linker_mips.cpp", ], }, }, // We need to access Bionic private headers in the linker. include_dirs: ["bionic/libc"], // -shared is used to overwrite the -Bstatic and -static // flags triggered by LOCAL_FORCE_STATIC_EXECUTABLE. // This dynamic linker is actually a shared object linked with static libraries. ldflags: [ "-shared", "-Wl,-Bsymbolic", "-Wl,--exclude-libs,ALL", ], cflags: [ "-fno-stack-protector", "-Wstrict-overflow=5", "-fvisibility=hidden", "-Wall", "-Wextra", "-Wunused", "-Werror", ], // TODO: split out the asflags. asflags: [ "-fno-stack-protector", "-Wstrict-overflow=5", "-fvisibility=hidden", "-Wall", "-Wextra", "-Wunused", "-Werror", ], conlyflags: ["-std=gnu99"], cppflags: ["-Wold-style-cast"], // we are going to link libc++_static manually because // when stl is not set to "none" build system adds libdl // to the list of static libraries which needs to be // avoided in the case of building loader. stl: "none", // we don't want crtbegin.o (because we have begin.o), so unset it // just for this module nocrt: true, static_libs: [ "libc_nomalloc", "libziparchive", "libutils", "libbase", "libz", "liblog", "libc++_static", // Important: The liblinker_malloc should be the last library in the list // to overwrite any other malloc implementations by other static libraries. "liblinker_malloc" ], static_executable: true, name: "linker", symlinks: ["linker_asan"], multilib: { lib64: { suffix: "64", }, }, target: { android: { static_libs: ["libdebuggerd_client"], }, android64: { cflags: ["-DTARGET_IS_64_BIT"], }, linux_bionic: { cflags: ["-DTARGET_IS_64_BIT"], }, }, compile_multilib: "both", // Leave the symbols in the shared library so that stack unwinders can produce // meaningful name resolution. strip: { keep_symbols: 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_", }