1 # The following definitions are the defaults used by all toolchains. 2 # This is included in setup-toolchain.mk just before the inclusion 3 # of the toolchain's specific setup.mk file which can then override 4 # these definitions. 5 # 6 7 # These flags are used to ensure that a binary doesn't reference undefined 8 # flags. 9 TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined 10 11 # These flags are used to enfore the NX (no execute) security feature in the 12 # generated machine code. This adds a special section to the generated shared 13 # libraries that instruct the Linux kernel to disable code execution from 14 # the stack and the heap. 15 TARGET_NO_EXECUTE_CFLAGS := -Wa,--noexecstack 16 TARGET_NO_EXECUTE_LDFLAGS := -Wl,-z,noexecstack 17 18 # NOTE: Ensure that TARGET_LIBGCC is placed after all private objects 19 # and static libraries, but before any other library in the link 20 # command line when generating shared libraries and executables. 21 # 22 # This ensures that all libgcc.a functions required by the target 23 # will be included into it, instead of relying on what's available 24 # on other libraries like libc.so, which may change between system 25 # releases due to toolchain or library changes. 26 # 27 define cmd-build-shared-library 28 $(PRIVATE_CXX) \ 29 -nostdlib -Wl,-soname,$(notdir $@) \ 30 -Wl,-shared,-Bsymbolic \ 31 $(call host-path,\ 32 $(TARGET_CRTBEGIN_SO_O) \ 33 $(PRIVATE_OBJECTS)) \ 34 $(call link-whole-archives,$(PRIVATE_WHOLE_STATIC_LIBRARIES))\ 35 $(call host-path,\ 36 $(PRIVATE_STATIC_LIBRARIES) \ 37 $(PRIVATE_LIBGCC) \ 38 $(PRIVATE_SHARED_LIBRARIES)) \ 39 $(PRIVATE_LDFLAGS) \ 40 $(PRIVATE_LDLIBS) \ 41 $(call host-path,\ 42 $(TARGET_CRTEND_SO_O)) \ 43 -o $(call host-path,$@) 44 endef 45 46 define cmd-build-executable 47 $(PRIVATE_CXX) \ 48 -nostdlib -Bdynamic \ 49 -Wl,-dynamic-linker,/system/bin/linker \ 50 -Wl,--gc-sections \ 51 -Wl,-z,nocopyreloc \ 52 $(call host-path,\ 53 $(TARGET_CRTBEGIN_DYNAMIC_O) \ 54 $(PRIVATE_OBJECTS)) \ 55 $(call link-whole-archives,$(PRIVATE_WHOLE_STATIC_LIBRARIES))\ 56 $(call host-path,\ 57 $(PRIVATE_STATIC_LIBRARIES) \ 58 $(PRIVATE_LIBGCC) \ 59 $(PRIVATE_SHARED_LIBRARIES)) \ 60 $(PRIVATE_LDFLAGS) \ 61 $(PRIVATE_LDLIBS) \ 62 $(call host-path,\ 63 $(TARGET_CRTEND_O)) \ 64 -o $(call host-path,$@) 65 endef 66 67 define cmd-build-static-library 68 $(PRIVATE_AR) $(call host-path,$@) $(call host-path,$(PRIVATE_OBJECTS)) 69 endef 70 71 # The strip command is only used for shared libraries and executables. 72 # It is thus safe to use --strip-unneeded, which is only dangerous 73 # when applied to static libraries or object files. 74 cmd-strip = $(PRIVATE_STRIP) --strip-unneeded $(call host-path,$1) 75 76 TARGET_LIBGCC = $(shell $(TARGET_CC) -print-libgcc-file-name) 77 TARGET_LDLIBS := -lc -lm 78 79 # 80 # IMPORTANT: The following definitions must use lazy assignment because 81 # the value of TOOLCHAIN_PREFIX or TARGET_CFLAGS can be changed later by 82 # the toolchain's setup.mk script. 83 # 84 85 TARGET_CC = $(TOOLCHAIN_PREFIX)gcc 86 TARGET_CFLAGS = 87 88 TARGET_CXX = $(TOOLCHAIN_PREFIX)g++ 89 TARGET_CXXFLAGS = $(TARGET_CFLAGS) -fno-exceptions -fno-rtti 90 91 TARGET_LD = $(TOOLCHAIN_PREFIX)ld 92 TARGET_LDFLAGS := 93 94 TARGET_AR = $(TOOLCHAIN_PREFIX)ar 95 TARGET_ARFLAGS := crs 96 97 TARGET_STRIP = $(TOOLCHAIN_PREFIX)strip 98