Move default crt objects into Toolchain
Move the crt objects spread around cc/library.go and cc/binary.go into the Toolchain. This will simplify adding new toolchains that have custom crt objects. Test: m checkbuild Test: go test ./cc/... Change-Id: I7fdc1f53769799cb9c10e3e5816dabee0f918768
This commit is contained in:
25
cc/binary.go
25
cc/binary.go
@@ -146,16 +146,17 @@ func (binary *binaryDecorator) getStem(ctx BaseModuleContext) string {
|
||||
// modules common to most binaries, such as bionic libraries.
|
||||
func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||
deps = binary.baseLinker.linkerDeps(ctx, deps)
|
||||
if ctx.toolchain().Bionic() {
|
||||
if !Bool(binary.baseLinker.Properties.Nocrt) {
|
||||
if binary.static() {
|
||||
deps.CrtBegin = []string{"crtbegin_static"}
|
||||
} else {
|
||||
deps.CrtBegin = []string{"crtbegin_dynamic"}
|
||||
}
|
||||
deps.CrtEnd = []string{"crtend_android"}
|
||||
if !Bool(binary.baseLinker.Properties.Nocrt) {
|
||||
if binary.static() {
|
||||
deps.CrtBegin = ctx.toolchain().CrtBeginStaticBinary()
|
||||
deps.CrtEnd = ctx.toolchain().CrtEndStaticBinary()
|
||||
} else {
|
||||
deps.CrtBegin = ctx.toolchain().CrtBeginSharedBinary()
|
||||
deps.CrtEnd = ctx.toolchain().CrtEndSharedBinary()
|
||||
}
|
||||
}
|
||||
|
||||
if ctx.toolchain().Bionic() {
|
||||
if binary.static() {
|
||||
if ctx.selectedStl() == "libc++_static" {
|
||||
deps.StaticLibs = append(deps.StaticLibs, "libm", "libc")
|
||||
@@ -169,16 +170,8 @@ func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||
deps.LateStaticLibs = append(groupLibs, deps.LateStaticLibs...)
|
||||
}
|
||||
|
||||
// Embed the linker into host bionic binaries. This is needed to support host bionic,
|
||||
// as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be
|
||||
// either an absolute path, or relative from CWD. To work around this, we extract
|
||||
// the load sections from the runtime linker ELF binary and embed them into each host
|
||||
// bionic binary, omitting the PT_INTERP declaration. The kernel will treat it as a static
|
||||
// binary, and then we use a special entry point to fix up the arguments passed by
|
||||
// the kernel before jumping to the embedded linker.
|
||||
if ctx.Os() == android.LinuxBionic && !binary.static() {
|
||||
deps.DynamicLinker = "linker"
|
||||
deps.CrtBegin = append(deps.CrtBegin, "host_bionic_linker_script")
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -45,6 +45,16 @@ var (
|
||||
"-Wl,--hash-style=gnu",
|
||||
"-Wl,--no-undefined-version",
|
||||
})
|
||||
|
||||
// Embed the linker into host bionic binaries. This is needed to support host bionic,
|
||||
// as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be
|
||||
// either an absolute path, or relative from CWD. To work around this, we extract
|
||||
// the load sections from the runtime linker ELF binary and embed them into each host
|
||||
// bionic binary, omitting the PT_INTERP declaration. The kernel will treat it as a static
|
||||
// binary, and then we use a special entry point to fix up the arguments passed by
|
||||
// the kernel before jumping to the embedded linker.
|
||||
linuxArm64CrtBeginSharedBinary = append(android.CopyOf(bionicCrtBeginSharedBinary),
|
||||
"host_bionic_linker_script")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -68,6 +78,10 @@ func (toolchainLinuxArm64) ClangCflags() string {
|
||||
return "${config.Arm64ClangCflags} ${config.LinuxBionicArm64Cflags}"
|
||||
}
|
||||
|
||||
func (toolchainLinuxArm64) CrtBeginSharedBinary() []string {
|
||||
return linuxArm64CrtBeginSharedBinary
|
||||
}
|
||||
|
||||
func linuxArm64ToolchainFactory(arch android.Arch) Toolchain {
|
||||
archVariant := "armv8-a" // for host, default to armv8-a
|
||||
toolchainClangCflags := []string{arm64ClangArchVariantCflagsVar[archVariant]}
|
||||
|
@@ -19,8 +19,19 @@ type toolchainBionic struct {
|
||||
|
||||
var (
|
||||
bionicDefaultSharedLibraries = []string{"libc", "libm", "libdl"}
|
||||
|
||||
bionicCrtBeginStaticBinary, bionicCrtEndStaticBinary = []string{"crtbegin_static"}, []string{"crtend_android"}
|
||||
bionicCrtBeginSharedBinary, bionicCrtEndSharedBinary = []string{"crtbegin_dynamic"}, []string{"crtend_android"}
|
||||
bionicCrtBeginSharedLibrary, bionicCrtEndSharedLibrary = []string{"crtbegin_so"}, []string{"crtend_so"}
|
||||
)
|
||||
|
||||
func (toolchainBionic) Bionic() bool { return true }
|
||||
|
||||
func (toolchainBionic) DefaultSharedLibraries() []string { return bionicDefaultSharedLibraries }
|
||||
|
||||
func (toolchainBionic) CrtBeginStaticBinary() []string { return bionicCrtBeginStaticBinary }
|
||||
func (toolchainBionic) CrtBeginSharedBinary() []string { return bionicCrtBeginSharedBinary }
|
||||
func (toolchainBionic) CrtBeginSharedLibrary() []string { return bionicCrtBeginSharedLibrary }
|
||||
func (toolchainBionic) CrtEndStaticBinary() []string { return bionicCrtEndStaticBinary }
|
||||
func (toolchainBionic) CrtEndSharedBinary() []string { return bionicCrtEndSharedBinary }
|
||||
func (toolchainBionic) CrtEndSharedLibrary() []string { return bionicCrtEndSharedLibrary }
|
||||
|
@@ -106,6 +106,13 @@ type Toolchain interface {
|
||||
|
||||
AvailableLibraries() []string
|
||||
|
||||
CrtBeginStaticBinary() []string
|
||||
CrtBeginSharedBinary() []string
|
||||
CrtBeginSharedLibrary() []string
|
||||
CrtEndStaticBinary() []string
|
||||
CrtEndSharedBinary() []string
|
||||
CrtEndSharedLibrary() []string
|
||||
|
||||
// DefaultSharedLibraries returns the list of shared libraries that will be added to all
|
||||
// targets unless they explicitly specify system_shared_libs.
|
||||
DefaultSharedLibraries() []string
|
||||
@@ -172,6 +179,13 @@ func (toolchainBase) AvailableLibraries() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (toolchainBase) CrtBeginStaticBinary() []string { return nil }
|
||||
func (toolchainBase) CrtBeginSharedBinary() []string { return nil }
|
||||
func (toolchainBase) CrtBeginSharedLibrary() []string { return nil }
|
||||
func (toolchainBase) CrtEndStaticBinary() []string { return nil }
|
||||
func (toolchainBase) CrtEndSharedBinary() []string { return nil }
|
||||
func (toolchainBase) CrtEndSharedLibrary() []string { return nil }
|
||||
|
||||
func (toolchainBase) DefaultSharedLibraries() []string {
|
||||
return nil
|
||||
}
|
||||
|
@@ -63,6 +63,16 @@ var (
|
||||
})
|
||||
|
||||
linuxBionicLldflags = ClangFilterUnknownLldflags(linuxBionicLdflags)
|
||||
|
||||
// Embed the linker into host bionic binaries. This is needed to support host bionic,
|
||||
// as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be
|
||||
// either an absolute path, or relative from CWD. To work around this, we extract
|
||||
// the load sections from the runtime linker ELF binary and embed them into each host
|
||||
// bionic binary, omitting the PT_INTERP declaration. The kernel will treat it as a static
|
||||
// binary, and then we use a special entry point to fix up the arguments passed by
|
||||
// the kernel before jumping to the embedded linker.
|
||||
linuxBionicCrtBeginSharedBinary = append(android.CopyOf(bionicCrtBeginSharedBinary),
|
||||
"host_bionic_linker_script")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -138,6 +148,10 @@ func (toolchainLinuxBionic) LibclangRuntimeLibraryArch() string {
|
||||
return "x86_64"
|
||||
}
|
||||
|
||||
func (toolchainLinuxBionic) CrtBeginSharedBinary() []string {
|
||||
return linuxBionicCrtBeginSharedBinary
|
||||
}
|
||||
|
||||
var toolchainLinuxBionicSingleton Toolchain = &toolchainLinuxBionic{}
|
||||
|
||||
func linuxBionicToolchainFactory(arch android.Arch) Toolchain {
|
||||
|
@@ -1174,9 +1174,9 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||
deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, library.StaticProperties.Static.Export_shared_lib_headers...)
|
||||
deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, library.StaticProperties.Static.Export_static_lib_headers...)
|
||||
} else if library.shared() {
|
||||
if ctx.toolchain().Bionic() && !Bool(library.baseLinker.Properties.Nocrt) {
|
||||
deps.CrtBegin = []string{"crtbegin_so"}
|
||||
deps.CrtEnd = []string{"crtend_so"}
|
||||
if !Bool(library.baseLinker.Properties.Nocrt) {
|
||||
deps.CrtBegin = append(deps.CrtBegin, ctx.toolchain().CrtBeginSharedLibrary()...)
|
||||
deps.CrtEnd = append(deps.CrtEnd, ctx.toolchain().CrtEndSharedLibrary()...)
|
||||
}
|
||||
deps.WholeStaticLibs = append(deps.WholeStaticLibs, library.SharedProperties.Shared.Whole_static_libs...)
|
||||
deps.StaticLibs = append(deps.StaticLibs, library.SharedProperties.Shared.Static_libs...)
|
||||
|
Reference in New Issue
Block a user