build linker and linker64 on 64-bit architectures

Change-Id: I400bbaf5a779fc427de4c3d86c66548b0179b10d
diff --git a/linker/Android.mk b/linker/Android.mk
index bdc54de..1d03a9c 100644
--- a/linker/Android.mk
+++ b/linker/Android.mk
@@ -1,86 +1,9 @@
 LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
 
-ifeq ($(TARGET_ARCH),x86)
-    linker_begin_extension := c
-else
-    linker_begin_extension := S
+linker_2nd_arch_var_prefix :=
+include $(LOCAL_PATH)/linker.mk
+
+ifdef TARGET_2ND_ARCH
+linker_2nd_arch_var_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
+include $(LOCAL_PATH)/linker.mk
 endif
-
-LOCAL_SRC_FILES:= \
-    arch/$(TARGET_ARCH)/begin.$(linker_begin_extension) \
-    debugger.cpp \
-    dlfcn.cpp \
-    linker.cpp \
-    linker_environ.cpp \
-    linker_phdr.cpp \
-    rt.cpp \
-
-LOCAL_LDFLAGS := \
-    -shared \
-    -Wl,-Bsymbolic \
-    -Wl,--exclude-libs,ALL \
-
-LOCAL_CFLAGS += \
-    -fno-stack-protector \
-    -Wstrict-overflow=5 \
-    -fvisibility=hidden \
-    -Wall -Wextra -Werror \
-
-LOCAL_CONLYFLAGS += \
-    -std=gnu99 \
-
-LOCAL_CPPFLAGS += \
-    -std=gnu++11 \
-
-# We need to access Bionic private headers in the linker.
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/
-
-ifeq ($(TARGET_IS_64_BIT),true)
-    LOCAL_MODULE := linker64
-else
-    LOCAL_MODULE := linker
-endif
-
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_STATIC_LIBRARIES := libc_nomalloc
-
-#LOCAL_FORCE_STATIC_EXECUTABLE := true # not necessary when not including BUILD_EXECUTABLE
-
-#
-# include $(BUILD_EXECUTABLE)
-#
-# Instead of including $(BUILD_EXECUTABLE), we execute the steps to create an executable by
-# hand, as we want to insert an extra step that is not supported by the build system, and
-# is probably specific the linker only, so there's no need to modify the build system for
-# the purpose.
-
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX := $(TARGET_EXECUTABLE_SUFFIX)
-
-# 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)
-
-include $(BUILD_SYSTEM)/dynamic_binary.mk
-
-# See build/core/executable.mk
-$(linked_module): PRIVATE_TARGET_GLOBAL_LD_DIRS := $(TARGET_GLOBAL_LD_DIRS)
-$(linked_module): PRIVATE_TARGET_GLOBAL_LDFLAGS := $(TARGET_GLOBAL_LDFLAGS)
-$(linked_module): PRIVATE_TARGET_FDO_LIB := $(TARGET_FDO_LIB)
-$(linked_module): PRIVATE_TARGET_LIBGCC := $(TARGET_LIBGCC)
-$(linked_module): PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O := $(TARGET_CRTBEGIN_DYNAMIC_O)
-$(linked_module): PRIVATE_TARGET_CRTBEGIN_STATIC_O := $(TARGET_CRTBEGIN_STATIC_O)
-$(linked_module): PRIVATE_TARGET_CRTEND_O := $(TARGET_CRTEND_O)
-$(linked_module): $(TARGET_CRTBEGIN_STATIC_O) $(all_objects) $(all_libraries) $(TARGET_CRTEND_O)
-	$(transform-o-to-static-executable)
-	@echo "target PrefixSymbols: $(PRIVATE_MODULE) ($@)"
-	$(hide) $(TARGET_OBJCOPY) --prefix-symbols=__dl_ $@
-
-#
-# end of BUILD_EXECUTABLE hack
-#
diff --git a/linker/linker.mk b/linker/linker.mk
new file mode 100644
index 0000000..384435a
--- /dev/null
+++ b/linker/linker.mk
@@ -0,0 +1,58 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+    debugger.cpp \
+    dlfcn.cpp \
+    linker.cpp \
+    linker_environ.cpp \
+    linker_phdr.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
+
+LOCAL_LDFLAGS := \
+    -shared \
+    -Wl,-Bsymbolic \
+    -Wl,--exclude-libs,ALL \
+
+LOCAL_CFLAGS += \
+    -fno-stack-protector \
+    -Wstrict-overflow=5 \
+    -fvisibility=hidden \
+    -Wall -Wextra -Werror \
+
+LOCAL_CONLYFLAGS += \
+    -std=gnu99 \
+
+LOCAL_CPPFLAGS += \
+    -std=gnu++11 \
+
+# 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_PATH)/linker.mk $(LOCAL_PATH)/linker_executable.mk
+
+LOCAL_STATIC_LIBRARIES := libc_nomalloc
+
+LOCAL_FORCE_STATIC_EXECUTABLE := true # not necessary when not including BUILD_EXECUTABLE
+
+LOCAL_2ND_ARCH_VAR_PREFIX := $(linker_2nd_arch_var_prefix)
+
+ifeq ($(TARGET_IS_64_BIT)|$(linker_2nd_arch_var_prefix),true|)
+LOCAL_MODULE := linker64
+else
+LOCAL_MODULE := linker
+endif
+
+include $(LOCAL_PATH)/linker_executable.mk
diff --git a/linker/linker_executable.mk b/linker/linker_executable.mk
new file mode 100644
index 0000000..4902a0c
--- /dev/null
+++ b/linker/linker_executable.mk
@@ -0,0 +1,26 @@
+
+#
+# Instead of including $(BUILD_EXECUTABLE), we execute the steps to create an executable by
+# hand, as we want to insert an extra objcopy step that is not supported by the build
+# system, and is probably specific the linker only, so there's no need to modify the build
+# system for the purpose.
+#
+
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE_SUFFIX := $(TARGET_EXECUTABLE_SUFFIX)
+
+include $(BUILD_SYSTEM)/dynamic_binary.mk
+
+# See build/core/executable_internal.mk
+$(linked_module): PRIVATE_TARGET_GLOBAL_LD_DIRS := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS)
+$(linked_module): PRIVATE_TARGET_GLOBAL_LDFLAGS := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LDFLAGS)
+$(linked_module): PRIVATE_TARGET_FDO_LIB := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_LIB)
+$(linked_module): PRIVATE_TARGET_LIBGCC := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBGCC)
+$(linked_module): PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTBEGIN_DYNAMIC_O)
+$(linked_module): PRIVATE_TARGET_CRTBEGIN_STATIC_O := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTBEGIN_STATIC_O)
+$(linked_module): PRIVATE_TARGET_CRTEND_O := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTEND_O)
+$(linked_module): PRIVATE_TARGET_OBJCOPY := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY)
+$(linked_module): $(TARGET_CRTBEGIN_STATIC_O) $(all_objects) $(all_libraries) $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTEND_O)
+	$(transform-o-to-static-executable)
+	@echo "target PrefixSymbols: $(PRIVATE_MODULE) ($@)"
+	$(hide) $(PRIVATE_TARGET_OBJCOPY) --prefix-symbols=__dl_ $@