| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 1 | // Copyright 2016 Google Inc. All rights reserved. | 
 | 2 | // | 
 | 3 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 4 | // you may not use this file except in compliance with the License. | 
 | 5 | // You may obtain a copy of the License at | 
 | 6 | // | 
 | 7 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | 8 | // | 
 | 9 | // Unless required by applicable law or agreed to in writing, software | 
 | 10 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 12 | // See the License for the specific language governing permissions and | 
 | 13 | // limitations under the License. | 
 | 14 |  | 
 | 15 | package cc | 
 | 16 |  | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 17 | import ( | 
 | 18 | 	"android/soong/android" | 
| Yi Kong | 7df0f30 | 2018-10-08 22:10:12 +0000 | [diff] [blame] | 19 | 	"android/soong/cc/config" | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 20 | 	"fmt" | 
| Zhizhou Yang | 9100b1d | 2018-11-30 14:00:04 -0800 | [diff] [blame] | 21 | 	"strconv" | 
| Colin Cross | 4b963f8 | 2016-09-29 14:06:02 -0700 | [diff] [blame] | 22 |  | 
| Colin Cross | 86803cf | 2018-02-15 14:12:26 -0800 | [diff] [blame] | 23 | 	"github.com/google/blueprint" | 
| Colin Cross | 4b963f8 | 2016-09-29 14:06:02 -0700 | [diff] [blame] | 24 | 	"github.com/google/blueprint/proptools" | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 25 | ) | 
 | 26 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 27 | // This file contains the basic functionality for linking against static libraries and shared | 
 | 28 | // libraries.  Final linking into libraries or executables is handled in library.go, binary.go, etc. | 
 | 29 |  | 
 | 30 | type BaseLinkerProperties struct { | 
 | 31 | 	// list of modules whose object files should be linked into this module | 
 | 32 | 	// in their entirety.  For static library modules, all of the .o files from the intermediate | 
 | 33 | 	// directory of the dependency will be linked into this modules .a file.  For a shared library, | 
 | 34 | 	// the dependency's .a file will be linked into this module using -Wl,--whole-archive. | 
 | 35 | 	Whole_static_libs []string `android:"arch_variant,variant_prepend"` | 
 | 36 |  | 
 | 37 | 	// list of modules that should be statically linked into this module. | 
 | 38 | 	Static_libs []string `android:"arch_variant,variant_prepend"` | 
 | 39 |  | 
 | 40 | 	// list of modules that should be dynamically linked into this module. | 
 | 41 | 	Shared_libs []string `android:"arch_variant"` | 
 | 42 |  | 
| Colin Cross | 5950f38 | 2016-12-13 12:50:57 -0800 | [diff] [blame] | 43 | 	// list of modules that should only provide headers for this module. | 
 | 44 | 	Header_libs []string `android:"arch_variant,variant_prepend"` | 
 | 45 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 46 | 	// list of module-specific flags that will be used for all link steps | 
 | 47 | 	Ldflags []string `android:"arch_variant"` | 
 | 48 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 49 | 	// list of system libraries that will be dynamically linked to | 
| Colin Cross | ef88ae2 | 2017-08-18 16:52:25 -0700 | [diff] [blame] | 50 | 	// shared library and executable modules.  If unset, generally defaults to libc, | 
 | 51 | 	// libm, and libdl.  Set to [] to prevent linking against the defaults. | 
| Dan Willemsen | 3a26eef | 2018-12-03 15:25:46 -0800 | [diff] [blame] | 52 | 	System_shared_libs []string `android:"arch_variant"` | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 53 |  | 
 | 54 | 	// allow the module to contain undefined symbols.  By default, | 
 | 55 | 	// modules cannot contain undefined symbols that are not satisified by their immediate | 
 | 56 | 	// dependencies.  Set this flag to true to remove --no-undefined from the linker flags. | 
 | 57 | 	// This flag should only be necessary for compiling low-level libraries like libc. | 
| Colin Cross | be360ae | 2016-12-08 09:45:21 -0800 | [diff] [blame] | 58 | 	Allow_undefined_symbols *bool `android:"arch_variant"` | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 59 |  | 
 | 60 | 	// don't link in libgcc.a | 
 | 61 | 	No_libgcc *bool | 
 | 62 |  | 
| Yi Kong | 2c188be | 2018-10-10 13:43:02 -0700 | [diff] [blame] | 63 | 	// don't link in libclang_rt.builtins-*.a | 
| Yi Kong | 410d834 | 2019-02-15 10:07:18 -0800 | [diff] [blame] | 64 | 	No_libcrt *bool `android:"arch_variant"` | 
| Yi Kong | 2c188be | 2018-10-10 13:43:02 -0700 | [diff] [blame] | 65 |  | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 66 | 	// Use clang lld instead of gnu ld. | 
| Pirama Arumuga Nainar | 2b8959a | 2018-04-20 11:52:42 -0700 | [diff] [blame] | 67 | 	Use_clang_lld *bool `android:"arch_variant"` | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 68 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 69 | 	// -l arguments to pass to linker for host-provided shared libraries | 
 | 70 | 	Host_ldlibs []string `android:"arch_variant"` | 
 | 71 |  | 
 | 72 | 	// list of shared libraries to re-export include directories from. Entries must be | 
 | 73 | 	// present in shared_libs. | 
 | 74 | 	Export_shared_lib_headers []string `android:"arch_variant"` | 
 | 75 |  | 
 | 76 | 	// list of static libraries to re-export include directories from. Entries must be | 
 | 77 | 	// present in static_libs. | 
 | 78 | 	Export_static_lib_headers []string `android:"arch_variant"` | 
 | 79 |  | 
| Colin Cross | 5950f38 | 2016-12-13 12:50:57 -0800 | [diff] [blame] | 80 | 	// list of header libraries to re-export include directories from. Entries must be | 
 | 81 | 	// present in header_libs. | 
 | 82 | 	Export_header_lib_headers []string `android:"arch_variant"` | 
 | 83 |  | 
| Dan Willemsen | b3454ab | 2016-09-28 17:34:58 -0700 | [diff] [blame] | 84 | 	// list of generated headers to re-export include directories from. Entries must be | 
 | 85 | 	// present in generated_headers. | 
 | 86 | 	Export_generated_headers []string `android:"arch_variant"` | 
 | 87 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 88 | 	// don't link in crt_begin and crt_end.  This flag should only be necessary for | 
 | 89 | 	// compiling crt or libc. | 
 | 90 | 	Nocrt *bool `android:"arch_variant"` | 
| Colin Cross | 18c0c5a | 2016-12-01 14:45:23 -0800 | [diff] [blame] | 91 |  | 
 | 92 | 	// group static libraries.  This can resolve missing symbols issues with interdependencies | 
 | 93 | 	// between static libraries, but it is generally better to order them correctly instead. | 
 | 94 | 	Group_static_libs *bool `android:"arch_variant"` | 
| Jiyong Park | 44cf1a7 | 2017-06-16 12:03:55 +0900 | [diff] [blame] | 95 |  | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 96 | 	// list of modules that should be installed with this module.  This is similar to 'required' | 
 | 97 | 	// but '.vendor' suffix will be appended to the module names if the shared libraries have | 
 | 98 | 	// vendor variants and this module uses VNDK. | 
 | 99 | 	Runtime_libs []string `android:"arch_variant"` | 
 | 100 |  | 
| Jiyong Park | 44cf1a7 | 2017-06-16 12:03:55 +0900 | [diff] [blame] | 101 | 	Target struct { | 
 | 102 | 		Vendor struct { | 
| Martin Stjernholm | ef449fe | 2018-11-06 16:12:13 +0000 | [diff] [blame] | 103 | 			// list of shared libs that only should be used to build the vendor | 
 | 104 | 			// variant of the C/C++ module. | 
 | 105 | 			Shared_libs []string | 
 | 106 |  | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 107 | 			// list of shared libs that should not be used to build the vendor variant | 
 | 108 | 			// of the C/C++ module. | 
| Jiyong Park | 44cf1a7 | 2017-06-16 12:03:55 +0900 | [diff] [blame] | 109 | 			Exclude_shared_libs []string | 
| Jiyong Park | 52d25bd | 2017-10-13 09:17:01 +0900 | [diff] [blame] | 110 |  | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 111 | 			// list of static libs that should not be used to build the vendor variant | 
 | 112 | 			// of the C/C++ module. | 
| Jiyong Park | 52d25bd | 2017-10-13 09:17:01 +0900 | [diff] [blame] | 113 | 			Exclude_static_libs []string | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 114 |  | 
| Jiwen 'Steve' Cai | 8dbc653 | 2018-08-08 10:58:34 -0700 | [diff] [blame] | 115 | 			// list of header libs that should not be used to build the vendor variant | 
 | 116 | 			// of the C/C++ module. | 
 | 117 | 			Exclude_header_libs []string | 
 | 118 |  | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 119 | 			// list of runtime libs that should not be installed along with the vendor | 
 | 120 | 			// variant of the C/C++ module. | 
 | 121 | 			Exclude_runtime_libs []string | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 122 |  | 
 | 123 | 			// version script for this vendor variant | 
 | 124 | 			Version_script *string `android:"arch_variant"` | 
| Jiyong Park | 44cf1a7 | 2017-06-16 12:03:55 +0900 | [diff] [blame] | 125 | 		} | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 126 | 		Recovery struct { | 
| Martin Stjernholm | ef449fe | 2018-11-06 16:12:13 +0000 | [diff] [blame] | 127 | 			// list of shared libs that only should be used to build the recovery | 
 | 128 | 			// variant of the C/C++ module. | 
 | 129 | 			Shared_libs []string | 
 | 130 |  | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 131 | 			// list of shared libs that should not be used to build | 
 | 132 | 			// the recovery variant of the C/C++ module. | 
 | 133 | 			Exclude_shared_libs []string | 
 | 134 |  | 
 | 135 | 			// list of static libs that should not be used to build | 
 | 136 | 			// the recovery variant of the C/C++ module. | 
 | 137 | 			Exclude_static_libs []string | 
| Hridya Valsaraju | 280febf | 2018-08-10 09:08:13 -0700 | [diff] [blame] | 138 |  | 
 | 139 | 			// list of header libs that should not be used to build the recovery variant | 
 | 140 | 			// of the C/C++ module. | 
 | 141 | 			Exclude_header_libs []string | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 142 | 		} | 
| Jiyong Park | 44cf1a7 | 2017-06-16 12:03:55 +0900 | [diff] [blame] | 143 | 	} | 
| Colin Cross | 86803cf | 2018-02-15 14:12:26 -0800 | [diff] [blame] | 144 |  | 
 | 145 | 	// make android::build:GetBuildNumber() available containing the build ID. | 
 | 146 | 	Use_version_lib *bool `android:"arch_variant"` | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 147 |  | 
| Chih-Hung Hsieh | 8681471 | 2018-05-23 18:30:46 -0700 | [diff] [blame] | 148 | 	// Generate compact dynamic relocation table, default true. | 
 | 149 | 	Pack_relocations *bool `android:"arch_variant"` | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 150 |  | 
 | 151 | 	// local file name to pass to the linker as --version_script | 
 | 152 | 	Version_script *string `android:"arch_variant"` | 
| Vic Yang | b70617a | 2019-01-14 11:00:10 -0800 | [diff] [blame] | 153 |  | 
 | 154 | 	// Local file name to pass to the linker as --symbol-ordering-file | 
 | 155 | 	Symbol_ordering_file *string `android:"arch_variant"` | 
| Chih-Hung Hsieh | 8681471 | 2018-05-23 18:30:46 -0700 | [diff] [blame] | 156 | } | 
 | 157 |  | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 158 | func NewBaseLinker(sanitize *sanitize) *baseLinker { | 
 | 159 | 	return &baseLinker{sanitize: sanitize} | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 160 | } | 
 | 161 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 162 | // baseLinker provides support for shared_libs, static_libs, and whole_static_libs properties | 
 | 163 | type baseLinker struct { | 
 | 164 | 	Properties        BaseLinkerProperties | 
 | 165 | 	dynamicProperties struct { | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 166 | 		RunPaths   []string `blueprint:"mutated"` | 
 | 167 | 		BuildStubs bool     `blueprint:"mutated"` | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 168 | 	} | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 169 |  | 
 | 170 | 	sanitize *sanitize | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 171 | } | 
 | 172 |  | 
 | 173 | func (linker *baseLinker) appendLdflags(flags []string) { | 
 | 174 | 	linker.Properties.Ldflags = append(linker.Properties.Ldflags, flags...) | 
 | 175 | } | 
 | 176 |  | 
