From f979d73428f021170eb096f7bbc40d8c6b59dd8f Mon Sep 17 00:00:00 2001 From: Ryan Prichard Date: Thu, 30 May 2019 20:53:29 -0700 Subject: [PATCH] Omit .gnu_debuglink sections in object files I'm not sure if these sections are used, but by adding them to libgcc_stripped.a, we can end up with multiple .gnu_debuglink sections in an executable, where the first two unhelpfully point at "libgcc.a". e.g.: $ readelf -SW -x.gnu_debuglink out/target/product/walleye/system/bin/bootstrap/linker64 ... Section Headers: ... [18] .gnu_debuglink PROGBITS 0000000000000000 10f19c 000020 00 0 0 1 ... [22] .gnu_debuglink PROGBITS 0000000000000000 18a2c8 000010 00 0 0 4 ... Hex dump of section '.gnu_debuglink': 0x00000000 6c696267 63632e61 00000000 3d5f65d8 libgcc.a....=_e. 0x00000010 6c696267 63632e61 00000000 3d5f65d8 libgcc.a....=_e. Hex dump of section '.gnu_debuglink': 0x00000000 6c696e6b 65723634 00000000 f85db7ea linker64.....].. Bug: none Test: m libgcc_stripped linker Test: no .gnu_debuglink section in libgcc_stripped.a Test: only one .gnu_debuglink section in system/bin/bootstrap/linker64 Change-Id: I0c47a9acd6d52f5cbc5bfa8b67d072ebb075a242 --- cc/binary.go | 4 ++-- cc/library.go | 4 ++-- cc/prebuilt.go | 4 ++-- cc/strip.go | 14 ++++++++++++-- cc/toolchain_library.go | 2 +- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/cc/binary.go b/cc/binary.go index 93d1de2d7..8428d7ec2 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -326,7 +326,7 @@ func (binary *binaryDecorator) link(ctx ModuleContext, } strippedOutputFile := outputFile outputFile = android.PathForModuleOut(ctx, "unstripped", fileName) - binary.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags) + binary.stripper.stripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile, builderFlags) } binary.unstrippedOutputFile = outputFile @@ -350,7 +350,7 @@ func (binary *binaryDecorator) link(ctx ModuleContext, if binary.stripper.needsStrip(ctx) { out := android.PathForModuleOut(ctx, "versioned-stripped", fileName) binary.distFile = android.OptionalPathForPath(out) - binary.stripper.strip(ctx, versionedOutputFile, out, builderFlags) + binary.stripper.stripExecutableOrSharedLib(ctx, versionedOutputFile, out, builderFlags) } binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile) diff --git a/cc/library.go b/cc/library.go index 3053831a3..0bc5b5bba 100644 --- a/cc/library.go +++ b/cc/library.go @@ -721,7 +721,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, } strippedOutputFile := outputFile outputFile = android.PathForModuleOut(ctx, "unstripped", fileName) - library.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags) + library.stripper.stripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile, builderFlags) } library.unstrippedOutputFile = outputFile @@ -738,7 +738,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, if library.stripper.needsStrip(ctx) { out := android.PathForModuleOut(ctx, "versioned-stripped", fileName) library.distFile = android.OptionalPathForPath(out) - library.stripper.strip(ctx, versionedOutputFile, out, builderFlags) + library.stripper.stripExecutableOrSharedLib(ctx, versionedOutputFile, out, builderFlags) } library.injectVersionSymbol(ctx, outputFile, versionedOutputFile) diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 48e466715..f92c50d1e 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -98,7 +98,7 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, libName := ctx.baseModuleName() + flags.Toolchain.ShlibSuffix() if p.needsStrip(ctx) { stripped := android.PathForModuleOut(ctx, "stripped", libName) - p.strip(ctx, in, stripped, builderFlags) + p.stripExecutableOrSharedLib(ctx, in, stripped, builderFlags) in = stripped } @@ -197,7 +197,7 @@ func (p *prebuiltBinaryLinker) link(ctx ModuleContext, if p.needsStrip(ctx) { stripped := android.PathForModuleOut(ctx, "stripped", fileName) - p.strip(ctx, in, stripped, builderFlags) + p.stripExecutableOrSharedLib(ctx, in, stripped, builderFlags) in = stripped } diff --git a/cc/strip.go b/cc/strip.go index 4daa75930..f3e3374ab 100644 --- a/cc/strip.go +++ b/cc/strip.go @@ -41,7 +41,7 @@ func (stripper *stripper) needsStrip(ctx ModuleContext) bool { } func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android.ModuleOutPath, - flags builderFlags) { + flags builderFlags, isStaticLib bool) { if ctx.Darwin() { TransformDarwinStrip(ctx, in, out) } else { @@ -57,9 +57,19 @@ func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android. if Bool(stripper.StripProperties.Strip.Use_gnu_strip) { flags.stripUseGnuStrip = true } - if ctx.Config().Debuggable() && !flags.stripKeepMiniDebugInfo { + if ctx.Config().Debuggable() && !flags.stripKeepMiniDebugInfo && !isStaticLib { flags.stripAddGnuDebuglink = true } TransformStrip(ctx, in, out, flags) } } + +func (stripper *stripper) stripExecutableOrSharedLib(ctx ModuleContext, in android.Path, + out android.ModuleOutPath, flags builderFlags) { + stripper.strip(ctx, in, out, flags, false) +} + +func (stripper *stripper) stripStaticLib(ctx ModuleContext, in android.Path, out android.ModuleOutPath, + flags builderFlags) { + stripper.strip(ctx, in, out, flags, true) +} diff --git a/cc/toolchain_library.go b/cc/toolchain_library.go index b4c51ab09..fef4508f2 100644 --- a/cc/toolchain_library.go +++ b/cc/toolchain_library.go @@ -86,7 +86,7 @@ func (library *toolchainLibraryDecorator) link(ctx ModuleContext, fileName := ctx.ModuleName() + staticLibraryExtension outputFile := android.PathForModuleOut(ctx, fileName) buildFlags := flagsToBuilderFlags(flags) - library.stripper.strip(ctx, srcPath, outputFile, buildFlags) + library.stripper.stripStaticLib(ctx, srcPath, outputFile, buildFlags) return outputFile }