1// Copyright 2016 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 linuxCflags = []string{ 25 "-Wa,--noexecstack", 26 27 "-fPIC", 28 29 "-fno-omit-frame-pointer", 30 31 "-U_FORTIFY_SOURCE", 32 "-D_FORTIFY_SOURCE=2", 33 "-fstack-protector", 34 35 "--gcc-toolchain=${LinuxGccRoot}", 36 "-fstack-protector-strong", 37 } 38 39 linuxGlibcCflags = []string{ 40 "--sysroot ${LinuxGccRoot}/sysroot", 41 } 42 43 linuxMuslCflags = []string{ 44 "-D_LIBCPP_HAS_MUSL_LIBC", 45 "-DANDROID_HOST_MUSL", 46 "-nostdlibinc", 47 "--sysroot /dev/null", 48 } 49 50 linuxLdflags = []string{ 51 "-Wl,-z,noexecstack", 52 "-Wl,-z,relro", 53 "-Wl,-z,now", 54 "-Wl,--no-undefined-version", 55 56 "--gcc-toolchain=${LinuxGccRoot}", 57 } 58 59 linuxLldflags = append(linuxLdflags, 60 "-Wl,--compress-debug-sections=zstd", 61 ) 62 63 linuxGlibcLdflags = []string{ 64 "--sysroot ${LinuxGccRoot}/sysroot", 65 } 66 67 linuxMuslLdflags = []string{ 68 "-nostdlib", 69 "--sysroot /dev/null", 70 } 71 72 // Extended cflags 73 linuxX86Cflags = []string{ 74 "-msse3", 75 "-m32", 76 "-march=prescott", 77 "-D_FILE_OFFSET_BITS=64", 78 "-D_LARGEFILE_SOURCE=1", 79 } 80 81 linuxX8664Cflags = []string{ 82 "-m64", 83 } 84 85 linuxX86Ldflags = []string{ 86 "-m32", 87 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32", 88 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32", 89 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32", 90 } 91 92 linuxX8664Ldflags = []string{ 93 "-m64", 94 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}", 95 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}", 96 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64", 97 } 98 99 linuxAvailableLibraries = addPrefix([]string{ 100 "c", 101 "dl", 102 "gcc", 103 "gcc_s", 104 "m", 105 "ncurses", 106 "pthread", 107 "resolv", 108 "rt", 109 "util", 110 }, "-l") 111 112 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"} 113 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic"}, []string{"libc_musl_crtend"} 114 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"} 115 116 MuslDefaultSharedLibraries = []string{"libc_musl"} 117) 118 119const ( 120 linuxGccVersion = "4.8.3" 121 linuxGlibcVersion = "2.17" 122) 123 124func init() { 125 pctx.StaticVariable("LinuxGccVersion", linuxGccVersion) 126 pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion) 127 128 // Most places use the full GCC version. A few only use up to the first two numbers. 129 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 { 130 pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], ".")) 131 } else { 132 pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion) 133 } 134 135 pctx.SourcePathVariable("LinuxGccRoot", 136 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}") 137 138 pctx.StaticVariable("LinuxGccTriple", "x86_64-linux") 139 140 pctx.StaticVariable("LinuxCflags", strings.Join(linuxCflags, " ")) 141 pctx.StaticVariable("LinuxLdflags", strings.Join(linuxLdflags, " ")) 142 pctx.StaticVariable("LinuxLldflags", strings.Join(linuxLldflags, " ")) 143 pctx.StaticVariable("LinuxGlibcCflags", strings.Join(linuxGlibcCflags, " ")) 144 pctx.StaticVariable("LinuxGlibcLdflags", strings.Join(linuxGlibcLdflags, " ")) 145 pctx.StaticVariable("LinuxGlibcLldflags", strings.Join(linuxGlibcLdflags, " ")) 146 pctx.StaticVariable("LinuxMuslCflags", strings.Join(linuxMuslCflags, " ")) 147 pctx.StaticVariable("LinuxMuslLdflags", strings.Join(linuxMuslLdflags, " ")) 148 pctx.StaticVariable("LinuxMuslLldflags", strings.Join(linuxMuslLdflags, " ")) 149 150 pctx.StaticVariable("LinuxX86Cflags", strings.Join(linuxX86Cflags, " ")) 151 pctx.StaticVariable("LinuxX8664Cflags", strings.Join(linuxX8664Cflags, " ")) 152 pctx.StaticVariable("LinuxX86Ldflags", strings.Join(linuxX86Ldflags, " ")) 153 pctx.StaticVariable("LinuxX86Lldflags", strings.Join(linuxX86Ldflags, " ")) 154 pctx.StaticVariable("LinuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " ")) 155 pctx.StaticVariable("LinuxX8664Lldflags", strings.Join(linuxX8664Ldflags, " ")) 156 // Yasm flags 157 pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86") 158 pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64") 159} 160 161type toolchainLinux struct { 162 toolchainBase 163 cFlags, ldFlags string 164} 165 166type toolchainLinuxX86 struct { 167 toolchain32Bit 168 toolchainLinux 169} 170 171type toolchainLinuxX8664 struct { 172 toolchain64Bit 173 toolchainLinux 174} 175 176func (t *toolchainLinuxX86) Name() string { 177 return "x86" 178} 179 180func (t *toolchainLinuxX8664) Name() string { 181 return "x86_64" 182} 183 184func (t *toolchainLinux) IncludeFlags() string { 185 return "" 186} 187 188func (t *toolchainLinuxX86) Cflags() string { 189 return "${config.LinuxCflags} ${config.LinuxX86Cflags}" 190} 191 192func (t *toolchainLinuxX86) Cppflags() string { 193 return "" 194} 195 196func (t *toolchainLinuxX8664) Cflags() string { 197 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}" 198} 199 200func (t *toolchainLinuxX8664) Cppflags() string { 201 return "" 202} 203 204func (t *toolchainLinuxX86) Ldflags() string { 205 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}" 206} 207 208func (t *toolchainLinuxX86) Lldflags() string { 209 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}" 210} 211 212func (t *toolchainLinuxX8664) Ldflags() string { 213 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}" 214} 215 216func (t *toolchainLinuxX8664) Lldflags() string { 217 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}" 218} 219 220func (t *toolchainLinuxX86) YasmFlags() string { 221 return "${config.LinuxX86YasmFlags}" 222} 223 224func (t *toolchainLinuxX8664) YasmFlags() string { 225 return "${config.LinuxX8664YasmFlags}" 226} 227 228func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string { 229 return "i386" 230} 231 232func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string { 233 return "x86_64" 234} 235 236func (t *toolchainLinux) AvailableLibraries() []string { 237 return linuxAvailableLibraries 238} 239 240func (toolchainLinux) ShlibSuffix() string { 241 return ".so" 242} 243 244func (toolchainLinux) ExecutableSuffix() string { 245 return "" 246} 247 248// glibc specialization of the linux toolchain 249 250type toolchainGlibc struct { 251 toolchainNoCrt 252} 253 254func (toolchainGlibc) Glibc() bool { return true } 255 256func (toolchainGlibc) Cflags() string { 257 return "${config.LinuxGlibcCflags}" 258} 259 260func (toolchainGlibc) Ldflags() string { 261 return "${config.LinuxGlibcLdflags}" 262} 263 264func (toolchainGlibc) Lldflags() string { 265 return "${config.LinuxGlibcLldflags}" 266} 267 268type toolchainLinuxGlibcX86 struct { 269 toolchainLinuxX86 270 toolchainGlibc 271} 272 273type toolchainLinuxGlibcX8664 struct { 274 toolchainLinuxX8664 275 toolchainGlibc 276} 277 278func (t *toolchainLinuxGlibcX86) ClangTriple() string { 279 return "i686-linux-gnu" 280} 281 282func (t *toolchainLinuxGlibcX86) Cflags() string { 283 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags() 284} 285 286func (t *toolchainLinuxGlibcX86) Ldflags() string { 287 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags() 288} 289 290func (t *toolchainLinuxGlibcX86) Lldflags() string { 291 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags() 292} 293 294func (t *toolchainLinuxGlibcX8664) ClangTriple() string { 295 return "x86_64-linux-gnu" 296} 297 298func (t *toolchainLinuxGlibcX8664) Cflags() string { 299 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags() 300} 301 302func (t *toolchainLinuxGlibcX8664) Ldflags() string { 303 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags() 304} 305 306func (t *toolchainLinuxGlibcX8664) Lldflags() string { 307 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags() 308} 309 310var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{} 311var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{} 312 313func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain { 314 return toolchainLinuxGlibcX86Singleton 315} 316 317func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain { 318 return toolchainLinuxGlibcX8664Singleton 319} 320 321// musl specialization of the linux toolchain 322 323type toolchainMusl struct { 324} 325 326func (toolchainMusl) Musl() bool { return true } 327 328func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary } 329func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary } 330func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary } 331func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary } 332func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary } 333func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary } 334func (toolchainMusl) CrtPadSegmentSharedLibrary() []string { return nil } 335 336func (toolchainMusl) DefaultSharedLibraries() []string { return MuslDefaultSharedLibraries } 337 338func (toolchainMusl) Cflags() string { 339 return "${config.LinuxMuslCflags}" 340} 341 342func (toolchainMusl) Ldflags() string { 343 return "${config.LinuxMuslLdflags}" 344} 345 346func (toolchainMusl) Lldflags() string { 347 return "${config.LinuxMuslLldflags}" 348} 349 350type toolchainLinuxMuslX86 struct { 351 toolchainLinuxX86 352 toolchainMusl 353} 354 355type toolchainLinuxMuslX8664 struct { 356 toolchainLinuxX8664 357 toolchainMusl 358} 359 360func (t *toolchainLinuxMuslX86) ClangTriple() string { 361 return "i686-linux-musl" 362} 363 364func (t *toolchainLinuxMuslX86) Cflags() string { 365 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags() 366} 367 368func (t *toolchainLinuxMuslX86) Ldflags() string { 369 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags() 370} 371 372func (t *toolchainLinuxMuslX86) Lldflags() string { 373 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags() 374} 375 376func (t *toolchainLinuxMuslX8664) ClangTriple() string { 377 return "x86_64-linux-musl" 378} 379 380func (t *toolchainLinuxMuslX8664) Cflags() string { 381 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags() 382} 383 384func (t *toolchainLinuxMuslX8664) Ldflags() string { 385 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags() 386} 387 388func (t *toolchainLinuxMuslX8664) Lldflags() string { 389 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags() 390} 391 392var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{} 393var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{} 394 395func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain { 396 return toolchainLinuxMuslX86Singleton 397} 398 399func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain { 400 return toolchainLinuxMuslX8664Singleton 401} 402 403func init() { 404 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory) 405 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory) 406 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory) 407 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory) 408} 409