| Colin Cross | 42742b8 | 2016-08-01 13:20:05 -0700 | [diff] [blame] | 177 | func (linker *baseLinker) linkerInit(ctx BaseModuleContext) { | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 178 | 	if ctx.toolchain().Is64Bit() { | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 179 | 		linker.dynamicProperties.RunPaths = append(linker.dynamicProperties.RunPaths, "../lib64", "lib64") | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 180 | 	} else { | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 181 | 		linker.dynamicProperties.RunPaths = append(linker.dynamicProperties.RunPaths, "../lib", "lib") | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 182 | 	} | 
 | 183 | } | 
 | 184 |  | 
| Colin Cross | 42742b8 | 2016-08-01 13:20:05 -0700 | [diff] [blame] | 185 | func (linker *baseLinker) linkerProps() []interface{} { | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 186 | 	return []interface{}{&linker.Properties, &linker.dynamicProperties} | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 187 | } | 
 | 188 |  | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 189 | func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 190 | 	deps.WholeStaticLibs = append(deps.WholeStaticLibs, linker.Properties.Whole_static_libs...) | 
| Colin Cross | 5950f38 | 2016-12-13 12:50:57 -0800 | [diff] [blame] | 191 | 	deps.HeaderLibs = append(deps.HeaderLibs, linker.Properties.Header_libs...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 192 | 	deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Static_libs...) | 
 | 193 | 	deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Shared_libs...) | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 194 | 	deps.RuntimeLibs = append(deps.RuntimeLibs, linker.Properties.Runtime_libs...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 195 |  | 
| Colin Cross | 5950f38 | 2016-12-13 12:50:57 -0800 | [diff] [blame] | 196 | 	deps.ReexportHeaderLibHeaders = append(deps.ReexportHeaderLibHeaders, linker.Properties.Export_header_lib_headers...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 197 | 	deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, linker.Properties.Export_static_lib_headers...) | 
 | 198 | 	deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, linker.Properties.Export_shared_lib_headers...) | 
