From 18c0c5afbd455e81311248621ffa0ad54e2f8578 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 1 Dec 2016 14:45:23 -0800 Subject: [PATCH] Support grouping static libraries LLVM has complicated static library layering that sometimes changes. The make solution was to list all the static libraries twice, but Soong dedups the list. Add a group_static_libs flag to allow surrounding the static libs with -Wl,--start-group and -Wl,--end-group. Test: mmma -j external/llvm Change-Id: Ic08a183d7def9c9249d4a3014760759f16b68d04 --- cc/builder.go | 8 ++++++++ cc/cc.go | 2 ++ cc/linker.go | 8 ++++++++ cc/util.go | 2 ++ 4 files changed, 20 insertions(+) diff --git a/cc/builder.go b/cc/builder.go index 730c9ca6e..a568a297a 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -187,6 +187,8 @@ type builderFlags struct { clang bool tidy bool + groupStaticLibs bool + stripKeepSymbols bool stripKeepMiniDebugInfo bool stripAddGnuDebuglink bool @@ -439,7 +441,13 @@ func TransformObjToDynamicBinary(ctx android.ModuleContext, } } + if flags.groupStaticLibs && len(staticLibs) > 0 { + libFlagsList = append(libFlagsList, "-Wl,--start-group") + } libFlagsList = append(libFlagsList, staticLibs.Strings()...) + if flags.groupStaticLibs && len(staticLibs) > 0 { + libFlagsList = append(libFlagsList, "-Wl,--end-group") + } if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 { libFlagsList = append(libFlagsList, "-Wl,--start-group") diff --git a/cc/cc.go b/cc/cc.go index fef72ccaf..df4e5cf24 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -110,6 +110,8 @@ type Flags struct { DynamicLinker string CFlagsDeps android.Paths // Files depended on by compiler flags + + GroupStaticLibs bool } type ObjectLinkerProperties struct { diff --git a/cc/linker.go b/cc/linker.go index 6d4edbcfe..dac51d6dd 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -76,6 +76,10 @@ type BaseLinkerProperties struct { // don't link in crt_begin and crt_end. This flag should only be necessary for // compiling crt or libc. Nocrt *bool `android:"arch_variant"` + + // group static libraries. This can resolve missing symbols issues with interdependencies + // between static libraries, but it is generally better to order them correctly instead. + Group_static_libs *bool `android:"arch_variant"` } func NewBaseLinker() *baseLinker { @@ -193,6 +197,10 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { flags.LdFlags = append(flags.LdFlags, toolchain.ToolchainLdflags()) } + if Bool(linker.Properties.Group_static_libs) { + flags.GroupStaticLibs = true + } + return flags } diff --git a/cc/util.go b/cc/util.go index 31f0aec77..1cb3dd7d8 100644 --- a/cc/util.go +++ b/cc/util.go @@ -100,6 +100,8 @@ func flagsToBuilderFlags(in Flags) builderFlags { toolchain: in.Toolchain, clang: in.Clang, tidy: in.Tidy, + + groupStaticLibs: in.GroupStaticLibs, } }