diff --git a/cc/binary.go b/cc/binary.go index 4db25db24..201fdccc9 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -149,11 +149,11 @@ func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { if ctx.toolchain().Bionic() { if !Bool(binary.baseLinker.Properties.Nocrt) { if binary.static() { - deps.CrtBegin = "crtbegin_static" + deps.CrtBegin = []string{"crtbegin_static"} } else { - deps.CrtBegin = "crtbegin_dynamic" + deps.CrtBegin = []string{"crtbegin_dynamic"} } - deps.CrtEnd = "crtend_android" + deps.CrtEnd = []string{"crtend_android"} } if binary.static() { diff --git a/cc/builder.go b/cc/builder.go index cf782eb29..bde8c9647 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -730,9 +730,9 @@ func transformObjToStaticLib(ctx android.ModuleContext, // Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries, // and shared libraries, to a shared library (.so) or dynamic executable func transformObjToDynamicBinary(ctx android.ModuleContext, - objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths, - crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, - outputFile android.WritablePath, implicitOutputs android.WritablePaths, validations android.WritablePaths) { + objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps, crtBegin, crtEnd android.Paths, + groupLate bool, flags builderFlags, outputFile android.WritablePath, + implicitOutputs android.WritablePaths, validations android.WritablePaths) { ldCmd := "${config.ClangBin}/clang++" @@ -779,18 +779,17 @@ func transformObjToDynamicBinary(ctx android.ModuleContext, deps = append(deps, staticLibs...) deps = append(deps, lateStaticLibs...) deps = append(deps, wholeStaticLibs...) - if crtBegin.Valid() { - deps = append(deps, crtBegin.Path(), crtEnd.Path()) - } + deps = append(deps, crtBegin...) + deps = append(deps, crtEnd...) rule := ld args := map[string]string{ "ldCmd": ldCmd, - "crtBegin": crtBegin.String(), + "crtBegin": strings.Join(crtBegin.Strings(), " "), "libFlags": strings.Join(libFlagsList, " "), "extraLibFlags": flags.extraLibFlags, "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags, - "crtEnd": crtEnd.String(), + "crtEnd": strings.Join(crtEnd.Strings(), " "), } if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") { rule = ldRE diff --git a/cc/cc.go b/cc/cc.go index 7b1e44b42..329338e68 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -126,7 +126,7 @@ type Deps struct { ReexportGeneratedHeaders []string - CrtBegin, CrtEnd string + CrtBegin, CrtEnd []string // Used for host bionic LinkerFlagsFile string @@ -177,7 +177,7 @@ type PathDeps struct { ReexportedDeps android.Paths // Paths to crt*.o files - CrtBegin, CrtEnd android.OptionalPath + CrtBegin, CrtEnd android.Paths // Path to the file container flags to use with the linker LinkerFlagsFile android.OptionalPath @@ -2264,13 +2264,13 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { crtVariations := GetCrtVariations(ctx, c) actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...) - if deps.CrtBegin != "" { + for _, crt := range deps.CrtBegin { actx.AddVariationDependencies(crtVariations, CrtBeginDepTag, - RewriteSnapshotLib(deps.CrtBegin, GetSnapshot(c, &snapshotInfo, actx).Objects)) + RewriteSnapshotLib(crt, GetSnapshot(c, &snapshotInfo, actx).Objects)) } - if deps.CrtEnd != "" { + for _, crt := range deps.CrtEnd { actx.AddVariationDependencies(crtVariations, CrtEndDepTag, - RewriteSnapshotLib(deps.CrtEnd, GetSnapshot(c, &snapshotInfo, actx).Objects)) + RewriteSnapshotLib(crt, GetSnapshot(c, &snapshotInfo, actx).Objects)) } if deps.LinkerFlagsFile != "" { actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile) @@ -2584,6 +2584,10 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } else { ctx.ModuleErrorf("module %q is not a genrule", depName) } + case CrtBeginDepTag: + depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, "")) + case CrtEndDepTag: + depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, "")) } return } @@ -2896,9 +2900,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { case objDepTag: depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path()) case CrtBeginDepTag: - depPaths.CrtBegin = linkFile + depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path()) case CrtEndDepTag: - depPaths.CrtEnd = linkFile + depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path()) case dynamicLinkerDepTag: depPaths.DynamicLinker = linkFile } diff --git a/cc/library.go b/cc/library.go index b9a2b0676..5b6c6236d 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1175,8 +1175,8 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, library.StaticProperties.Static.Export_static_lib_headers...) } else if library.shared() { if ctx.toolchain().Bionic() && !Bool(library.baseLinker.Properties.Nocrt) { - deps.CrtBegin = "crtbegin_so" - deps.CrtEnd = "crtend_so" + deps.CrtBegin = []string{"crtbegin_so"} + deps.CrtEnd = []string{"crtend_so"} } deps.WholeStaticLibs = append(deps.WholeStaticLibs, library.SharedProperties.Shared.Whole_static_libs...) deps.StaticLibs = append(deps.StaticLibs, library.SharedProperties.Shared.Static_libs...)