Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1a28130 authored by Colin Cross's avatar Colin Cross
Browse files

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
parent c8544683
Loading
Loading
Loading
Loading
+9 −16
Original line number Diff line number Diff line
@@ -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"}
			deps.CrtBegin = ctx.toolchain().CrtBeginStaticBinary()
			deps.CrtEnd = ctx.toolchain().CrtEndStaticBinary()
		} else {
				deps.CrtBegin = []string{"crtbegin_dynamic"}
			deps.CrtBegin = ctx.toolchain().CrtBeginSharedBinary()
			deps.CrtEnd = ctx.toolchain().CrtEndSharedBinary()
		}
			deps.CrtEnd = []string{"crtend_android"}
	}

	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")
		}
	}

+14 −0
Original line number Diff line number Diff line
@@ -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]}
+11 −0
Original line number Diff line number Diff line
@@ -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 }
+14 −0
Original line number Diff line number Diff line
@@ -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
}
+14 −0
Original line number Diff line number Diff line
@@ -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 {
Loading