|  | // 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" | 
|  |  | 
|  | "android/soong/android" | 
|  | ) | 
|  |  | 
|  | var ( | 
|  | // This is a host toolchain but flags for device toolchain are required | 
|  | // as the flags are actually for Bionic-based builds. | 
|  | linuxCrossCflags = append(deviceGlobalCflags, | 
|  | // 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", | 
|  |  | 
|  | // This is normally in ClangExtraTargetCflags, but that's for device and we need | 
|  | // the same for host | 
|  | "-nostdlibinc", | 
|  | ) | 
|  |  | 
|  | linuxCrossLdflags = []string{ | 
|  | "-Wl,-z,noexecstack", | 
|  | "-Wl,-z,relro", | 
|  | "-Wl,-z,now", | 
|  | "-Wl,--build-id=md5", | 
|  | "-Wl,--fatal-warnings", | 
|  | "-Wl,--no-undefined-version", | 
|  | } | 
|  |  | 
|  | linuxCrossLldflags = append(linuxCrossLdflags, | 
|  | "-Wl,--compress-debug-sections=zstd", | 
|  | ) | 
|  |  | 
|  | // 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() { | 
|  | pctx.StaticVariable("LinuxBionicArm64Cflags", strings.Join(linuxCrossCflags, " ")) | 
|  | pctx.StaticVariable("LinuxBionicArm64Ldflags", strings.Join(linuxCrossLdflags, " ")) | 
|  | pctx.StaticVariable("LinuxBionicArm64Lldflags", strings.Join(linuxCrossLldflags, " ")) | 
|  | } | 
|  |  | 
|  | // toolchain config for ARM64 Linux CrossHost. Almost everything is the same as the ARM64 Android | 
|  | // target. The overridden methods below show the differences. | 
|  | type toolchainLinuxBionicArm64 struct { | 
|  | toolchainArm64 | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxBionicArm64) ClangTriple() string { | 
|  | // Note the absence of "-android" suffix. The compiler won't define __ANDROID__ | 
|  | return "aarch64-linux" | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxBionicArm64) Cflags() string { | 
|  | // The inherited flags + extra flags | 
|  | return "${config.Arm64Cflags} ${config.LinuxBionicArm64Cflags}" | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxBionicArm64) CrtBeginSharedBinary() []string { | 
|  | return linuxArm64CrtBeginSharedBinary | 
|  | } | 
|  |  | 
|  | func linuxBionicArm64ToolchainFactory(arch android.Arch) Toolchain { | 
|  | // for host, default to armv8-a | 
|  | toolchainCflags := []string{"-march=armv8-a"} | 
|  |  | 
|  | // We don't specify CPU architecture for host. Conservatively assume | 
|  | // the host CPU needs the fix | 
|  | extraLdflags := "-Wl,--fix-cortex-a53-843419" | 
|  |  | 
|  | ret := toolchainLinuxBionicArm64{} | 
|  |  | 
|  | // 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, | 
|  | }, " ") | 
|  | ret.toolchainArm64.toolchainCflags = strings.Join(toolchainCflags, " ") | 
|  | return &ret | 
|  | } | 
|  |  | 
|  | func init() { | 
|  | registerToolchainFactory(android.LinuxBionic, android.Arm64, linuxBionicArm64ToolchainFactory) | 
|  | } |