Merge changes Idbeb4819,Ifc02f9e5 am: 7628e933b6
am: 038ac4c9bc
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1775369 Change-Id: Icb2f36d978b0aee2e883a510029a410d406d1ff3
This commit is contained in:
@@ -335,7 +335,7 @@ func (binary *binaryDecorator) link(ctx ModuleContext,
|
||||
|
||||
if flags.DynamicLinker != "" {
|
||||
flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-dynamic-linker,"+flags.DynamicLinker)
|
||||
} else if ctx.toolchain().Bionic() && !binary.static() {
|
||||
} else if (ctx.toolchain().Bionic() || ctx.toolchain().Musl()) && !binary.static() {
|
||||
flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--no-dynamic-linker")
|
||||
}
|
||||
|
||||
|
@@ -118,6 +118,8 @@ type Toolchain interface {
|
||||
DefaultSharedLibraries() []string
|
||||
|
||||
Bionic() bool
|
||||
Glibc() bool
|
||||
Musl() bool
|
||||
}
|
||||
|
||||
type toolchainBase struct {
|
||||
@@ -194,6 +196,14 @@ func (toolchainBase) Bionic() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (toolchainBase) Glibc() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (toolchainBase) Musl() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t toolchainBase) ToolPath() string {
|
||||
return ""
|
||||
}
|
||||
|
@@ -36,10 +36,18 @@ var (
|
||||
"-D__STDC_CONSTANT_MACROS",
|
||||
|
||||
"--gcc-toolchain=${LinuxGccRoot}",
|
||||
"--sysroot ${LinuxGccRoot}/sysroot",
|
||||
"-fstack-protector-strong",
|
||||
}
|
||||
|
||||
linuxGlibcCflags = []string{
|
||||
"--sysroot ${LinuxGccRoot}/sysroot",
|
||||
}
|
||||
|
||||
linuxMuslCflags = []string{
|
||||
"-D_LIBCPP_HAS_MUSL_LIBC",
|
||||
"-nostdlibinc",
|
||||
}
|
||||
|
||||
linuxLdflags = []string{
|
||||
"-Wl,-z,noexecstack",
|
||||
"-Wl,-z,relro",
|
||||
@@ -47,9 +55,17 @@ var (
|
||||
"-Wl,--no-undefined-version",
|
||||
|
||||
"--gcc-toolchain=${LinuxGccRoot}",
|
||||
}
|
||||
|
||||
linuxGlibcLdflags = []string{
|
||||
"--sysroot ${LinuxGccRoot}/sysroot",
|
||||
}
|
||||
|
||||
linuxMuslLdflags = []string{
|
||||
"-nostdlib",
|
||||
"-lgcc", "-lgcc_eh",
|
||||
}
|
||||
|
||||
// Extended cflags
|
||||
linuxX86Cflags = []string{
|
||||
"-msse3",
|
||||
@@ -89,6 +105,12 @@ var (
|
||||
"rt",
|
||||
"util",
|
||||
}, "-l")
|
||||
|
||||
muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"crtend_android"}
|
||||
muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
|
||||
muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
|
||||
|
||||
muslDefaultSharedLibraries = []string{"libjemalloc5", "libc_musl"}
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -124,6 +146,13 @@ func init() {
|
||||
// Yasm flags
|
||||
pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
|
||||
pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
|
||||
|
||||
pctx.StaticVariable("LinuxGlibcCflags", strings.Join(linuxGlibcCflags, " "))
|
||||
pctx.StaticVariable("LinuxGlibcLdflags", strings.Join(linuxGlibcLdflags, " "))
|
||||
pctx.StaticVariable("LinuxGlibcLldflags", strings.Join(linuxGlibcLdflags, " "))
|
||||
pctx.StaticVariable("LinuxMuslCflags", strings.Join(linuxMuslCflags, " "))
|
||||
pctx.StaticVariable("LinuxMuslLdflags", strings.Join(linuxMuslLdflags, " "))
|
||||
pctx.StaticVariable("LinuxMuslLldflags", strings.Join(linuxMuslLdflags, " "))
|
||||
}
|
||||
|
||||
type toolchainLinux struct {
|
||||
@@ -224,18 +253,146 @@ func (t *toolchainLinux) AvailableLibraries() []string {
|
||||
return linuxAvailableLibraries
|
||||
}
|
||||
|
||||
var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
|
||||
var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
|
||||
// glibc specialization of the linux toolchain
|
||||
|
||||
func linuxX86ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxX86Singleton
|
||||
type toolchainGlibc struct {
|
||||
}
|
||||
|
||||
func linuxX8664ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxX8664Singleton
|
||||
func (toolchainGlibc) Glibc() bool { return true }
|
||||
|
||||
func (toolchainGlibc) Cflags() string {
|
||||
return "${config.LinuxGlibcCflags}"
|
||||
}
|
||||
|
||||
func (toolchainGlibc) Ldflags() string {
|
||||
return "${config.LinuxGlibcLdflags}"
|
||||
}
|
||||
|
||||
func (toolchainGlibc) Lldflags() string {
|
||||
return "${config.LinuxGlibcLldflags}"
|
||||
}
|
||||
|
||||
type toolchainLinuxGlibcX86 struct {
|
||||
toolchainLinuxX86
|
||||
toolchainGlibc
|
||||
}
|
||||
|
||||
type toolchainLinuxGlibcX8664 struct {
|
||||
toolchainLinuxX8664
|
||||
toolchainGlibc
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX86) Cflags() string {
|
||||
return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX86) Ldflags() string {
|
||||
return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX86) Lldflags() string {
|
||||
return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX8664) Cflags() string {
|
||||
return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX8664) Ldflags() string {
|
||||
return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxGlibcX8664) Lldflags() string {
|
||||
return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
|
||||
}
|
||||
|
||||
var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
|
||||
var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
|
||||
|
||||
func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxGlibcX86Singleton
|
||||
}
|
||||
|
||||
func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxGlibcX8664Singleton
|
||||
}
|
||||
|
||||
// musl specialization of the linux toolchain
|
||||
|
||||
type toolchainMusl struct {
|
||||
}
|
||||
|
||||
func (toolchainMusl) Musl() bool { return true }
|
||||
|
||||
func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
|
||||
func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
|
||||
func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
|
||||
func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
|
||||
func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
|
||||
func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
|
||||
|
||||
func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
|
||||
|
||||
func (toolchainMusl) Cflags() string {
|
||||
return "${config.LinuxMuslCflags}"
|
||||
}
|
||||
|
||||
func (toolchainMusl) Ldflags() string {
|
||||
return "${config.LinuxMuslLdflags}"
|
||||
}
|
||||
|
||||
func (toolchainMusl) Lldflags() string {
|
||||
return "${config.LinuxMuslLldflags}"
|
||||
}
|
||||
|
||||
type toolchainLinuxMuslX86 struct {
|
||||
toolchainLinuxX86
|
||||
toolchainMusl
|
||||
}
|
||||
|
||||
type toolchainLinuxMuslX8664 struct {
|
||||
toolchainLinuxX8664
|
||||
toolchainMusl
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX86) Cflags() string {
|
||||
return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX86) Ldflags() string {
|
||||
return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX86) Lldflags() string {
|
||||
return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX8664) Cflags() string {
|
||||
return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX8664) Ldflags() string {
|
||||
return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
|
||||
}
|
||||
|
||||
func (t *toolchainLinuxMuslX8664) Lldflags() string {
|
||||
return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
|
||||
}
|
||||
|
||||
var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
|
||||
var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
|
||||
|
||||
func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxMuslX86Singleton
|
||||
}
|
||||
|
||||
func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
|
||||
return toolchainLinuxMuslX8664Singleton
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerToolchainFactory(android.Linux, android.X86, linuxX86ToolchainFactory)
|
||||
registerToolchainFactory(android.Linux, android.X86_64, linuxX8664ToolchainFactory)
|
||||
registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
|
||||
registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
|
||||
registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
|
||||
registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
|
||||
}
|
||||
|
@@ -286,3 +286,37 @@ cc_library {
|
||||
gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"]
|
||||
android.AssertDeepEquals(t, "androidmk exported cflags", expectedFlags, gotFlags)
|
||||
}
|
||||
|
||||
func TestLibraryVersionScript(t *testing.T) {
|
||||
result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo.c"],
|
||||
version_script: "foo.map.txt",
|
||||
}`)
|
||||
|
||||
libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld")
|
||||
|
||||
android.AssertStringListContains(t, "missing dependency on version_script",
|
||||
libfoo.Implicits.Strings(), "foo.map.txt")
|
||||
android.AssertStringDoesContain(t, "missing flag for version_script",
|
||||
libfoo.Args["ldFlags"], "-Wl,--version-script,foo.map.txt")
|
||||
|
||||
}
|
||||
|
||||
func TestLibraryDynamicList(t *testing.T) {
|
||||
result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo.c"],
|
||||
dynamic_list: "foo.dynamic.txt",
|
||||
}`)
|
||||
|
||||
libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld")
|
||||
|
||||
android.AssertStringListContains(t, "missing dependency on dynamic_list",
|
||||
libfoo.Implicits.Strings(), "foo.dynamic.txt")
|
||||
android.AssertStringDoesContain(t, "missing flag for dynamic_list",
|
||||
libfoo.Args["ldFlags"], "-Wl,--dynamic-list,foo.dynamic.txt")
|
||||
|
||||
}
|
||||
|
20
cc/linker.go
20
cc/linker.go
@@ -194,6 +194,9 @@ type BaseLinkerProperties struct {
|
||||
// local file name to pass to the linker as --version_script
|
||||
Version_script *string `android:"path,arch_variant"`
|
||||
|
||||
// local file name to pass to the linker as --dynamic-list
|
||||
Dynamic_list *string `android:"path,arch_variant"`
|
||||
|
||||
// list of static libs that should not be used to build this module
|
||||
Exclude_static_libs []string `android:"arch_variant"`
|
||||
|
||||
@@ -366,6 +369,10 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||
indexList("libdl", deps.SystemSharedLibs) < indexList("libc", deps.SystemSharedLibs) {
|
||||
ctx.PropertyErrorf("system_shared_libs", "libdl must be after libc")
|
||||
}
|
||||
} else if ctx.toolchain().Musl() {
|
||||
if !Bool(linker.Properties.No_libcrt) && !ctx.header() {
|
||||
deps.LateStaticLibs = append(deps.LateStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain()))
|
||||
}
|
||||
}
|
||||
|
||||
deps.LateSharedLibs = append(deps.LateSharedLibs, deps.SystemSharedLibs...)
|
||||
@@ -453,7 +460,7 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||
flags.Global.LdFlags = append(flags.Global.LdFlags, toolchain.Ldflags())
|
||||
}
|
||||
|
||||
if !ctx.toolchain().Bionic() {
|
||||
if !ctx.toolchain().Bionic() && ctx.Os() != android.LinuxMusl {
|
||||
CheckBadHostLdlibs(ctx, "host_ldlibs", linker.Properties.Host_ldlibs)
|
||||
|
||||
flags.Local.LdFlags = append(flags.Local.LdFlags, linker.Properties.Host_ldlibs...)
|
||||
@@ -538,6 +545,17 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamicList := android.OptionalPathForModuleSrc(ctx, linker.Properties.Dynamic_list)
|
||||
if dynamicList.Valid() {
|
||||
if ctx.Darwin() {
|
||||
ctx.PropertyErrorf("dynamic_list", "Not supported on Darwin")
|
||||
} else {
|
||||
flags.Local.LdFlags = append(flags.Local.LdFlags,
|
||||
"-Wl,--dynamic-list,"+dynamicList.String())
|
||||
flags.LdFlagsDeps = append(flags.LdFlagsDeps, dynamicList.Path())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return flags
|
||||
|
@@ -472,8 +472,8 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
|
||||
s.Diag.Cfi = nil
|
||||
}
|
||||
|
||||
// Disable sanitizers that depend on the UBSan runtime for windows/darwin builds.
|
||||
if !ctx.Os().Linux() {
|
||||
// Disable sanitizers that depend on the UBSan runtime for windows/darwin/musl builds.
|
||||
if !ctx.Os().Linux() || ctx.Os() == android.LinuxMusl {
|
||||
s.Cfi = nil
|
||||
s.Diag.Cfi = nil
|
||||
s.Misc_undefined = nil
|
||||
|
@@ -450,6 +450,25 @@ func commonDefaultModules() string {
|
||||
cc_library_static {
|
||||
name: "note_memtag_heap_sync",
|
||||
}
|
||||
|
||||
|
||||
cc_library {
|
||||
name: "libjemalloc5",
|
||||
host_supported: true,
|
||||
no_libcrt: true,
|
||||
nocrt: true,
|
||||
default_shared_libs: [],
|
||||
stl: "none",
|
||||
}
|
||||
|
||||
cc_library {
|
||||
name: "libc_musl",
|
||||
host_supported: true,
|
||||
no_libcrt: true,
|
||||
nocrt: true,
|
||||
default_shared_libs: [],
|
||||
stl: "none",
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user