diff --git a/android/config.go b/android/config.go index 3a2a0054b..3ef202bf5 100644 --- a/android/config.go +++ b/android/config.go @@ -572,6 +572,10 @@ func (c *config) MinimizeJavaDebugInfo() bool { return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng) } +func (c *config) Debuggable() bool { + return Bool(c.productVariables.Debuggable) +} + func (c *config) DevicePrefer32BitExecutables() bool { return Bool(c.productVariables.DevicePrefer32BitExecutables) } diff --git a/cc/prebuilt.go b/cc/prebuilt.go index ff8a87858..d6018ebb2 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -76,8 +76,29 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, p.libraryDecorator.exportIncludes(ctx, "-I") p.libraryDecorator.reexportFlags(deps.ReexportedFlags) p.libraryDecorator.reexportDeps(deps.ReexportedFlagsDeps) - // TODO(ccross): .toc optimization, stripping, packing - return p.Prebuilt.SingleSourcePath(ctx) + + builderFlags := flagsToBuilderFlags(flags) + + in := p.Prebuilt.SingleSourcePath(ctx) + + if p.shared() { + libName := ctx.baseModuleName() + flags.Toolchain.ShlibSuffix() + if p.needsStrip(ctx) { + stripped := android.PathForModuleOut(ctx, "stripped", libName) + p.strip(ctx, in, stripped, builderFlags) + in = stripped + } + + if !ctx.Darwin() && !ctx.Windows() { + // Optimize out relinking against shared libraries whose interface hasn't changed by + // depending on a table of contents file instead of the library itself. + tocFile := android.PathForModuleOut(ctx, libName+".toc") + p.tocFile = android.OptionalPathForPath(tocFile) + TransformSharedObjectToToc(ctx, in, tocFile, builderFlags) + } + } + + return in } return nil @@ -136,17 +157,24 @@ func (p *prebuiltBinaryLinker) link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path { // TODO(ccross): verify shared library dependencies if len(p.properties.Srcs) > 0 { - // TODO(ccross): .toc optimization, stripping, packing + builderFlags := flagsToBuilderFlags(flags) + + fileName := p.getStem(ctx) + flags.Toolchain.ExecutableSuffix() + in := p.Prebuilt.SingleSourcePath(ctx) + + if p.needsStrip(ctx) { + stripped := android.PathForModuleOut(ctx, "stripped", fileName) + p.strip(ctx, in, stripped, builderFlags) + in = stripped + } // Copy binaries to a name matching the final installed name - fileName := p.getStem(ctx) + flags.Toolchain.ExecutableSuffix() outputFile := android.PathForModuleOut(ctx, fileName) - ctx.Build(pctx, android.BuildParams{ Rule: android.CpExecutable, Description: "prebuilt", Output: outputFile, - Input: p.Prebuilt.SingleSourcePath(ctx), + Input: in, }) return outputFile diff --git a/cc/strip.go b/cc/strip.go index a7c2d4e88..ec2450ab8 100644 --- a/cc/strip.go +++ b/cc/strip.go @@ -21,6 +21,7 @@ import ( type StripProperties struct { Strip struct { None *bool + All *bool Keep_symbols *bool } } @@ -33,14 +34,19 @@ func (stripper *stripper) needsStrip(ctx ModuleContext) bool { return !ctx.Config().EmbeddedInMake() && !Bool(stripper.StripProperties.Strip.None) } -func (stripper *stripper) strip(ctx ModuleContext, in, out android.ModuleOutPath, +func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android.ModuleOutPath, flags builderFlags) { if ctx.Darwin() { TransformDarwinStrip(ctx, in, out) } else { - flags.stripKeepSymbols = Bool(stripper.StripProperties.Strip.Keep_symbols) - // TODO(ccross): don't add gnu debuglink for user builds - flags.stripAddGnuDebuglink = true + if Bool(stripper.StripProperties.Strip.Keep_symbols) { + flags.stripKeepSymbols = true + } else if !Bool(stripper.StripProperties.Strip.All) { + flags.stripKeepMiniDebugInfo = true + } + if ctx.Config().Debuggable() && !flags.stripKeepMiniDebugInfo { + flags.stripAddGnuDebuglink = true + } TransformStrip(ctx, in, out, flags) } }