Convert linker from Android.mk to Android.bp

Change-Id: Ibf7da301defb2fd7e24fb3f4cd2e967a8f376497
diff --git a/linker/Android.bp b/linker/Android.bp
new file mode 100644
index 0000000..d7e97f0
--- /dev/null
+++ b/linker/Android.bp
@@ -0,0 +1,144 @@
+cc_library_static {
+    name: "liblinker_malloc",
+    clang: true,
+
+    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,
+
+    srcs: [
+        "dlfcn.cpp",
+        "linker.cpp",
+        "linker_block_allocator.cpp",
+        "linker_gdb_support.cpp",
+        "linker_libc_support.c",
+        "linker_logger.cpp",
+        "linker_mapped_file_fragment.cpp",
+        "linker_phdr.cpp",
+        "linker_sdk_versions.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 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",
+        "libdebuggerd_client",
+
+        // 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",
+    multilib: {
+        lib32: {
+            symlinks: ["linker_asan"],
+        },
+        lib64: {
+            suffix: "64",
+            symlinks: ["linker_asan64"],
+       },
+    },
+    target: {
+        android64: {
+            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_",
+}
diff --git a/linker/Android.mk b/linker/Android.mk
index 0faf70b..ea7451c 100644
--- a/linker/Android.mk
+++ b/linker/Android.mk
@@ -1,129 +1,3 @@
 LOCAL_PATH := $(call my-dir)
 
-include $(CLEAR_VARS)
-LOCAL_CLANG := true
-
-LOCAL_MODULE := liblinker_malloc
-
-LOCAL_SRC_FILES := \
-    linker_allocator.cpp \
-    linker_memory.cpp
-
-# We need to access Bionic private headers in the linker.
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/
-
-include $(BUILD_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_CLANG := true
-
-LOCAL_SRC_FILES := \
-    dlfcn.cpp \
-    linker.cpp \
-    linker_block_allocator.cpp \
-    linker_gdb_support.cpp \
-    linker_libc_support.c \
-    linker_logger.cpp \
-    linker_mapped_file_fragment.cpp \
-    linker_phdr.cpp \
-    linker_sdk_versions.cpp \
-    linker_utils.cpp \
-    rt.cpp \
-
-LOCAL_SRC_FILES_arm     := arch/arm/begin.S
-LOCAL_SRC_FILES_arm64   := arch/arm64/begin.S
-LOCAL_SRC_FILES_x86     := arch/x86/begin.c
-LOCAL_SRC_FILES_x86_64  := arch/x86_64/begin.S
-LOCAL_SRC_FILES_mips    := arch/mips/begin.S linker_mips.cpp
-LOCAL_SRC_FILES_mips64  := arch/mips64/begin.S linker_mips.cpp
-
-# -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.
-LOCAL_LDFLAGS := \
-    -shared \
-    -Wl,-Bsymbolic \
-    -Wl,--exclude-libs,ALL \
-
-LOCAL_CFLAGS += \
-    -fno-stack-protector \
-    -Wstrict-overflow=5 \
-    -fvisibility=hidden \
-    -Wall -Wextra -Wunused -Werror \
-
-LOCAL_CFLAGS_arm += -D__work_around_b_24465209__
-LOCAL_CFLAGS_x86 += -D__work_around_b_24465209__
-
-LOCAL_CONLYFLAGS += \
-    -std=gnu99 \
-
-LOCAL_CPPFLAGS += \
-    -Wold-style-cast \
-
-ifeq ($(TARGET_IS_64_BIT),true)
-LOCAL_CPPFLAGS += -DTARGET_IS_64_BIT
-endif
-
-# We need to access Bionic private headers in the linker.
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/
-
-# we don't want crtbegin.o (because we have begin.o), so unset it
-# just for this module
-LOCAL_NO_CRT := true
-# TODO: split out the asflags.
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_STATIC_LIBRARIES := \
-    libc_nomalloc \
-    libziparchive \
-    libutils \
-    libbase \
-    libz \
-    liblog \
-    libdebuggerd_client
-
-# Important: The liblinker_malloc should be the last library in the list
-# to overwrite any other malloc implementations by other static libraries.
-LOCAL_STATIC_LIBRARIES += liblinker_malloc
-
-LOCAL_FORCE_STATIC_EXECUTABLE := true
-
-LOCAL_MODULE := linker
-LOCAL_MODULE_STEM_32 := linker
-LOCAL_MODULE_STEM_64 := linker64
-LOCAL_MULTILIB := both
-
-# Leave the symbols in the shared library so that stack unwinders can produce
-# meaningful name resolution.
-LOCAL_STRIP_MODULE := keep_symbols
-
-# Insert an extra objcopy step to add prefix to symbols. This is needed to prevent gdb
-# looking up symbols in the linker by mistake.
-#
-# Note we are using "=" instead of ":=" to defer the evaluation,
-# because LOCAL_2ND_ARCH_VAR_PREFIX or linked_module isn't set properly yet at this point.
-LOCAL_POST_LINK_CMD = $(hide) $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY) \
-  --prefix-symbols=__dl_ $(linked_module)
-
-include $(BUILD_EXECUTABLE)
-
-
-define add-linker-symlink
-$(eval _from := $(TARGET_OUT)/bin/$(1))
-$(eval _to:=$(2))
-$(_from): $(LOCAL_MODULE_MAKEFILE)
-	@echo "Symlink: $$@ -> $(_to)"
-	@mkdir -p $$(dir $$@)
-	@rm -rf $$@
-	$(hide) ln -sf $(_to) $$@
-endef
-
-$(eval $(call add-linker-symlink,linker_asan,linker))
-ifeq ($(TARGET_IS_64_BIT),true)
-$(eval $(call add-linker-symlink,linker_asan64,linker64))
-endif
-
 include $(call first-makefiles-under,$(LOCAL_PATH))