Home | History | Annotate | Download | only in linker
      1 LOCAL_PATH:= $(call my-dir)
      2 include $(CLEAR_VARS)
      3 
      4 LOCAL_SRC_FILES:= \
      5 	arch/$(TARGET_ARCH)/begin.S \
      6 	linker.c \
      7 	linker_environ.c \
      8 	linker_format.c \
      9 	rt.c \
     10 	dlfcn.c \
     11 	debugger.c
     12 
     13 ifeq ($(TARGET_ARCH),sh)
     14 # SH-4A series virtual address range from 0x00000000 to 0x7FFFFFFF.
     15 LINKER_TEXT_BASE := 0x70000100
     16 else
     17 # This is aligned to 4K page boundary so that both GNU ld and gold work.  Gold
     18 # actually produces a correct binary with starting address 0xB0000100 but the
     19 # extra objcopy step to rename symbols causes the resulting binary to be misaligned
     20 # and unloadable.  Increasing the alignment adds an extra 3840 bytes in padding
     21 # but switching to gold saves about 1M of space.
     22 LINKER_TEXT_BASE := 0xB0001000
     23 endif
     24 
     25 # The maximum size set aside for the linker, from
     26 # LINKER_TEXT_BASE rounded down to a megabyte.
     27 LINKER_AREA_SIZE := 0x01000000
     28 
     29 LOCAL_LDFLAGS := -Wl,-Ttext,$(LINKER_TEXT_BASE)
     30 
     31 LOCAL_CFLAGS += -DPRELINK
     32 LOCAL_CFLAGS += -DLINKER_TEXT_BASE=$(LINKER_TEXT_BASE)
     33 LOCAL_CFLAGS += -DLINKER_AREA_SIZE=$(LINKER_AREA_SIZE)
     34 
     35 # Set LINKER_DEBUG to either 1 or 0
     36 #
     37 LOCAL_CFLAGS += -DLINKER_DEBUG=0
     38 
     39 # we need to access the Bionic private header <bionic_tls.h>
     40 # in the linker; duplicate the HAVE_ARM_TLS_REGISTER definition
     41 # from the libc build
     42 ifeq ($(TARGET_ARCH)-$(ARCH_ARM_HAVE_TLS_REGISTER),arm-true)
     43     LOCAL_CFLAGS += -DHAVE_ARM_TLS_REGISTER
     44 endif
     45 LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/private
     46 
     47 ifeq ($(TARGET_ARCH),arm)
     48 LOCAL_CFLAGS += -DANDROID_ARM_LINKER
     49 else
     50   ifeq ($(TARGET_ARCH),x86)
     51     LOCAL_CFLAGS += -DANDROID_X86_LINKER
     52   else
     53     ifeq ($(TARGET_ARCH),sh)
     54       LOCAL_CFLAGS += -DANDROID_SH_LINKER
     55     else
     56       $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
     57     endif
     58   endif
     59 endif
     60 
     61 LOCAL_MODULE:= linker
     62 
     63 LOCAL_STATIC_LIBRARIES := libc_nomalloc
     64 
     65 #LOCAL_FORCE_STATIC_EXECUTABLE := true # not necessary when not including BUILD_EXECUTABLE
     66 
     67 #
     68 # include $(BUILD_EXECUTABLE)
     69 #
     70 # Instead of including $(BUILD_EXECUTABLE), we execute the steps to create an executable by
     71 # hand, as we want to insert an extra step that is not supported by the build system, and
     72 # is probably specific the linker only, so there's no need to modify the build system for
     73 # the purpose.
     74 
     75 LOCAL_MODULE_CLASS := EXECUTABLES
     76 LOCAL_MODULE_SUFFIX := $(TARGET_EXECUTABLE_SUFFIX)
     77 
     78 
     79 include $(BUILD_SYSTEM)/dynamic_binary.mk
     80 
     81 $(linked_module): $(TARGET_CRTBEGIN_STATIC_O) $(all_objects) $(all_libraries) $(TARGET_CRTEND_O)
     82 	$(transform-o-to-static-executable)
     83 	@echo "target PrefixSymbols: $(PRIVATE_MODULE) ($@)"
     84 	$(hide) $(TARGET_OBJCOPY) --prefix-symbols=__dl_ $@
     85 
     86 #
     87 # end of BUILD_EXECUTABLE hack
     88 #
     89 
     90 # we don't want crtbegin.o (because we have begin.o), so unset it
     91 # just for this module
     92 $(LOCAL_BUILT_MODULE): TARGET_CRTBEGIN_STATIC_O :=
     93 # This line is not strictly necessary because the dynamic linker is built
     94 # as a static executable, but it won't hurt if in the future we start
     95 # building the linker as a dynamic one.
     96 $(LOCAL_BUILT_MODULE): TARGET_CRTBEGIN_DYNAMIC_O :=
     97