| Dan Willemsen | b3454ab | 2016-09-28 17:34:58 -0700 | [diff] [blame] | 199 | 	deps.ReexportGeneratedHeaders = append(deps.ReexportGeneratedHeaders, linker.Properties.Export_generated_headers...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 200 |  | 
| Colin Cross | 86803cf | 2018-02-15 14:12:26 -0800 | [diff] [blame] | 201 | 	if Bool(linker.Properties.Use_version_lib) { | 
 | 202 | 		deps.WholeStaticLibs = append(deps.WholeStaticLibs, "libbuildversion") | 
 | 203 | 	} | 
 | 204 |  | 
| Jeff Gaston | af3cc2d | 2017-09-27 17:01:44 -0700 | [diff] [blame] | 205 | 	if ctx.useVndk() { | 
| Martin Stjernholm | ef449fe | 2018-11-06 16:12:13 +0000 | [diff] [blame] | 206 | 		deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Target.Vendor.Shared_libs...) | 
| Jiyong Park | 7447228 | 2017-08-10 00:48:06 +0900 | [diff] [blame] | 207 | 		deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Vendor.Exclude_shared_libs) | 
 | 208 | 		deps.ReexportSharedLibHeaders = removeListFromList(deps.ReexportSharedLibHeaders, linker.Properties.Target.Vendor.Exclude_shared_libs) | 
