github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/core/dynamic_binary.mk (about)

     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/$(notdir $(my_installed_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) $(PRIVATE_READELF)
   103  	@echo "target breakpad: $(PRIVATE_MODULE) ($@)"
   104  	@mkdir -p $(dir $@)
   105  	$(hide) if $(PRIVATE_READELF) -S $< > /dev/null 2>&1 ; then \
   106  	  $(BREAKPAD_DUMP_SYMS) -c $< > $@ ; \
   107  	else \
   108  	  echo "skipped for non-elf file."; \
   109  	  touch $@; \
   110  	fi
   111  $(LOCAL_BUILT_MODULE) : $(breakpad_output)
   112  endif
   113  
   114  ###########################################################
   115  ## Strip
   116  ###########################################################
   117  strip_input := $(symbolic_output)
   118  strip_output := $(LOCAL_BUILT_MODULE)
   119  
   120  my_strip_module := $(firstword \
   121    $(LOCAL_STRIP_MODULE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \
   122    $(LOCAL_STRIP_MODULE))
   123  ifeq ($(my_strip_module),)
   124    my_strip_module := mini-debug-info
   125  endif
   126  
   127  ifeq ($(my_strip_module),mini-debug-info)
   128  # Don't use mini-debug-info on mips (both 32-bit and 64-bit). objcopy checks that all
   129  # SH_MIPS_DWARF sections having name prefix .debug_ or .zdebug_, so there seems no easy
   130  # way using objcopy to remove all debug sections except .debug_frame on mips.
   131  ifneq ($(filter mips mips64,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)),)
   132    my_strip_module := true
   133  endif
   134  endif
   135  
   136  $(strip_output): PRIVATE_STRIP := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
   137  $(strip_output): PRIVATE_OBJCOPY := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY)
   138  $(strip_output): PRIVATE_NM := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NM)
   139  $(strip_output): PRIVATE_READELF := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_READELF)
   140  ifeq ($(my_strip_module),no_debuglink)
   141  $(strip_output): PRIVATE_NO_DEBUGLINK := true
   142  else
   143  $(strip_output): PRIVATE_NO_DEBUGLINK :=
   144  endif
   145  
   146  ifeq ($(my_strip_module),mini-debug-info)
   147  # Strip the binary, but keep debug frames and symbol table in a compressed .gnu_debugdata section.
   148  $(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)
   149  	$(transform-to-stripped-keep-mini-debug-info)
   150  else ifneq ($(filter true no_debuglink,$(my_strip_module)),)
   151  # Strip the binary
   152  $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
   153  	$(transform-to-stripped)
   154  else ifeq ($(my_strip_module),keep_symbols)
   155  # Strip only the debug frames, but leave the symbol table.
   156  $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP)
   157  	$(transform-to-stripped-keep-symbols)
   158  
   159  # A product may be configured to strip everything in some build variants.
   160  # We do the stripping as a post-install command so that LOCAL_BUILT_MODULE
   161  # is still with the symbols and we don't need to clean it (and relink) when
   162  # you switch build variant.
   163  ifneq ($(filter $(STRIP_EVERYTHING_BUILD_VARIANTS),$(TARGET_BUILD_VARIANT)),)
   164  $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := \
   165    $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) --strip-all $(LOCAL_INSTALLED_MODULE)
   166  endif
   167  else
   168  # Don't strip the binary, just copy it.  We can't skip this step
   169  # because a copy of the binary must appear at LOCAL_BUILT_MODULE.
   170  $(strip_output): $(strip_input)
   171  	@echo "target Unstripped: $(PRIVATE_MODULE) ($@)"
   172  	$(copy-file-to-target)
   173  endif # my_strip_module
   174  
   175  $(cleantarget): PRIVATE_CLEAN_FILES += \
   176      $(linked_module) \
   177      $(breakpad_output) \
   178      $(symbolic_output) \
   179      $(strip_output)