1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workertype BinaryLinkerProperties struct { 26*333d2b36SAndroid Build Coastguard Worker // compile executable with -static 27*333d2b36SAndroid Build Coastguard Worker Static_executable *bool `android:"arch_variant"` 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker // set the name of the output 30*333d2b36SAndroid Build Coastguard Worker Stem *string `android:"arch_variant"` 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Worker // append to the name of the output 33*333d2b36SAndroid Build Coastguard Worker Suffix *string `android:"arch_variant"` 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker // if set, add an extra objcopy --prefix-symbols= step 36*333d2b36SAndroid Build Coastguard Worker Prefix_symbols *string 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker // if set, install a symlink to the preferred architecture 39*333d2b36SAndroid Build Coastguard Worker Symlink_preferred_arch *bool `android:"arch_variant"` 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker // install symlinks to the binary. Symlink names will have the suffix and the binary 42*333d2b36SAndroid Build Coastguard Worker // extension (if any) appended 43*333d2b36SAndroid Build Coastguard Worker Symlinks []string `android:"arch_variant"` 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker // override the dynamic linker 46*333d2b36SAndroid Build Coastguard Worker DynamicLinker string `blueprint:"mutated"` 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker // Names of modules to be overridden. Listed modules can only be other binaries 49*333d2b36SAndroid Build Coastguard Worker // (in Make or Soong). 50*333d2b36SAndroid Build Coastguard Worker // This does not completely prevent installation of the overridden binaries, but if both 51*333d2b36SAndroid Build Coastguard Worker // binaries would be installed by default (in PRODUCT_PACKAGES) the other binary will be removed 52*333d2b36SAndroid Build Coastguard Worker // from PRODUCT_PACKAGES. 53*333d2b36SAndroid Build Coastguard Worker Overrides []string 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker // Inject boringssl hash into the shared library. This is only intended for use by external/boringssl. 56*333d2b36SAndroid Build Coastguard Worker Inject_bssl_hash *bool `android:"arch_variant"` 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc init() { 60*333d2b36SAndroid Build Coastguard Worker RegisterBinaryBuildComponents(android.InitRegistrationContext) 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workerfunc RegisterBinaryBuildComponents(ctx android.RegistrationContext) { 64*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_binary", BinaryFactory) 65*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_binary_host", BinaryHostFactory) 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker// cc_binary produces a binary that is runnable on a device. 69*333d2b36SAndroid Build Coastguard Workerfunc BinaryFactory() android.Module { 70*333d2b36SAndroid Build Coastguard Worker module, _ := newBinary(android.HostAndDeviceSupported) 71*333d2b36SAndroid Build Coastguard Worker return module.Init() 72*333d2b36SAndroid Build Coastguard Worker} 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker// cc_binary_host produces a binary that is runnable on a host. 75*333d2b36SAndroid Build Coastguard Workerfunc BinaryHostFactory() android.Module { 76*333d2b36SAndroid Build Coastguard Worker module, _ := newBinary(android.HostSupported) 77*333d2b36SAndroid Build Coastguard Worker return module.Init() 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker// 81*333d2b36SAndroid Build Coastguard Worker// Executables 82*333d2b36SAndroid Build Coastguard Worker// 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker// binaryDecorator is a decorator containing information for C++ binary modules. 85*333d2b36SAndroid Build Coastguard Workertype binaryDecorator struct { 86*333d2b36SAndroid Build Coastguard Worker *baseLinker 87*333d2b36SAndroid Build Coastguard Worker *baseInstaller 88*333d2b36SAndroid Build Coastguard Worker stripper Stripper 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker Properties BinaryLinkerProperties 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker toolPath android.OptionalPath 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker // Location of the linked, unstripped binary 95*333d2b36SAndroid Build Coastguard Worker unstrippedOutputFile android.Path 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker // Names of symlinks to be installed for use in LOCAL_MODULE_SYMLINKS 98*333d2b36SAndroid Build Coastguard Worker symlinks []string 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker // If the module has symlink_preferred_arch set, the name of the symlink to the 101*333d2b36SAndroid Build Coastguard Worker // binary for the preferred arch. 102*333d2b36SAndroid Build Coastguard Worker preferredArchSymlink string 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker // Output archive of gcno coverage information 105*333d2b36SAndroid Build Coastguard Worker coverageOutputFile android.OptionalPath 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker // Location of the files that should be copied to dist dir when requested 108*333d2b36SAndroid Build Coastguard Worker distFiles android.TaggedDistFiles 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker // Action command lines to run directly after the binary is installed. For example, 111*333d2b36SAndroid Build Coastguard Worker // may be used to symlink runtime dependencies (such as bionic) alongside installation. 112*333d2b36SAndroid Build Coastguard Worker postInstallCmds []string 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Workervar _ linker = (*binaryDecorator)(nil) 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker// linkerProps returns the list of individual properties objects relevant 118*333d2b36SAndroid Build Coastguard Worker// for this binary. 119*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) linkerProps() []interface{} { 120*333d2b36SAndroid Build Coastguard Worker return append(binary.baseLinker.linkerProps(), 121*333d2b36SAndroid Build Coastguard Worker &binary.Properties, 122*333d2b36SAndroid Build Coastguard Worker &binary.stripper.StripProperties) 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker// getStemWithoutSuffix returns the main section of the name to use for the symlink of 127*333d2b36SAndroid Build Coastguard Worker// the main output file of this binary module. This may be derived from the module name 128*333d2b36SAndroid Build Coastguard Worker// or other property overrides. 129*333d2b36SAndroid Build Coastguard Worker// For the full symlink name, the `Suffix` property of a binary module must be appended. 130*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) getStemWithoutSuffix(ctx BaseModuleContext) string { 131*333d2b36SAndroid Build Coastguard Worker stem := ctx.baseModuleName() 132*333d2b36SAndroid Build Coastguard Worker if String(binary.Properties.Stem) != "" { 133*333d2b36SAndroid Build Coastguard Worker stem = String(binary.Properties.Stem) 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker return stem 137*333d2b36SAndroid Build Coastguard Worker} 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker// getStem returns the full name to use for the symlink of the main output file of this binary 140*333d2b36SAndroid Build Coastguard Worker// module. This may be derived from the module name and/or other property overrides. 141*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) getStem(ctx BaseModuleContext) string { 142*333d2b36SAndroid Build Coastguard Worker return binary.getStemWithoutSuffix(ctx) + String(binary.Properties.Suffix) 143*333d2b36SAndroid Build Coastguard Worker} 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker// linkerDeps augments and returns the given `deps` to contain dependencies on 146*333d2b36SAndroid Build Coastguard Worker// modules common to most binaries, such as bionic libraries. 147*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { 148*333d2b36SAndroid Build Coastguard Worker deps = binary.baseLinker.linkerDeps(ctx, deps) 149*333d2b36SAndroid Build Coastguard Worker if binary.baseLinker.Properties.crt() { 150*333d2b36SAndroid Build Coastguard Worker if binary.static() { 151*333d2b36SAndroid Build Coastguard Worker deps.CrtBegin = ctx.toolchain().CrtBeginStaticBinary() 152*333d2b36SAndroid Build Coastguard Worker deps.CrtEnd = ctx.toolchain().CrtEndStaticBinary() 153*333d2b36SAndroid Build Coastguard Worker } else { 154*333d2b36SAndroid Build Coastguard Worker deps.CrtBegin = ctx.toolchain().CrtBeginSharedBinary() 155*333d2b36SAndroid Build Coastguard Worker deps.CrtEnd = ctx.toolchain().CrtEndSharedBinary() 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker if binary.static() { 160*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = append(deps.StaticLibs, deps.SystemSharedLibs...) 161*333d2b36SAndroid Build Coastguard Worker } 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker if ctx.toolchain().Bionic() { 164*333d2b36SAndroid Build Coastguard Worker if binary.static() { 165*333d2b36SAndroid Build Coastguard Worker if ctx.selectedStl() == "libc++_static" { 166*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = append(deps.StaticLibs, "libm", "libc") 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker // static libraries libcompiler_rt, libc and libc_nomalloc need to be linked with 169*333d2b36SAndroid Build Coastguard Worker // --start-group/--end-group along with libgcc. If they are in deps.StaticLibs, 170*333d2b36SAndroid Build Coastguard Worker // move them to the beginning of deps.LateStaticLibs 171*333d2b36SAndroid Build Coastguard Worker var groupLibs []string 172*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs, groupLibs = filterList(deps.StaticLibs, 173*333d2b36SAndroid Build Coastguard Worker []string{"libc", "libc_nomalloc", "libcompiler_rt"}) 174*333d2b36SAndroid Build Coastguard Worker deps.LateStaticLibs = append(groupLibs, deps.LateStaticLibs...) 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker if ctx.Os() == android.LinuxBionic && !binary.static() { 178*333d2b36SAndroid Build Coastguard Worker deps.DynamicLinker = "linker" 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker if !binary.static() && inList("libc", deps.StaticLibs) { 183*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("statically linking libc to dynamic executable, please remove libc\n" + 184*333d2b36SAndroid Build Coastguard Worker "from static libs or set static_executable: true") 185*333d2b36SAndroid Build Coastguard Worker } 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Worker return deps 188*333d2b36SAndroid Build Coastguard Worker} 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker// NewBinary builds and returns a new Module corresponding to a C++ binary. 191*333d2b36SAndroid Build Coastguard Worker// Individual module implementations which comprise a C++ binary should call this function, 192*333d2b36SAndroid Build Coastguard Worker// set some fields on the result, and then call the Init function. 193*333d2b36SAndroid Build Coastguard Workerfunc NewBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) { 194*333d2b36SAndroid Build Coastguard Worker return newBinary(hod) 195*333d2b36SAndroid Build Coastguard Worker} 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Workerfunc newBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) { 198*333d2b36SAndroid Build Coastguard Worker module := newModule(hod, android.MultilibFirst) 199*333d2b36SAndroid Build Coastguard Worker binary := &binaryDecorator{ 200*333d2b36SAndroid Build Coastguard Worker baseLinker: NewBaseLinker(module.sanitize), 201*333d2b36SAndroid Build Coastguard Worker baseInstaller: NewBaseInstaller("bin", "", InstallInSystem), 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker module.compiler = NewBaseCompiler() 204*333d2b36SAndroid Build Coastguard Worker module.linker = binary 205*333d2b36SAndroid Build Coastguard Worker module.installer = binary 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker // Allow module to be added as member of an sdk/module_exports. 208*333d2b36SAndroid Build Coastguard Worker module.sdkMemberTypes = []android.SdkMemberType{ 209*333d2b36SAndroid Build Coastguard Worker ccBinarySdkMemberType, 210*333d2b36SAndroid Build Coastguard Worker } 211*333d2b36SAndroid Build Coastguard Worker return module, binary 212*333d2b36SAndroid Build Coastguard Worker} 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker// linkerInit initializes dynamic properties of the linker (such as runpath) based 215*333d2b36SAndroid Build Coastguard Worker// on properties of this binary. 216*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) linkerInit(ctx BaseModuleContext) { 217*333d2b36SAndroid Build Coastguard Worker binary.baseLinker.linkerInit(ctx) 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Worker if ctx.Os().Linux() && ctx.Host() { 220*333d2b36SAndroid Build Coastguard Worker // Unless explicitly specified otherwise, host static binaries are built with -static 221*333d2b36SAndroid Build Coastguard Worker // if HostStaticBinaries is true for the product configuration. 222*333d2b36SAndroid Build Coastguard Worker if binary.Properties.Static_executable == nil && ctx.Config().HostStaticBinaries() { 223*333d2b36SAndroid Build Coastguard Worker binary.Properties.Static_executable = BoolPtr(true) 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() || ctx.Windows() { 228*333d2b36SAndroid Build Coastguard Worker // Static executables are not supported on Darwin or Windows 229*333d2b36SAndroid Build Coastguard Worker binary.Properties.Static_executable = nil 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) static() bool { 234*333d2b36SAndroid Build Coastguard Worker return Bool(binary.Properties.Static_executable) 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) staticBinary() bool { 238*333d2b36SAndroid Build Coastguard Worker return binary.static() 239*333d2b36SAndroid Build Coastguard Worker} 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) binary() bool { 242*333d2b36SAndroid Build Coastguard Worker return true 243*333d2b36SAndroid Build Coastguard Worker} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker// linkerFlags returns a Flags object containing linker flags that are defined 246*333d2b36SAndroid Build Coastguard Worker// by this binary, or that are implied by attributes of this binary. These flags are 247*333d2b36SAndroid Build Coastguard Worker// combined with the given flags. 248*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags { 249*333d2b36SAndroid Build Coastguard Worker flags = binary.baseLinker.linkerFlags(ctx, flags) 250*333d2b36SAndroid Build Coastguard Worker 251*333d2b36SAndroid Build Coastguard Worker // Passing -pie to clang for Windows binaries causes a warning that -pie is unused. 252*333d2b36SAndroid Build Coastguard Worker if ctx.Host() && !ctx.Windows() && !binary.static() { 253*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().IsEnvTrue("DISABLE_HOST_PIE") { 254*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, "-pie") 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker } 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker // MinGW spits out warnings about -fPIC even for -fpie?!) being ignored because 259*333d2b36SAndroid Build Coastguard Worker // all code is position independent, and then those warnings get promoted to 260*333d2b36SAndroid Build Coastguard Worker // errors. 261*333d2b36SAndroid Build Coastguard Worker if !ctx.Windows() { 262*333d2b36SAndroid Build Coastguard Worker flags.Global.CFlags = append(flags.Global.CFlags, "-fPIE") 263*333d2b36SAndroid Build Coastguard Worker } 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker if ctx.toolchain().Bionic() { 266*333d2b36SAndroid Build Coastguard Worker if binary.static() { 267*333d2b36SAndroid Build Coastguard Worker // Clang driver needs -static to create static executable. 268*333d2b36SAndroid Build Coastguard Worker // However, bionic/linker uses -shared to overwrite. 269*333d2b36SAndroid Build Coastguard Worker // Linker for x86 targets does not allow coexistance of -static and -shared, 270*333d2b36SAndroid Build Coastguard Worker // so we add -static only if -shared is not used. 271*333d2b36SAndroid Build Coastguard Worker if !inList("-shared", flags.Local.LdFlags) { 272*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, "-static") 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, 276*333d2b36SAndroid Build Coastguard Worker "-nostdlib", 277*333d2b36SAndroid Build Coastguard Worker "-Bstatic", 278*333d2b36SAndroid Build Coastguard Worker "-Wl,--gc-sections", 279*333d2b36SAndroid Build Coastguard Worker ) 280*333d2b36SAndroid Build Coastguard Worker } else { // not static 281*333d2b36SAndroid Build Coastguard Worker if flags.DynamicLinker == "" { 282*333d2b36SAndroid Build Coastguard Worker if binary.Properties.DynamicLinker != "" { 283*333d2b36SAndroid Build Coastguard Worker flags.DynamicLinker = binary.Properties.DynamicLinker 284*333d2b36SAndroid Build Coastguard Worker } else { 285*333d2b36SAndroid Build Coastguard Worker switch ctx.Os() { 286*333d2b36SAndroid Build Coastguard Worker case android.Android: 287*333d2b36SAndroid Build Coastguard Worker if ctx.bootstrap() && !ctx.inRecovery() && !ctx.inRamdisk() && !ctx.inVendorRamdisk() { 288*333d2b36SAndroid Build Coastguard Worker flags.DynamicLinker = "/system/bin/bootstrap/linker" 289*333d2b36SAndroid Build Coastguard Worker } else { 290*333d2b36SAndroid Build Coastguard Worker flags.DynamicLinker = "/system/bin/linker" 291*333d2b36SAndroid Build Coastguard Worker } 292*333d2b36SAndroid Build Coastguard Worker if flags.Toolchain.Is64Bit() { 293*333d2b36SAndroid Build Coastguard Worker flags.DynamicLinker += "64" 294*333d2b36SAndroid Build Coastguard Worker } 295*333d2b36SAndroid Build Coastguard Worker case android.LinuxBionic: 296*333d2b36SAndroid Build Coastguard Worker flags.DynamicLinker = "" 297*333d2b36SAndroid Build Coastguard Worker default: 298*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("unknown dynamic linker") 299*333d2b36SAndroid Build Coastguard Worker } 300*333d2b36SAndroid Build Coastguard Worker } 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker if ctx.Os() == android.LinuxBionic { 303*333d2b36SAndroid Build Coastguard Worker // Use the dlwrap entry point, but keep _start around so 304*333d2b36SAndroid Build Coastguard Worker // that it can be used by host_bionic_inject 305*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, 306*333d2b36SAndroid Build Coastguard Worker "-Wl,--entry=__dlwrap__start", 307*333d2b36SAndroid Build Coastguard Worker "-Wl,--undefined=_start", 308*333d2b36SAndroid Build Coastguard Worker ) 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker } 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, 313*333d2b36SAndroid Build Coastguard Worker "-pie", 314*333d2b36SAndroid Build Coastguard Worker "-nostdlib", 315*333d2b36SAndroid Build Coastguard Worker "-Bdynamic", 316*333d2b36SAndroid Build Coastguard Worker "-Wl,--gc-sections", 317*333d2b36SAndroid Build Coastguard Worker "-Wl,-z,nocopyreloc", 318*333d2b36SAndroid Build Coastguard Worker ) 319*333d2b36SAndroid Build Coastguard Worker } 320*333d2b36SAndroid Build Coastguard Worker } else { // not bionic 321*333d2b36SAndroid Build Coastguard Worker if binary.static() { 322*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, "-static") 323*333d2b36SAndroid Build Coastguard Worker } 324*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() { 325*333d2b36SAndroid Build Coastguard Worker flags.Global.LdFlags = append(flags.Global.LdFlags, "-Wl,-headerpad_max_install_names") 326*333d2b36SAndroid Build Coastguard Worker } 327*333d2b36SAndroid Build Coastguard Worker } 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker return flags 330*333d2b36SAndroid Build Coastguard Worker} 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker// link registers actions to link this binary, and sets various fields 333*333d2b36SAndroid Build Coastguard Worker// on this binary to reflect information that should be exported up the build 334*333d2b36SAndroid Build Coastguard Worker// tree (for example, exported flags and include paths). 335*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) link(ctx ModuleContext, 336*333d2b36SAndroid Build Coastguard Worker flags Flags, deps PathDeps, objs Objects) android.Path { 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker fileName := binary.getStem(ctx) + flags.Toolchain.ExecutableSuffix() 339*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, fileName) 340*333d2b36SAndroid Build Coastguard Worker ret := outputFile 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker var linkerDeps android.Paths 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker if flags.DynamicLinker != "" { 345*333d2b36SAndroid Build Coastguard Worker flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-dynamic-linker,"+flags.DynamicLinker) 346*333d2b36SAndroid Build Coastguard Worker } else if (ctx.toolchain().Bionic() || ctx.toolchain().Musl()) && !binary.static() { 347*333d2b36SAndroid Build Coastguard Worker flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--no-dynamic-linker") 348*333d2b36SAndroid Build Coastguard Worker } 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() && deps.DarwinSecondArchOutput.Valid() { 351*333d2b36SAndroid Build Coastguard Worker fatOutputFile := outputFile 352*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, "pre-fat", fileName) 353*333d2b36SAndroid Build Coastguard Worker transformDarwinUniversalBinary(ctx, fatOutputFile, outputFile, deps.DarwinSecondArchOutput.Path()) 354*333d2b36SAndroid Build Coastguard Worker } 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker builderFlags := flagsToBuilderFlags(flags) 357*333d2b36SAndroid Build Coastguard Worker stripFlags := flagsToStripFlags(flags) 358*333d2b36SAndroid Build Coastguard Worker if binary.stripper.NeedsStrip(ctx) { 359*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() { 360*333d2b36SAndroid Build Coastguard Worker stripFlags.StripUseGnuStrip = true 361*333d2b36SAndroid Build Coastguard Worker } 362*333d2b36SAndroid Build Coastguard Worker strippedOutputFile := outputFile 363*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, "unstripped", fileName) 364*333d2b36SAndroid Build Coastguard Worker binary.stripper.StripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile, stripFlags) 365*333d2b36SAndroid Build Coastguard Worker } 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker binary.unstrippedOutputFile = outputFile 368*333d2b36SAndroid Build Coastguard Worker 369*333d2b36SAndroid Build Coastguard Worker if String(binary.Properties.Prefix_symbols) != "" { 370*333d2b36SAndroid Build Coastguard Worker afterPrefixSymbols := outputFile 371*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, "unprefixed", fileName) 372*333d2b36SAndroid Build Coastguard Worker transformBinaryPrefixSymbols(ctx, String(binary.Properties.Prefix_symbols), outputFile, 373*333d2b36SAndroid Build Coastguard Worker builderFlags, afterPrefixSymbols) 374*333d2b36SAndroid Build Coastguard Worker } 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Worker outputFile = maybeInjectBoringSSLHash(ctx, outputFile, binary.Properties.Inject_bssl_hash, fileName) 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker // If use_version_lib is true, make an android::build::GetBuildNumber() function available. 379*333d2b36SAndroid Build Coastguard Worker if Bool(binary.baseLinker.Properties.Use_version_lib) { 380*333d2b36SAndroid Build Coastguard Worker if ctx.Host() { 381*333d2b36SAndroid Build Coastguard Worker versionedOutputFile := outputFile 382*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, "unversioned", fileName) 383*333d2b36SAndroid Build Coastguard Worker binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile) 384*333d2b36SAndroid Build Coastguard Worker } else { 385*333d2b36SAndroid Build Coastguard Worker // When dist'ing a library or binary that has use_version_lib set, always 386*333d2b36SAndroid Build Coastguard Worker // distribute the stamped version, even for the device. 387*333d2b36SAndroid Build Coastguard Worker versionedOutputFile := android.PathForModuleOut(ctx, "versioned", fileName) 388*333d2b36SAndroid Build Coastguard Worker binary.distFiles = android.MakeDefaultDistFiles(versionedOutputFile) 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker if binary.stripper.NeedsStrip(ctx) { 391*333d2b36SAndroid Build Coastguard Worker out := android.PathForModuleOut(ctx, "versioned-stripped", fileName) 392*333d2b36SAndroid Build Coastguard Worker binary.distFiles = android.MakeDefaultDistFiles(out) 393*333d2b36SAndroid Build Coastguard Worker binary.stripper.StripExecutableOrSharedLib(ctx, versionedOutputFile, out, stripFlags) 394*333d2b36SAndroid Build Coastguard Worker } 395*333d2b36SAndroid Build Coastguard Worker 396*333d2b36SAndroid Build Coastguard Worker binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile) 397*333d2b36SAndroid Build Coastguard Worker } 398*333d2b36SAndroid Build Coastguard Worker } 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Worker var validations android.Paths 401*333d2b36SAndroid Build Coastguard Worker 402*333d2b36SAndroid Build Coastguard Worker // Handle host bionic linker symbols. 403*333d2b36SAndroid Build Coastguard Worker if ctx.Os() == android.LinuxBionic && !binary.static() { 404*333d2b36SAndroid Build Coastguard Worker verifyFile := android.PathForModuleOut(ctx, "host_bionic_verify.stamp") 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Worker if !deps.DynamicLinker.Valid() { 407*333d2b36SAndroid Build Coastguard Worker panic("Non-static host bionic modules must have a dynamic linker") 408*333d2b36SAndroid Build Coastguard Worker } 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker binary.verifyHostBionicLinker(ctx, outputFile, deps.DynamicLinker.Path(), verifyFile) 411*333d2b36SAndroid Build Coastguard Worker validations = append(validations, verifyFile) 412*333d2b36SAndroid Build Coastguard Worker } 413*333d2b36SAndroid Build Coastguard Worker 414*333d2b36SAndroid Build Coastguard Worker var sharedLibs android.Paths 415*333d2b36SAndroid Build Coastguard Worker // Ignore shared libs for static executables. 416*333d2b36SAndroid Build Coastguard Worker if !binary.static() { 417*333d2b36SAndroid Build Coastguard Worker sharedLibs = deps.EarlySharedLibs 418*333d2b36SAndroid Build Coastguard Worker sharedLibs = append(sharedLibs, deps.SharedLibs...) 419*333d2b36SAndroid Build Coastguard Worker sharedLibs = append(sharedLibs, deps.LateSharedLibs...) 420*333d2b36SAndroid Build Coastguard Worker linkerDeps = append(linkerDeps, deps.EarlySharedLibsDeps...) 421*333d2b36SAndroid Build Coastguard Worker linkerDeps = append(linkerDeps, deps.SharedLibsDeps...) 422*333d2b36SAndroid Build Coastguard Worker linkerDeps = append(linkerDeps, deps.LateSharedLibsDeps...) 423*333d2b36SAndroid Build Coastguard Worker linkerDeps = append(linkerDeps, ndkSharedLibDeps(ctx)...) 424*333d2b36SAndroid Build Coastguard Worker } 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker validations = append(validations, objs.tidyDepFiles...) 427*333d2b36SAndroid Build Coastguard Worker linkerDeps = append(linkerDeps, flags.LdFlagsDeps...) 428*333d2b36SAndroid Build Coastguard Worker 429*333d2b36SAndroid Build Coastguard Worker if generatedLib := generateRustStaticlib(ctx, deps.RustRlibDeps); generatedLib != nil { 430*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = append(deps.StaticLibs, generatedLib) 431*333d2b36SAndroid Build Coastguard Worker } 432*333d2b36SAndroid Build Coastguard Worker 433*333d2b36SAndroid Build Coastguard Worker // Register link action. 434*333d2b36SAndroid Build Coastguard Worker transformObjToDynamicBinary(ctx, objs.objFiles, sharedLibs, deps.StaticLibs, 435*333d2b36SAndroid Build Coastguard Worker deps.LateStaticLibs, deps.WholeStaticLibs, linkerDeps, deps.CrtBegin, deps.CrtEnd, true, 436*333d2b36SAndroid Build Coastguard Worker builderFlags, outputFile, nil, validations) 437*333d2b36SAndroid Build Coastguard Worker 438*333d2b36SAndroid Build Coastguard Worker objs.coverageFiles = append(objs.coverageFiles, deps.StaticLibObjs.coverageFiles...) 439*333d2b36SAndroid Build Coastguard Worker objs.coverageFiles = append(objs.coverageFiles, deps.WholeStaticLibObjs.coverageFiles...) 440*333d2b36SAndroid Build Coastguard Worker binary.coverageOutputFile = transformCoverageFilesToZip(ctx, objs, binary.getStem(ctx)) 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker // Need to determine symlinks early since some targets (ie APEX) need this 443*333d2b36SAndroid Build Coastguard Worker // information but will not call 'install' 444*333d2b36SAndroid Build Coastguard Worker binary.setSymlinkList(ctx) 445*333d2b36SAndroid Build Coastguard Worker 446*333d2b36SAndroid Build Coastguard Worker return ret 447*333d2b36SAndroid Build Coastguard Worker} 448*333d2b36SAndroid Build Coastguard Worker 449*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) unstrippedOutputFilePath() android.Path { 450*333d2b36SAndroid Build Coastguard Worker return binary.unstrippedOutputFile 451*333d2b36SAndroid Build Coastguard Worker} 452*333d2b36SAndroid Build Coastguard Worker 453*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) strippedAllOutputFilePath() android.Path { 454*333d2b36SAndroid Build Coastguard Worker return nil 455*333d2b36SAndroid Build Coastguard Worker} 456*333d2b36SAndroid Build Coastguard Worker 457*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) setSymlinkList(ctx ModuleContext) { 458*333d2b36SAndroid Build Coastguard Worker for _, symlink := range binary.Properties.Symlinks { 459*333d2b36SAndroid Build Coastguard Worker binary.symlinks = append(binary.symlinks, 460*333d2b36SAndroid Build Coastguard Worker symlink+String(binary.Properties.Suffix)+ctx.toolchain().ExecutableSuffix()) 461*333d2b36SAndroid Build Coastguard Worker } 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Worker if Bool(binary.Properties.Symlink_preferred_arch) { 464*333d2b36SAndroid Build Coastguard Worker if String(binary.Properties.Suffix) == "" { 465*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("symlink_preferred_arch", "must also specify suffix") 466*333d2b36SAndroid Build Coastguard Worker } 467*333d2b36SAndroid Build Coastguard Worker if ctx.TargetPrimary() { 468*333d2b36SAndroid Build Coastguard Worker // Install a symlink to the preferred architecture 469*333d2b36SAndroid Build Coastguard Worker symlinkName := binary.getStemWithoutSuffix(ctx) 470*333d2b36SAndroid Build Coastguard Worker binary.symlinks = append(binary.symlinks, symlinkName) 471*333d2b36SAndroid Build Coastguard Worker binary.preferredArchSymlink = symlinkName 472*333d2b36SAndroid Build Coastguard Worker } 473*333d2b36SAndroid Build Coastguard Worker } 474*333d2b36SAndroid Build Coastguard Worker} 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) symlinkList() []string { 477*333d2b36SAndroid Build Coastguard Worker return binary.symlinks 478*333d2b36SAndroid Build Coastguard Worker} 479*333d2b36SAndroid Build Coastguard Worker 480*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) nativeCoverage() bool { 481*333d2b36SAndroid Build Coastguard Worker return true 482*333d2b36SAndroid Build Coastguard Worker} 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) coverageOutputFilePath() android.OptionalPath { 485*333d2b36SAndroid Build Coastguard Worker return binary.coverageOutputFile 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Worker// /system/bin/linker -> /apex/com.android.runtime/bin/linker 489*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) { 490*333d2b36SAndroid Build Coastguard Worker dir := binary.baseInstaller.installDir(ctx) 491*333d2b36SAndroid Build Coastguard Worker dirOnDevice := android.InstallPathToOnDevicePath(ctx, dir) 492*333d2b36SAndroid Build Coastguard Worker target := "/" + filepath.Join("apex", "com.android.runtime", dir.Base(), file.Base()) 493*333d2b36SAndroid Build Coastguard Worker 494*333d2b36SAndroid Build Coastguard Worker ctx.InstallAbsoluteSymlink(dir, file.Base(), target) 495*333d2b36SAndroid Build Coastguard Worker binary.postInstallCmds = append(binary.postInstallCmds, makeSymlinkCmd(dirOnDevice, file.Base(), target)) 496*333d2b36SAndroid Build Coastguard Worker 497*333d2b36SAndroid Build Coastguard Worker for _, symlink := range binary.symlinks { 498*333d2b36SAndroid Build Coastguard Worker ctx.InstallAbsoluteSymlink(dir, symlink, target) 499*333d2b36SAndroid Build Coastguard Worker binary.postInstallCmds = append(binary.postInstallCmds, makeSymlinkCmd(dirOnDevice, symlink, target)) 500*333d2b36SAndroid Build Coastguard Worker } 501*333d2b36SAndroid Build Coastguard Worker} 502*333d2b36SAndroid Build Coastguard Worker 503*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) install(ctx ModuleContext, file android.Path) { 504*333d2b36SAndroid Build Coastguard Worker // Bionic binaries (e.g. linker) is installed to the bootstrap subdirectory. 505*333d2b36SAndroid Build Coastguard Worker // The original path becomes a symlink to the corresponding file in the 506*333d2b36SAndroid Build Coastguard Worker // runtime APEX. 507*333d2b36SAndroid Build Coastguard Worker translatedArch := ctx.Target().NativeBridge == android.NativeBridgeEnabled 508*333d2b36SAndroid Build Coastguard Worker if InstallToBootstrap(ctx.baseModuleName(), ctx.Config()) && !ctx.Host() && !ctx.isSdkVariant() && 509*333d2b36SAndroid Build Coastguard Worker !translatedArch && ctx.apexVariationName() == "" && !ctx.inRamdisk() && !ctx.inRecovery() && 510*333d2b36SAndroid Build Coastguard Worker !ctx.inVendorRamdisk() { 511*333d2b36SAndroid Build Coastguard Worker 512*333d2b36SAndroid Build Coastguard Worker if ctx.Device() && isBionic(ctx.baseModuleName()) { 513*333d2b36SAndroid Build Coastguard Worker binary.installSymlinkToRuntimeApex(ctx, file) 514*333d2b36SAndroid Build Coastguard Worker } 515*333d2b36SAndroid Build Coastguard Worker binary.baseInstaller.subDir = "bootstrap" 516*333d2b36SAndroid Build Coastguard Worker } 517*333d2b36SAndroid Build Coastguard Worker binary.baseInstaller.install(ctx, file) 518*333d2b36SAndroid Build Coastguard Worker 519*333d2b36SAndroid Build Coastguard Worker var preferredArchSymlinkPath android.OptionalPath 520*333d2b36SAndroid Build Coastguard Worker for _, symlink := range binary.symlinks { 521*333d2b36SAndroid Build Coastguard Worker installedSymlink := ctx.InstallSymlink(binary.baseInstaller.installDir(ctx), symlink, 522*333d2b36SAndroid Build Coastguard Worker binary.baseInstaller.path) 523*333d2b36SAndroid Build Coastguard Worker if symlink == binary.preferredArchSymlink { 524*333d2b36SAndroid Build Coastguard Worker // If this is the preferred arch symlink, save the installed path for use as the 525*333d2b36SAndroid Build Coastguard Worker // tool path. 526*333d2b36SAndroid Build Coastguard Worker preferredArchSymlinkPath = android.OptionalPathForPath(installedSymlink) 527*333d2b36SAndroid Build Coastguard Worker } 528*333d2b36SAndroid Build Coastguard Worker } 529*333d2b36SAndroid Build Coastguard Worker 530*333d2b36SAndroid Build Coastguard Worker if ctx.Os().Class == android.Host { 531*333d2b36SAndroid Build Coastguard Worker // If the binary is multilib with a symlink to the preferred architecture, use the 532*333d2b36SAndroid Build Coastguard Worker // symlink instead of the binary because that's the more "canonical" name. 533*333d2b36SAndroid Build Coastguard Worker if preferredArchSymlinkPath.Valid() { 534*333d2b36SAndroid Build Coastguard Worker binary.toolPath = preferredArchSymlinkPath 535*333d2b36SAndroid Build Coastguard Worker } else { 536*333d2b36SAndroid Build Coastguard Worker binary.toolPath = android.OptionalPathForPath(binary.baseInstaller.path) 537*333d2b36SAndroid Build Coastguard Worker } 538*333d2b36SAndroid Build Coastguard Worker } 539*333d2b36SAndroid Build Coastguard Worker} 540*333d2b36SAndroid Build Coastguard Worker 541*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) hostToolPath() android.OptionalPath { 542*333d2b36SAndroid Build Coastguard Worker return binary.toolPath 543*333d2b36SAndroid Build Coastguard Worker} 544*333d2b36SAndroid Build Coastguard Worker 545*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) overriddenModules() []string { 546*333d2b36SAndroid Build Coastguard Worker return binary.Properties.Overrides 547*333d2b36SAndroid Build Coastguard Worker} 548*333d2b36SAndroid Build Coastguard Worker 549*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON) { 550*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Class = []string{"EXECUTABLES"} 551*333d2b36SAndroid Build Coastguard Worker binary.baseLinker.moduleInfoJSON(ctx, moduleInfoJSON) 552*333d2b36SAndroid Build Coastguard Worker} 553*333d2b36SAndroid Build Coastguard Worker 554*333d2b36SAndroid Build Coastguard Workervar _ overridable = (*binaryDecorator)(nil) 555*333d2b36SAndroid Build Coastguard Worker 556*333d2b36SAndroid Build Coastguard Workerfunc init() { 557*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("verifyHostBionicCmd", "host_bionic_verify") 558*333d2b36SAndroid Build Coastguard Worker} 559*333d2b36SAndroid Build Coastguard Worker 560*333d2b36SAndroid Build Coastguard Workervar verifyHostBionic = pctx.AndroidStaticRule("verifyHostBionic", 561*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 562*333d2b36SAndroid Build Coastguard Worker Command: "$verifyHostBionicCmd -i $in -l $linker && touch $out", 563*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$verifyHostBionicCmd"}, 564*333d2b36SAndroid Build Coastguard Worker }, "linker") 565*333d2b36SAndroid Build Coastguard Worker 566*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) verifyHostBionicLinker(ctx ModuleContext, in, linker android.Path, out android.WritablePath) { 567*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 568*333d2b36SAndroid Build Coastguard Worker Rule: verifyHostBionic, 569*333d2b36SAndroid Build Coastguard Worker Description: "verify host bionic", 570*333d2b36SAndroid Build Coastguard Worker Input: in, 571*333d2b36SAndroid Build Coastguard Worker Implicit: linker, 572*333d2b36SAndroid Build Coastguard Worker Output: out, 573*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 574*333d2b36SAndroid Build Coastguard Worker "linker": linker.String(), 575*333d2b36SAndroid Build Coastguard Worker }, 576*333d2b36SAndroid Build Coastguard Worker }) 577*333d2b36SAndroid Build Coastguard Worker} 578