| Jiyong Park | 52d25bd | 2017-10-13 09:17:01 +0900 | [diff] [blame] | 209 | 		deps.StaticLibs = removeListFromList(deps.StaticLibs, linker.Properties.Target.Vendor.Exclude_static_libs) | 
| Jiwen 'Steve' Cai | 8dbc653 | 2018-08-08 10:58:34 -0700 | [diff] [blame] | 210 | 		deps.HeaderLibs = removeListFromList(deps.HeaderLibs, linker.Properties.Target.Vendor.Exclude_header_libs) | 
| Jiyong Park | 52d25bd | 2017-10-13 09:17:01 +0900 | [diff] [blame] | 211 | 		deps.ReexportStaticLibHeaders = removeListFromList(deps.ReexportStaticLibHeaders, linker.Properties.Target.Vendor.Exclude_static_libs) | 
 | 212 | 		deps.WholeStaticLibs = removeListFromList(deps.WholeStaticLibs, linker.Properties.Target.Vendor.Exclude_static_libs) | 
| Logan Chien | 43d34c3 | 2017-12-20 01:17:32 +0800 | [diff] [blame] | 213 | 		deps.RuntimeLibs = removeListFromList(deps.RuntimeLibs, linker.Properties.Target.Vendor.Exclude_runtime_libs) | 
| Jiyong Park | 7447228 | 2017-08-10 00:48:06 +0900 | [diff] [blame] | 214 | 	} | 
 | 215 |  | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 216 | 	if ctx.inRecovery() { | 
| Martin Stjernholm | ef449fe | 2018-11-06 16:12:13 +0000 | [diff] [blame] | 217 | 		deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Target.Recovery.Shared_libs...) | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 218 | 		deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Recovery.Exclude_shared_libs) | 
 | 219 | 		deps.ReexportSharedLibHeaders = removeListFromList(deps.ReexportSharedLibHeaders, linker.Properties.Target.Recovery.Exclude_shared_libs) | 
 | 220 | 		deps.StaticLibs = removeListFromList(deps.StaticLibs, linker.Properties.Target.Recovery.Exclude_static_libs) | 
| Hridya Valsaraju | 280febf | 2018-08-10 09:08:13 -0700 | [diff] [blame] | 221 | 		deps.HeaderLibs = removeListFromList(deps.HeaderLibs, linker.Properties.Target.Recovery.Exclude_header_libs) | 
 | 222 | 		deps.ReexportHeaderLibHeaders = removeListFromList(deps.ReexportHeaderLibHeaders, linker.Properties.Target.Recovery.Exclude_header_libs) | 
| Jiyong Park | f9332f1 | 2018-02-01 00:54:12 +0900 | [diff] [blame] | 223 | 		deps.ReexportStaticLibHeaders = removeListFromList(deps.ReexportStaticLibHeaders, linker.Properties.Target.Recovery.Exclude_static_libs) | 
 | 224 | 		deps.WholeStaticLibs = removeListFromList(deps.WholeStaticLibs, linker.Properties.Target.Recovery.Exclude_static_libs) | 
 | 225 | 	} | 
 | 226 |  | 
| Yi Kong | 6fb831b | 2018-10-05 19:46:01 +0000 | [diff] [blame] | 227 | 	if ctx.toolchain().Bionic() { | 
| Yi Kong | 19408a3 | 2019-02-12 09:41:18 -0800 | [diff] [blame] | 228 | 		// libclang_rt.builtins, libgcc and libatomic have to be last on the command line | 
| Yi Kong | 2c188be | 2018-10-10 13:43:02 -0700 | [diff] [blame] | 229 | 		if !Bool(linker.Properties.No_libcrt) { | 
| Yi Kong | 19408a3 | 2019-02-12 09:41:18 -0800 | [diff] [blame] | 230 | 			deps.LateStaticLibs = append(deps.LateStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain())) | 
| Yi Kong | 7df0f30 | 2018-10-08 22:10:12 +0000 | [diff] [blame] | 231 | 		} | 
 | 232 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 233 | 		deps.LateStaticLibs = append(deps.LateStaticLibs, "libatomic") | 
 | 234 | 		if !Bool(linker.Properties.No_libgcc) { | 
 | 235 | 			deps.LateStaticLibs = append(deps.LateStaticLibs, "libgcc") | 
 | 236 | 		} | 
 | 237 |  | 
