diff options
author | Yi Kong <yikong@google.com> | 2019-05-03 01:17:03 -0700 |
---|---|---|
committer | Yi Kong <yikong@google.com> | 2019-05-03 08:24:10 +0000 |
commit | bd475367c3dcb4478a70409c99b959ebdb117be3 (patch) | |
tree | 41eadbf2c0a53d755091399f192bb2461e4982d8 /cc | |
parent | ead8b42a1de7b5d36ab7c66b95d5b568a39a5831 (diff) | |
download | build_soong-bd475367c3dcb4478a70409c99b959ebdb117be3.tar.gz build_soong-bd475367c3dcb4478a70409c99b959ebdb117be3.tar.bz2 build_soong-bd475367c3dcb4478a70409c99b959ebdb117be3.zip |
Strip libgcc to only keep fallback symbols
We use libgcc as fallback for symbols not present in libclang_rt
builtins, however we didn't know what exact symbols were being used,
some may not be intended to fallback.
Create libgcc_stripped, which only contains unwind symbols from libgcc.
Bug: 29275768
Test: bionic-unit-tests
Change-Id: I98df02ead7f6cca4e76ec92d4f880de4e03f5b5c
Merged-In: I5b349fa6138e51663bf3b67109b880b4356da8e8
(cherry picked from commit acee27cd7236554d0112001c96b9b5790c1c7097)
Diffstat (limited to 'cc')
-rw-r--r-- | cc/builder.go | 4 | ||||
-rw-r--r-- | cc/cc_test.go | 4 | ||||
-rw-r--r-- | cc/linker.go | 8 | ||||
-rw-r--r-- | cc/strip.go | 17 | ||||
-rw-r--r-- | cc/testing.go | 7 | ||||
-rw-r--r-- | cc/toolchain_library.go | 16 |
6 files changed, 44 insertions, 12 deletions
diff --git a/cc/builder.go b/cc/builder.go index c64243f6..c42f56cc 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -255,6 +255,7 @@ type builderFlags struct { groupStaticLibs bool stripKeepSymbols bool + stripKeepSymbolsList string stripKeepMiniDebugInfo bool stripAddGnuDebuglink bool stripUseGnuStrip bool @@ -823,6 +824,9 @@ func TransformStrip(ctx android.ModuleContext, inputFile android.Path, if flags.stripKeepSymbols { args += " --keep-symbols" } + if flags.stripKeepSymbolsList != "" { + args += " -k" + flags.stripKeepSymbolsList + } if flags.stripUseGnuStrip { args += " --use-gnu-strip" } diff --git a/cc/cc_test.go b/cc/cc_test.go index 05d74b99..f3d5e60d 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -1833,13 +1833,13 @@ func TestStaticLibDepExport(t *testing.T) { // Check the shared version of lib2. variant := "android_arm64_armv8-a_core_shared" module := ctx.ModuleForTests("lib2", variant).Module().(*Module) - checkStaticLibs(t, []string{"lib1", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc"}, module) + checkStaticLibs(t, []string{"lib1", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc_stripped"}, module) // Check the static version of lib2. variant = "android_arm64_armv8-a_core_static" module = ctx.ModuleForTests("lib2", variant).Module().(*Module) // libc++_static is linked additionally. - checkStaticLibs(t, []string{"lib1", "libc++_static", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc"}, module) + checkStaticLibs(t, []string{"lib1", "libc++_static", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc_stripped"}, module) } var compilerFlagsTestCases = []struct { diff --git a/cc/linker.go b/cc/linker.go index b279c065..e063e441 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -228,10 +228,10 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { // libclang_rt.builtins, libgcc and libatomic have to be last on the command line if !Bool(linker.Properties.No_libcrt) { deps.LateStaticLibs = append(deps.LateStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain())) - } - - deps.LateStaticLibs = append(deps.LateStaticLibs, "libatomic") - if !Bool(linker.Properties.No_libgcc) { + deps.LateStaticLibs = append(deps.LateStaticLibs, "libatomic") + deps.LateStaticLibs = append(deps.LateStaticLibs, "libgcc_stripped") + } else if !Bool(linker.Properties.No_libgcc) { + deps.LateStaticLibs = append(deps.LateStaticLibs, "libatomic") deps.LateStaticLibs = append(deps.LateStaticLibs, "libgcc") } diff --git a/cc/strip.go b/cc/strip.go index 02397f4e..7122585e 100644 --- a/cc/strip.go +++ b/cc/strip.go @@ -15,15 +15,19 @@ package cc import ( + "strings" + "android/soong/android" ) type StripProperties struct { Strip struct { - None *bool - All *bool - Keep_symbols *bool - } + None *bool `android:"arch_variant"` + All *bool `android:"arch_variant"` + Keep_symbols *bool `android:"arch_variant"` + Keep_symbols_list []string `android:"arch_variant"` + Use_gnu_strip *bool `android:"arch_variant"` + } `android:"arch_variant"` } type stripper struct { @@ -42,9 +46,14 @@ func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android. } else { if Bool(stripper.StripProperties.Strip.Keep_symbols) { flags.stripKeepSymbols = true + } else if len(stripper.StripProperties.Strip.Keep_symbols_list) > 0 { + flags.stripKeepSymbolsList = strings.Join(stripper.StripProperties.Strip.Keep_symbols_list, ",") } else if !Bool(stripper.StripProperties.Strip.All) { flags.stripKeepMiniDebugInfo = true } + if Bool(stripper.StripProperties.Strip.Use_gnu_strip) { + flags.stripUseGnuStrip = true + } if ctx.Config().Debuggable() && !flags.stripKeepMiniDebugInfo { flags.stripAddGnuDebuglink = true } diff --git a/cc/testing.go b/cc/testing.go index 2f41de1a..8d76c2f5 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -69,6 +69,13 @@ func GatherRequiredDepsForTest(os android.OsType) string { src: "", } + toolchain_library { + name: "libgcc_stripped", + vendor_available: true, + recovery_available: true, + src: "", + } + cc_library { name: "libc", no_libgcc: true, diff --git a/cc/toolchain_library.go b/cc/toolchain_library.go index ae08b1c7..8ab8bc94 100644 --- a/cc/toolchain_library.go +++ b/cc/toolchain_library.go @@ -34,6 +34,8 @@ type toolchainLibraryProperties struct { type toolchainLibraryDecorator struct { *libraryDecorator + stripper + Properties toolchainLibraryProperties } @@ -45,7 +47,7 @@ func (*toolchainLibraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { func (library *toolchainLibraryDecorator) linkerProps() []interface{} { var props []interface{} props = append(props, library.libraryDecorator.linkerProps()...) - return append(props, &library.Properties) + return append(props, &library.Properties, &library.stripper.StripProperties) } func ToolchainLibraryFactory() android.Module { @@ -75,7 +77,17 @@ func (library *toolchainLibraryDecorator) link(ctx ModuleContext, return android.PathForSource(ctx, "") } - return android.PathForSource(ctx, *library.Properties.Src) + srcPath := android.PathForSource(ctx, *library.Properties.Src) + + if library.stripper.StripProperties.Strip.Keep_symbols_list != nil { + fileName := ctx.ModuleName() + staticLibraryExtension + outputFile := android.PathForModuleOut(ctx, fileName) + buildFlags := flagsToBuilderFlags(flags) + library.stripper.strip(ctx, srcPath, outputFile, buildFlags) + return outputFile + } + + return srcPath } func (library *toolchainLibraryDecorator) nativeCoverage() bool { |