2020-07-13 08:43:45 +02:00
|
|
|
// Copyright 2020 Google Inc. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
2021-07-15 02:03:16 +02:00
|
|
|
|
|
|
|
"android/soong/android"
|
2020-07-13 08:43:45 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// This is a host toolchain but flags for device toolchain are required
|
|
|
|
// as the flags are actually for Bionic-based builds.
|
2021-07-15 02:03:16 +02:00
|
|
|
linuxCrossCflags = append(deviceGlobalCflags,
|
2020-07-13 08:43:45 +02:00
|
|
|
// clang by default enables PIC when the clang triple is set to *-android.
|
|
|
|
// See toolchain/llvm-project/clang/lib/Driver/ToolChains/CommonArgs.cpp#920.
|
|
|
|
// However, for this host target, we don't set "-android" to avoid __ANDROID__ macro
|
|
|
|
// which stands for "Android device target". Keeping PIC on is required because
|
|
|
|
// many modules we have (e.g. Bionic) assume PIC.
|
|
|
|
"-fpic",
|
2020-11-10 03:55:42 +01:00
|
|
|
|
|
|
|
// This is normally in ClangExtraTargetCflags, but that's for device and we need
|
|
|
|
// the same for host
|
|
|
|
"-nostdlibinc",
|
2021-07-15 02:03:16 +02:00
|
|
|
)
|
2020-07-13 08:43:45 +02:00
|
|
|
|
2021-07-15 02:03:16 +02:00
|
|
|
linuxCrossLdflags = []string{
|
2020-07-13 08:43:45 +02:00
|
|
|
"-Wl,-z,noexecstack",
|
|
|
|
"-Wl,-z,relro",
|
|
|
|
"-Wl,-z,now",
|
|
|
|
"-Wl,--build-id=md5",
|
|
|
|
"-Wl,--fatal-warnings",
|
|
|
|
"-Wl,--hash-style=gnu",
|
|
|
|
"-Wl,--no-undefined-version",
|
2021-07-15 02:03:16 +02:00
|
|
|
}
|
2021-06-22 02:34:47 +02:00
|
|
|
|
|
|
|
// 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")
|
2020-07-13 08:43:45 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2022-10-14 23:20:27 +02:00
|
|
|
exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Cflags", linuxCrossCflags)
|
|
|
|
exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Ldflags", linuxCrossLdflags)
|
2020-07-13 08:43:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// toolchain config for ARM64 Linux CrossHost. Almost everything is the same as the ARM64 Android
|
|
|
|
// target. The overridden methods below show the differences.
|
2022-06-16 02:25:51 +02:00
|
|
|
type toolchainLinuxBionicArm64 struct {
|
2020-07-13 08:43:45 +02:00
|
|
|
toolchainArm64
|
|
|
|
}
|
|
|
|
|
2022-06-16 02:25:51 +02:00
|
|
|
func (toolchainLinuxBionicArm64) ClangTriple() string {
|
2020-07-13 08:43:45 +02:00
|
|
|
// Note the absence of "-android" suffix. The compiler won't define __ANDROID__
|
|
|
|
return "aarch64-linux"
|
|
|
|
}
|
|
|
|
|
2022-06-16 02:25:51 +02:00
|
|
|
func (toolchainLinuxBionicArm64) Cflags() string {
|
2020-07-13 08:43:45 +02:00
|
|
|
// The inherited flags + extra flags
|
2021-07-15 03:45:05 +02:00
|
|
|
return "${config.Arm64Cflags} ${config.LinuxBionicArm64Cflags}"
|
2020-07-13 08:43:45 +02:00
|
|
|
}
|
|
|
|
|
2022-06-16 02:25:51 +02:00
|
|
|
func (toolchainLinuxBionicArm64) CrtBeginSharedBinary() []string {
|
2021-06-22 02:34:47 +02:00
|
|
|
return linuxArm64CrtBeginSharedBinary
|
|
|
|
}
|
|
|
|
|
2022-06-16 02:25:51 +02:00
|
|
|
func linuxBionicArm64ToolchainFactory(arch android.Arch) Toolchain {
|
2020-07-13 08:43:45 +02:00
|
|
|
archVariant := "armv8-a" // for host, default to armv8-a
|
2021-07-15 02:03:16 +02:00
|
|
|
toolchainCflags := []string{arm64ArchVariantCflagsVar[archVariant]}
|
2020-07-13 08:43:45 +02:00
|
|
|
|
|
|
|
// We don't specify CPU architecture for host. Conservatively assume
|
|
|
|
// the host CPU needs the fix
|
|
|
|
extraLdflags := "-Wl,--fix-cortex-a53-843419"
|
|
|
|
|
2022-06-16 02:25:51 +02:00
|
|
|
ret := toolchainLinuxBionicArm64{}
|
2020-07-13 08:43:45 +02:00
|
|
|
|
|
|
|
// add the extra ld and lld flags
|
|
|
|
ret.toolchainArm64.ldflags = strings.Join([]string{
|
|
|
|
"${config.Arm64Ldflags}",
|
|
|
|
"${config.LinuxBionicArm64Ldflags}",
|
|
|
|
extraLdflags,
|
|
|
|
}, " ")
|
|
|
|
ret.toolchainArm64.lldflags = strings.Join([]string{
|
|
|
|
"${config.Arm64Lldflags}",
|
|
|
|
"${config.LinuxBionicArm64Ldflags}",
|
|
|
|
extraLdflags,
|
|
|
|
}, " ")
|
2021-07-15 02:03:16 +02:00
|
|
|
ret.toolchainArm64.toolchainCflags = strings.Join(toolchainCflags, " ")
|
2020-07-13 08:43:45 +02:00
|
|
|
return &ret
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2022-06-16 02:25:51 +02:00
|
|
|
registerToolchainFactory(android.LinuxBionic, android.Arm64, linuxBionicArm64ToolchainFactory)
|
2020-07-13 08:43:45 +02:00
|
|
|
}
|