| Logan Chien | 14bd0db | 2019-01-15 21:12:43 +0800 | [diff] [blame] | 238 | 		systemSharedLibs := linker.Properties.System_shared_libs | 
| Dan Willemsen | 3a26eef | 2018-12-03 15:25:46 -0800 | [diff] [blame] | 239 | 		if systemSharedLibs == nil { | 
| Logan Chien | 14bd0db | 2019-01-15 21:12:43 +0800 | [diff] [blame] | 240 | 			// Provide a default system_shared_libs if it is unspecified. Note: If an | 
 | 241 | 			// empty list [] is specified, it implies that the module declines the | 
 | 242 | 			// default system_shared_libs. | 
| Dan Willemsen | 3a26eef | 2018-12-03 15:25:46 -0800 | [diff] [blame] | 243 | 			systemSharedLibs = []string{"libc", "libm", "libdl"} | 
 | 244 | 		} | 
 | 245 |  | 
 | 246 | 		if inList("libdl", deps.SharedLibs) { | 
 | 247 | 			// If system_shared_libs has libc but not libdl, make sure shared_libs does not | 
 | 248 | 			// have libdl to avoid loading libdl before libc. | 
 | 249 | 			if inList("libc", systemSharedLibs) { | 
 | 250 | 				if !inList("libdl", systemSharedLibs) { | 
 | 251 | 					ctx.PropertyErrorf("shared_libs", | 
 | 252 | 						"libdl must be in system_shared_libs, not shared_libs") | 
 | 253 | 				} | 
 | 254 | 				_, deps.SharedLibs = removeFromList("libdl", deps.SharedLibs) | 
 | 255 | 			} | 
 | 256 | 		} | 
 | 257 |  | 
 | 258 | 		// If libc and libdl are both in system_shared_libs make sure libdl comes after libc | 
 | 259 | 		// to avoid loading libdl before libc. | 
 | 260 | 		if inList("libdl", systemSharedLibs) && inList("libc", systemSharedLibs) && | 
 | 261 | 			indexList("libdl", systemSharedLibs) < indexList("libc", systemSharedLibs) { | 
 | 262 | 			ctx.PropertyErrorf("system_shared_libs", "libdl must be after libc") | 
 | 263 | 		} | 
 | 264 |  | 
 | 265 | 		deps.LateSharedLibs = append(deps.LateSharedLibs, systemSharedLibs...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 266 | 	} | 
 | 267 |  | 
| Doug Horn | c32c6b0 | 2019-01-17 14:44:05 -0800 | [diff] [blame] | 268 | 	if ctx.Fuchsia() { | 
 | 269 | 		if ctx.ModuleName() != "libbioniccompat" && | 
 | 270 | 			ctx.ModuleName() != "libcompiler_rt-extras" && | 
 | 271 | 			ctx.ModuleName() != "libcompiler_rt" { | 
 | 272 | 			deps.StaticLibs = append(deps.StaticLibs, "libbioniccompat") | 
 | 273 | 		} | 
 | 274 | 		if ctx.ModuleName() != "libcompiler_rt" && ctx.ModuleName() != "libcompiler_rt-extras" { | 
 | 275 | 			deps.LateStaticLibs = append(deps.LateStaticLibs, "libcompiler_rt") | 
 | 276 | 		} | 
 | 277 |  | 
 | 278 | 	} | 
 | 279 |  | 
| Colin Cross | 3edeee1 | 2017-04-04 12:59:48 -0700 | [diff] [blame] | 280 | 	if ctx.Windows() { | 
| Josh Gao | 7bd4c5c | 2017-02-23 17:52:24 -0800 | [diff] [blame] | 281 | 		deps.LateStaticLibs = append(deps.LateStaticLibs, "libwinpthread") | 
 | 282 | 	} | 
 | 283 |  | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 284 | 	// Version_script is not needed when linking stubs lib where the version | 
 | 285 | 	// script is created from the symbol map file. | 
 | 286 | 	if !linker.dynamicProperties.BuildStubs { | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 287 | 		android.ExtractSourceDeps(ctx, linker.Properties.Version_script) | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 288 | 		android.ExtractSourceDeps(ctx, | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 289 | 			linker.Properties.Target.Vendor.Version_script) | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 290 | 	} | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 291 |  | 
