1// Copyright 2020 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package config 16 17import ( 18 "strings" 19 20 "android/soong/android" 21) 22 23var ( 24 // This is a host toolchain but flags for device toolchain are required 25 // as the flags are actually for Bionic-based builds. 26 linuxCrossCflags = append(deviceGlobalCflags, 27 // clang by default enables PIC when the clang triple is set to *-android. 28 // See toolchain/llvm-project/clang/lib/Driver/ToolChains/CommonArgs.cpp#920. 29 // However, for this host target, we don't set "-android" to avoid __ANDROID__ macro 30 // which stands for "Android device target". Keeping PIC on is required because 31 // many modules we have (e.g. Bionic) assume PIC. 32 "-fpic", 33 34 // This is normally in ClangExtraTargetCflags, but that's for device and we need 35 // the same for host 36 "-nostdlibinc", 37 ) 38 39 linuxCrossLdflags = []string{ 40 "-Wl,-z,noexecstack", 41 "-Wl,-z,relro", 42 "-Wl,-z,now", 43 "-Wl,--build-id=md5", 44 "-Wl,--fatal-warnings", 45 "-Wl,--hash-style=gnu", 46 "-Wl,--no-undefined-version", 47 } 48 49 // Embed the linker into host bionic binaries. This is needed to support host bionic, 50 // as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be 51 // either an absolute path, or relative from CWD. To work around this, we extract 52 // the load sections from the runtime linker ELF binary and embed them into each host 53 // bionic binary, omitting the PT_INTERP declaration. The kernel will treat it as a static 54 // binary, and then we use a special entry point to fix up the arguments passed by 55 // the kernel before jumping to the embedded linker. 56 linuxArm64CrtBeginSharedBinary = append(android.CopyOf(bionicCrtBeginSharedBinary), 57 "host_bionic_linker_script") 58) 59 60func init() { 61 exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Cflags", linuxCrossCflags) 62 exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Ldflags", linuxCrossLdflags) 63} 64 65// toolchain config for ARM64 Linux CrossHost. Almost everything is the same as the ARM64 Android 66// target. The overridden methods below show the differences. 67type toolchainLinuxBionicArm64 struct { 68 toolchainArm64 69} 70 71func (toolchainLinuxBionicArm64) ClangTriple() string { 72 // Note the absence of "-android" suffix. The compiler won't define __ANDROID__ 73 return "aarch64-linux" 74} 75 76func (toolchainLinuxBionicArm64) Cflags() string { 77 // The inherited flags + extra flags 78 return "${config.Arm64Cflags} ${config.LinuxBionicArm64Cflags}" 79} 80 81func (toolchainLinuxBionicArm64) CrtBeginSharedBinary() []string { 82 return linuxArm64CrtBeginSharedBinary 83} 84 85func linuxBionicArm64ToolchainFactory(arch android.Arch) Toolchain { 86 archVariant := "armv8-a" // for host, default to armv8-a 87 toolchainCflags := []string{arm64ArchVariantCflagsVar[archVariant]} 88 89 // We don't specify CPU architecture for host. Conservatively assume 90 // the host CPU needs the fix 91 extraLdflags := "-Wl,--fix-cortex-a53-843419" 92 93 ret := toolchainLinuxBionicArm64{} 94 95 // add the extra ld and lld flags 96 ret.toolchainArm64.ldflags = strings.Join([]string{ 97 "${config.Arm64Ldflags}", 98 "${config.LinuxBionicArm64Ldflags}", 99 extraLdflags, 100 }, " ") 101 ret.toolchainArm64.lldflags = strings.Join([]string{ 102 "${config.Arm64Lldflags}", 103 "${config.LinuxBionicArm64Ldflags}", 104 extraLdflags, 105 }, " ") 106 ret.toolchainArm64.toolchainCflags = strings.Join(toolchainCflags, " ") 107 return &ret 108} 109 110func init() { 111 registerToolchainFactory(android.LinuxBionic, android.Arm64, linuxBionicArm64ToolchainFactory) 112} 113