Home | History | Annotate | Download | only in core
      1 ###########################################################
      2 ## Standard rules for building any target-side binaries
      3 ## with dynamic linkage (dynamic libraries or executables
      4 ## that link with dynamic libraries)
      5 ##
      6 ## Files including this file must define a rule to build
      7 ## the target $(linked_module).
      8 ###########################################################
      9 
     10 # This constraint means that we can hard-code any $(TARGET_*) variables.
     11 ifdef LOCAL_IS_HOST_MODULE
     12 $(error This file should not be used to build host binaries.  Included by (or near) $(lastword $(filter-out config/%,$(MAKEFILE_LIST))))
     13 endif
     14 
     15 # The name of the target file, without any path prepended.
     16 # This duplicates logic from base_rules.mk because we need to
     17 # know its results before base_rules.mk is included.
     18 include $(BUILD_SYSTEM)/configure_module_stem.mk
     19 
     20 intermediates := $(call local-intermediates-dir,,$(LOCAL_2ND_ARCH_VAR_PREFIX))
     21 
     22 # Define the target that is the unmodified output of the linker.
     23 # The basename of this target must be the same as the final output
     24 # binary name, because it's used to set the "soname" in the binary.
     25 # The includer of this file will define a rule to build this target.
     26 linked_module := $(intermediates)/LINKED/$(my_built_module_stem)
     27 
     28 ALL_ORIGINAL_DYNAMIC_BINARIES += $(linked_module)
     29 
     30 # Because TARGET_SYMBOL_FILTER_FILE depends on ALL_ORIGINAL_DYNAMIC_BINARIES,
     31 # the linked_module rules won't necessarily inherit the PRIVATE_
     32 # variables from LOCAL_BUILT_MODULE.  This tells binary.make to explicitly
     33 # define the PRIVATE_ variables for linked_module as well as for
     34 # LOCAL_BUILT_MODULE.
     35 LOCAL_INTERMEDIATE_TARGETS := $(linked_module)
     36 
     37 ###################################
     38 include $(BUILD_SYSTEM)/binary.mk
     39 ###################################
     40 
     41 ###########################################################
     42 ## Pack relocation tables
     43 ###########################################################
     44 relocation_packer_input := $(linked_module)
     45 relocation_packer_output := $(intermediates)/PACKED/$(my_built_module_stem)
     46 
     47 my_pack_module_relocations := false
     48 ifneq ($(DISABLE_RELOCATION_PACKER),true)
     49     my_pack_module_relocations := $(firstword \
     50       $(LOCAL_PACK_MODULE_RELOCATIONS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \
     51       $(LOCAL_PACK_MODULE_RELOCATIONS))
     52 endif
     53 
     54 ifeq ($(my_pack_module_relocations),)
     55   my_pack_module_relocations := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_PACK_MODULE_RELOCATIONS)
     56 endif
     57 
     58 # Do not pack relocations for executables. Because packing results in
     59 # non-zero p_vaddr which causes kernel to load executables to lower
     60 # address (starting at 0x8000) http://b/20665974
     61 ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),)
     62   my_pack_module_relocations := false
     63 endif
     64 
     65 # TODO (dimitry): Relocation packer is not yet available for darwin
     66 ifneq ($(HOST_OS),linux)
     67   my_pack_module_relocations := false
     68 endif
     69 
     70 ifeq (true,$(my_pack_module_relocations))
     71 # Pack relocations
     72 $(relocation_packer_output): $(relocation_packer_input)
     73 	$(pack-elf-relocations)
     74 else
     75 $(relocation_packer_output): $(relocation_packer_input)
     76 	@echo "target Unpacked: $(PRIVATE_MODULE) ($@)"
     77 	$(copy-file-to-target)
     78 endif
     79 
     80 ###########################################################
     81 ## Store a copy with symbols for symbolic debugging
     82 ###########################################################
     83 ifeq ($(LOCAL_UNSTRIPPED_PATH),)
     84 my_unstripped_path := $(TARGET_OUT_UNSTRIPPED)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_module_path))
     85 else
     86 my_unstripped_path := $(LOCAL_UNSTRIPPED_PATH)
     87 endif
     88 symbolic_input := $(relocation_packer_output)
     89 symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem)
     90 $(symbolic_output) : $(symbolic_input)
     91 	@echo "target Symbolic: $(PRIVATE_MODULE) ($@)"
     92 	$(copy-file-to-target)
     93 
     94 ###########################################################
     95 ## Store breakpad symbols
     96 ###########################################################
     97 
     98 ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true)
     99 my_breakpad_path := $(TARGET_OUT_BREAKPAD)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_module_path))
    100 breakpad_input := $(relocation_packer_output)
    101 breakpad_output := $(my_breakpad_path)/$(my_installed_module_stem).sym
    102 $(breakpad_output) : $(breakpad_input) | $(BREAKPAD_DUMP_SYMS)
    103 	@echo "target breakpad: $(PRIVATE_MODULE) ($@)"
    104 	@mkdir -p $(dir $@)
    105 	$(hide) $(BREAKPAD_DUMP_SYMS) -c $< > $@
    106 $(LOCAL_BUILT_MODULE) : $(breakpad_output)
    107 endif
    108 
    109 ###########################################################
    110 ## Strip
    111 ###########################################################
    112 strip_input := $(symbolic_output)
    113 strip_output := $(LOCAL_BUILT_MODULE)
    114 
    115 my_strip_module := $(firstword \
    116   $(LOCAL_STRIP_MODULE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \
    117   $(LOCAL_STRIP_MODULE))
    118 ifeq ($(my_strip_module),)
    119   my_strip_module := mini-debug-info
    120 endif
    121 
    122 ifeq ($(my_strip_module),mini-debug-info)
    123 # Don't use mini-debug-info on mips (both 32-bit and 64-bit). objcopy checks that all
    124 # SH_MIPS_DWARF sections having name prefix .debug_ or .zdebug_, so there seems no easy
    125 # way using objcopy to remove all debug sections except .debug_frame on mips.
    126 ifneq ($(filter mips mips64,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)),)
    127   my_strip_module := true
    128 endif
    129 endif
    130 
    131 $(strip_output): PRIVATE_STRIP := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
    132 $(strip_output): PRIVATE_OBJCOPY := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY)
    133 $(strip_output): PRIVATE_NM := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NM)
    134 $(strip_output): PRIVATE_READELF := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_READELF)
    135 ifeq ($(my_strip_module),no_debuglink)
    136 $(strip_output): PRIVATE_NO_DEBUGLINK := true
    137 else
    138 $(strip_output): PRIVATE_NO_DEBUGLINK :=
    139 endif
    140 
    141 ifeq ($(my_strip_module),mini-debug-info)
    142 # Strip the binary, but keep debug frames and symbol table in a compressed .gnu_debugdata section.
    143 $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY) $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NM)
    144 	$(transform-to-stripped-keep-mini-debug-info)
    145 else ifneq ($(filter true no_debuglink,$(my_strip_module)),)
    146 # Strip the binary
    147 $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
    148 	$(transform-to-stripped)
    149 else ifeq ($(my_strip_module),keep_symbols)
    150 # Strip only the debug frames, but leave the symbol table.
    151 $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
    152 	$(transform-to-stripped-keep-symbols)
    153 
    154 # A product may be configured to strip everything in some build variants.
    155 # We do the stripping as a post-install command so that LOCAL_BUILT_MODULE
    156 # is still with the symbols and we don't need to clean it (and relink) when
    157 # you switch build variant.
    158 ifneq ($(filter $(STRIP_EVERYTHING_BUILD_VARIANTS),$(TARGET_BUILD_VARIANT)),)
    159 $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := \
    160   $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) --strip-all $(LOCAL_INSTALLED_MODULE)
    161 endif
    162 else
    163 # Don't strip the binary, just copy it.  We can't skip this step
    164 # because a copy of the binary must appear at LOCAL_BUILT_MODULE.
    165 $(strip_output): $(strip_input)
    166 	@echo "target Unstripped: $(PRIVATE_MODULE) ($@)"
    167 	$(copy-file-to-target)
    168 endif # my_strip_module
    169 
    170 $(cleantarget): PRIVATE_CLEAN_FILES += \
    171     $(linked_module) \
    172     $(breakpad_output) \
    173     $(symbolic_output) \
    174     $(strip_output)
    175