| Vic Yang | b70617a | 2019-01-14 11:00:10 -0800 | [diff] [blame] | 292 | 	android.ExtractSourceDeps(ctx, linker.Properties.Symbol_ordering_file) | 
 | 293 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 294 | 	return deps | 
 | 295 | } | 
 | 296 |  | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 297 | func (linker *baseLinker) useClangLld(ctx ModuleContext) bool { | 
| Chih-Hung Hsieh | e5ac609 | 2018-04-24 16:00:01 -0700 | [diff] [blame] | 298 | 	// Clang lld is not ready for for Darwin host executables yet. | 
 | 299 | 	// See https://lld.llvm.org/AtomLLD.html for status of lld for Mach-O. | 
 | 300 | 	if ctx.Darwin() { | 
 | 301 | 		return false | 
 | 302 | 	} | 
| Pirama Arumuga Nainar | 8a852e7 | 2018-06-19 20:07:54 -0700 | [diff] [blame] | 303 | 	// http://b/110800681 - lld cannot link Android's Windows modules yet. | 
 | 304 | 	if ctx.Windows() { | 
 | 305 | 		return false | 
 | 306 | 	} | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 307 | 	if linker.Properties.Use_clang_lld != nil { | 
 | 308 | 		return Bool(linker.Properties.Use_clang_lld) | 
 | 309 | 	} | 
| Dan Willemsen | fa2aee1 | 2018-10-21 19:47:01 -0700 | [diff] [blame] | 310 | 	return true | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 311 | } | 
 | 312 |  | 
| Zhizhou Yang | 9100b1d | 2018-11-30 14:00:04 -0800 | [diff] [blame] | 313 | // Check whether the SDK version is not older than the specific one | 
 | 314 | func CheckSdkVersionAtLeast(ctx ModuleContext, SdkVersion int) bool { | 
 | 315 | 	if ctx.sdkVersion() == "current" { | 
 | 316 | 		return true | 
 | 317 | 	} | 
 | 318 | 	parsedSdkVersion, err := strconv.Atoi(ctx.sdkVersion()) | 
 | 319 | 	if err != nil { | 
 | 320 | 		ctx.PropertyErrorf("sdk_version", | 
 | 321 | 			"Invalid sdk_version value (must be int or current): %q", | 
 | 322 | 			ctx.sdkVersion()) | 
 | 323 | 	} | 
 | 324 | 	if parsedSdkVersion < SdkVersion { | 
 | 325 | 		return false | 
 | 326 | 	} | 
 | 327 | 	return true | 
 | 328 | } | 
 | 329 |  | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 330 | // ModuleContext extends BaseModuleContext | 
 | 331 | // BaseModuleContext should know if LLD is used? | 
| Colin Cross | 42742b8 | 2016-08-01 13:20:05 -0700 | [diff] [blame] | 332 | func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 333 | 	toolchain := ctx.toolchain() | 
 | 334 |  | 
| Colin Cross | 324a457 | 2017-11-02 23:09:41 -0700 | [diff] [blame] | 335 | 	hod := "Host" | 
 | 336 | 	if ctx.Os().Class == android.Device { | 
 | 337 | 		hod = "Device" | 
 | 338 | 	} | 
 | 339 |  | 
| Dan Willemsen | 8536d6b | 2018-10-07 20:54:34 -0700 | [diff] [blame] | 340 | 	if linker.useClangLld(ctx) { | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 341 | 		flags.LdFlags = append(flags.LdFlags, fmt.Sprintf("${config.%sGlobalLldflags}", hod)) | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 342 | 		if !BoolDefault(linker.Properties.Pack_relocations, true) { | 
| Chih-Hung Hsieh | 8681471 | 2018-05-23 18:30:46 -0700 | [diff] [blame] | 343 | 			flags.LdFlags = append(flags.LdFlags, "-Wl,--pack-dyn-relocs=none") | 
| Zhizhou Yang | 9100b1d | 2018-11-30 14:00:04 -0800 | [diff] [blame] | 344 | 		} else if ctx.Device() { | 
 | 345 | 			// The SHT_RELR relocations is only supported by API level >= 28. | 
 | 346 | 			// Do not turn this on if older version NDK is used. | 
 | 347 | 			if !ctx.useSdk() || CheckSdkVersionAtLeast(ctx, 28) { | 
 | 348 | 				flags.LdFlags = append(flags.LdFlags, "-Wl,--pack-dyn-relocs=android+relr") | 
 | 349 | 				flags.LdFlags = append(flags.LdFlags, "-Wl,--use-android-relr-tags") | 
 | 350 | 			} | 
| Chih-Hung Hsieh | 8681471 | 2018-05-23 18:30:46 -0700 | [diff] [blame] | 351 | 		} | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 352 | 	} else { | 
 | 353 | 		flags.LdFlags = append(flags.LdFlags, fmt.Sprintf("${config.%sGlobalLdflags}", hod)) | 
 | 354 | 	} | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 355 | 	if Bool(linker.Properties.Allow_undefined_symbols) { | 
 | 356 | 		if ctx.Darwin() { | 
 | 357 | 			// darwin defaults to treating undefined symbols as errors | 
 | 358 | 			flags.LdFlags = append(flags.LdFlags, "-Wl,-undefined,dynamic_lookup") | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 359 | 		} | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 360 | 	} else if !ctx.Darwin() { | 
 | 361 | 		flags.LdFlags = append(flags.LdFlags, "-Wl,--no-undefined") | 
 | 362 | 	} | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 363 |  | 
| Dan Willemsen | 8536d6b | 2018-10-07 20:54:34 -0700 | [diff] [blame] | 364 | 	if linker.useClangLld(ctx) { | 
| Chih-Hung Hsieh | 02b4da5 | 2018-04-03 11:33:34 -0700 | [diff] [blame] | 365 | 		flags.LdFlags = append(flags.LdFlags, toolchain.ClangLldflags()) | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 366 | 	} else { | 
| Dan Willemsen | 8536d6b | 2018-10-07 20:54:34 -0700 | [diff] [blame] | 367 | 		flags.LdFlags = append(flags.LdFlags, toolchain.ClangLdflags()) | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 368 | 	} | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 369 |  | 
| Doug Horn | c32c6b0 | 2019-01-17 14:44:05 -0800 | [diff] [blame] | 370 | 	if !ctx.toolchain().Bionic() && !ctx.Fuchsia() { | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 371 | 		CheckBadHostLdlibs(ctx, "host_ldlibs", linker.Properties.Host_ldlibs) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 372 |  | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 373 | 		flags.LdFlags = append(flags.LdFlags, linker.Properties.Host_ldlibs...) | 
| Colin Cross | c5fdbb8 | 2017-09-08 12:45:18 -0700 | [diff] [blame] | 374 |  | 
| Colin Cross | 87dd963 | 2017-11-03 13:31:05 -0700 | [diff] [blame] | 375 | 		if !ctx.Windows() { | 
 | 376 | 			// Add -ldl, -lpthread, -lm and -lrt to host builds to match the default behavior of device | 
 | 377 | 			// builds | 
 | 378 | 			flags.LdFlags = append(flags.LdFlags, | 
 | 379 | 				"-ldl", | 
 | 380 | 				"-lpthread", | 
 | 381 | 				"-lm", | 
 | 382 | 			) | 
 | 383 | 			if !ctx.Darwin() { | 
 | 384 | 				flags.LdFlags = append(flags.LdFlags, "-lrt") | 
| Colin Cross | c5fdbb8 | 2017-09-08 12:45:18 -0700 | [diff] [blame] | 385 | 			} | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 386 | 		} | 
 | 387 | 	} | 
 | 388 |  | 
| Doug Horn | c32c6b0 | 2019-01-17 14:44:05 -0800 | [diff] [blame] | 389 | 	if ctx.Fuchsia() { | 
 | 390 | 		flags.LdFlags = append(flags.LdFlags, "-lfdio", "-lzircon") | 
 | 391 | 	} | 
 | 392 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 393 | 	CheckBadLinkerFlags(ctx, "ldflags", linker.Properties.Ldflags) | 
 | 394 |  | 
| Colin Cross | 4b963f8 | 2016-09-29 14:06:02 -0700 | [diff] [blame] | 395 | 	flags.LdFlags = append(flags.LdFlags, proptools.NinjaAndShellEscape(linker.Properties.Ldflags)...) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 396 |  | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 397 | 	if ctx.Host() { | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 398 | 		rpath_prefix := `\$$ORIGIN/` | 
 | 399 | 		if ctx.Darwin() { | 
 | 400 | 			rpath_prefix = "@loader_path/" | 
 | 401 | 		} | 
 | 402 |  | 
| Dan Willemsen | 6f91fbf | 2017-09-18 22:45:15 -0700 | [diff] [blame] | 403 | 		if !ctx.static() { | 
 | 404 | 			for _, rpath := range linker.dynamicProperties.RunPaths { | 
 | 405 | 				flags.LdFlags = append(flags.LdFlags, "-Wl,-rpath,"+rpath_prefix+rpath) | 
 | 406 | 			} | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 407 | 		} | 
 | 408 | 	} | 
 | 409 |  | 
| Jeff Gaston | af3cc2d | 2017-09-27 17:01:44 -0700 | [diff] [blame] | 410 | 	if ctx.useSdk() && (ctx.Arch().ArchType != android.Mips && ctx.Arch().ArchType != android.Mips64) { | 
| Colin Cross | 6774e28 | 2017-08-11 13:23:57 -0700 | [diff] [blame] | 411 | 		// The bionic linker now has support gnu style hashes (which are much faster!), but shipping | 
 | 412 | 		// to older devices requires the old style hash. Fortunately, we can build with both and | 
 | 413 | 		// it'll work anywhere. | 
 | 414 | 		// This is not currently supported on MIPS architectures. | 
 | 415 | 		flags.LdFlags = append(flags.LdFlags, "-Wl,--hash-style=both") | 
 | 416 | 	} | 
 | 417 |  | 
| Dan Willemsen | 8536d6b | 2018-10-07 20:54:34 -0700 | [diff] [blame] | 418 | 	flags.LdFlags = append(flags.LdFlags, toolchain.ToolchainClangLdflags()) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 419 |  | 
| Colin Cross | 18c0c5a | 2016-12-01 14:45:23 -0800 | [diff] [blame] | 420 | 	if Bool(linker.Properties.Group_static_libs) { | 
 | 421 | 		flags.GroupStaticLibs = true | 
 | 422 | 	} | 
 | 423 |  | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 424 | 	// Version_script is not needed when linking stubs lib where the version | 
 | 425 | 	// script is created from the symbol map file. | 
 | 426 | 	if !linker.dynamicProperties.BuildStubs { | 
 | 427 | 		versionScript := ctx.ExpandOptionalSource( | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 428 | 			linker.Properties.Version_script, "version_script") | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 429 |  | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 430 | 		if ctx.useVndk() && linker.Properties.Target.Vendor.Version_script != nil { | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 431 | 			versionScript = ctx.ExpandOptionalSource( | 
| Colin Cross | c17727d | 2018-10-24 12:42:09 -0700 | [diff] [blame] | 432 | 				linker.Properties.Target.Vendor.Version_script, | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 433 | 				"target.vendor.version_script") | 
 | 434 | 		} | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 435 |  | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 436 | 		if versionScript.Valid() { | 
 | 437 | 			if ctx.Darwin() { | 
 | 438 | 				ctx.PropertyErrorf("version_script", "Not supported on Darwin") | 
 | 439 | 			} else { | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 440 | 				flags.LdFlags = append(flags.LdFlags, | 
| Jiyong Park | 7ed9de3 | 2018-10-15 22:25:07 +0900 | [diff] [blame] | 441 | 					"-Wl,--version-script,"+versionScript.String()) | 
 | 442 | 				flags.LdFlagsDeps = append(flags.LdFlagsDeps, versionScript.Path()) | 
 | 443 |  | 
 | 444 | 				if linker.sanitize.isSanitizerEnabled(cfi) { | 
 | 445 | 					cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath) | 
 | 446 | 					flags.LdFlags = append(flags.LdFlags, | 
 | 447 | 						"-Wl,--version-script,"+cfiExportsMap.String()) | 
 | 448 | 					flags.LdFlagsDeps = append(flags.LdFlagsDeps, cfiExportsMap) | 
 | 449 | 				} | 
| Dan Albert | 61f3212 | 2018-07-26 14:00:24 -0700 | [diff] [blame] | 450 | 			} | 
 | 451 | 		} | 
 | 452 | 	} | 
 | 453 |  | 
| Vic Yang | b70617a | 2019-01-14 11:00:10 -0800 | [diff] [blame] | 454 | 	if !linker.dynamicProperties.BuildStubs { | 
 | 455 | 		symbolOrderingFile := ctx.ExpandOptionalSource( | 
 | 456 | 			linker.Properties.Symbol_ordering_file, "Symbol_ordering_file") | 
 | 457 | 		if symbolOrderingFile.Valid() { | 
 | 458 | 			flags.LdFlags = append(flags.LdFlags, | 
 | 459 | 				"-Wl,--symbol-ordering-file,"+symbolOrderingFile.String()) | 
 | 460 | 			flags.LdFlagsDeps = append(flags.LdFlagsDeps, symbolOrderingFile.Path()) | 
 | 461 | 		} | 
 | 462 | 	} | 
 | 463 |  | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 464 | 	return flags | 
 | 465 | } | 
 | 466 |  | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 467 | func (linker *baseLinker) link(ctx ModuleContext, | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 468 | 	flags Flags, deps PathDeps, objs Objects) android.Path { | 
| Colin Cross | b916a38 | 2016-07-29 17:28:03 -0700 | [diff] [blame] | 469 | 	panic(fmt.Errorf("baseLinker doesn't know how to link")) | 
| Colin Cross | 4d9c2d1 | 2016-07-29 12:48:20 -0700 | [diff] [blame] | 470 | } | 
| Colin Cross | 86803cf | 2018-02-15 14:12:26 -0800 | [diff] [blame] | 471 |  | 
 | 472 | // Injecting version symbols | 
 | 473 | // Some host modules want a version number, but we don't want to rebuild it every time.  Optionally add a step | 
 | 474 | // after linking that injects a constant placeholder with the current version number. | 
 | 475 |  | 
 | 476 | func init() { | 
 | 477 | 	pctx.HostBinToolVariable("symbolInjectCmd", "symbol_inject") | 
 | 478 | } | 
 | 479 |  | 
 | 480 | var injectVersionSymbol = pctx.AndroidStaticRule("injectVersionSymbol", | 
 | 481 | 	blueprint.RuleParams{ | 
 | 482 | 		Command: "$symbolInjectCmd -i $in -o $out -s soong_build_number " + | 
 | 483 | 			"-from 'SOONG BUILD NUMBER PLACEHOLDER' -v $buildNumberFromFile", | 
 | 484 | 		CommandDeps: []string{"$symbolInjectCmd"}, | 
 | 485 | 	}, | 
 | 486 | 	"buildNumberFromFile") | 
 | 487 |  | 
 | 488 | func (linker *baseLinker) injectVersionSymbol(ctx ModuleContext, in android.Path, out android.WritablePath) { | 
 | 489 | 	ctx.Build(pctx, android.BuildParams{ | 
 | 490 | 		Rule:        injectVersionSymbol, | 
 | 491 | 		Description: "inject version symbol", | 
 | 492 | 		Input:       in, | 
 | 493 | 		Output:      out, | 
 | 494 | 		Args: map[string]string{ | 
 | 495 | 			"buildNumberFromFile": ctx.Config().BuildNumberFromFile(), | 
 | 496 | 		}, | 
 | 497 | 	}) | 
 | 498 | } |