blob: 287967c1205be49b9de5d2a877056fee3478b8f6 [file] [log] [blame]
Colin Crossb98c8b02016-07-29 13:44:28 -07001// 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{
Colin Crossb98c8b02016-07-29 13:44:28 -070025 "-Wa,--noexecstack",
26
27 "-fPIC",
Colin Crossb98c8b02016-07-29 13:44:28 -070028
Elliott Hughes0b5dce62024-08-20 15:06:00 +000029 "-fno-omit-frame-pointer",
30
Colin Crossb98c8b02016-07-29 13:44:28 -070031 "-U_FORTIFY_SOURCE",
32 "-D_FORTIFY_SOURCE=2",
33 "-fstack-protector",
34
Colin Cross33bac242021-07-14 17:03:16 -070035 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross5d6904e2021-07-23 22:20:29 +000036 "-fstack-protector-strong",
Colin Cross4fb4ef22021-07-19 14:11:03 -070037 }
38
Colin Cross528d67e2021-07-23 22:23:07 +000039 linuxGlibcCflags = []string{
40 "--sysroot ${LinuxGccRoot}/sysroot",
41 }
42
43 linuxMuslCflags = []string{
44 "-D_LIBCPP_HAS_MUSL_LIBC",
Colin Cross7e7b0282021-08-16 14:42:53 -070045 "-DANDROID_HOST_MUSL",
Colin Cross528d67e2021-07-23 22:23:07 +000046 "-nostdlibinc",
Colin Cross6745a8e2022-02-11 13:43:21 -080047 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000048 }
49
Colin Crossb98c8b02016-07-29 13:44:28 -070050 linuxLdflags = []string{
51 "-Wl,-z,noexecstack",
52 "-Wl,-z,relro",
53 "-Wl,-z,now",
54 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070055
56 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross528d67e2021-07-23 22:23:07 +000057 }
58
Eric Rahm19524712023-10-20 15:56:27 +000059 linuxLldflags = append(linuxLdflags,
60 "-Wl,--compress-debug-sections=zstd",
61 )
62
Colin Cross528d67e2021-07-23 22:23:07 +000063 linuxGlibcLdflags = []string{
Colin Cross33bac242021-07-14 17:03:16 -070064 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070065 }
66
Colin Cross528d67e2021-07-23 22:23:07 +000067 linuxMuslLdflags = []string{
68 "-nostdlib",
Colin Cross6745a8e2022-02-11 13:43:21 -080069 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000070 }
71
Colin Crossb98c8b02016-07-29 13:44:28 -070072 // Extended cflags
73 linuxX86Cflags = []string{
74 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070075 "-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",
Colin Cross33bac242021-07-14 17:03:16 -070087 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
88 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
89 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070090 }
91
92 linuxX8664Ldflags = []string{
93 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070094 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
95 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
96 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070097 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070098
Colin Crossb98c8b02016-07-29 13:44:28 -070099 linuxAvailableLibraries = addPrefix([]string{
100 "c",
101 "dl",
102 "gcc",
103 "gcc_s",
104 "m",
105 "ncurses",
106 "pthread",
107 "resolv",
108 "rt",
109 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700110 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000111
Colin Crossf26b4662021-08-18 13:55:01 -0700112 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
Colin Cross3699f832022-09-16 17:26:24 +0000113 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic"}, []string{"libc_musl_crtend"}
Colin Cross528d67e2021-07-23 22:23:07 +0000114 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
115
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000116 MuslDefaultSharedLibraries = []string{"libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700117)
118
119const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800120 linuxGccVersion = "4.8.3"
121 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700122)
123
124func init() {
Cole Faust8982b1c2024-04-08 16:54:45 -0700125 pctx.StaticVariable("LinuxGccVersion", linuxGccVersion)
126 pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400127
George Burgess IV7294cdc2019-01-23 13:59:10 -0800128 // 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 {
Cole Faust8982b1c2024-04-08 16:54:45 -0700130 pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800131 } else {
Cole Faust8982b1c2024-04-08 16:54:45 -0700132 pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800133 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700134
Cole Faust8982b1c2024-04-08 16:54:45 -0700135 pctx.SourcePathVariable("LinuxGccRoot",
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400136 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700137
Cole Faust8982b1c2024-04-08 16:54:45 -0700138 pctx.StaticVariable("LinuxGccTriple", "x86_64-linux")
Colin Crossb98c8b02016-07-29 13:44:28 -0700139
Cole Faust8982b1c2024-04-08 16:54:45 -0700140 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, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700149
Cole Faust8982b1c2024-04-08 16:54:45 -0700150 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, " "))
Greg Hartman09302be2017-10-04 17:31:43 -0700156 // Yasm flags
Cole Faust8982b1c2024-04-08 16:54:45 -0700157 pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
158 pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
Colin Crossb98c8b02016-07-29 13:44:28 -0700159}
160
161type toolchainLinux struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700162 toolchainBase
Colin Crossb98c8b02016-07-29 13:44:28 -0700163 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
Colin Crossb98c8b02016-07-29 13:44:28 -0700184func (t *toolchainLinux) IncludeFlags() string {
185 return ""
186}
187
Colin Cross33bac242021-07-14 17:03:16 -0700188func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700189 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700190}
191
Colin Cross33bac242021-07-14 17:03:16 -0700192func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800193 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700194}
195
Colin Cross33bac242021-07-14 17:03:16 -0700196func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700197 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700198}
199
Colin Cross33bac242021-07-14 17:03:16 -0700200func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800201 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700202}
203
Colin Cross33bac242021-07-14 17:03:16 -0700204func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700205 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700206}
207
Colin Cross33bac242021-07-14 17:03:16 -0700208func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700209 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700210}
211
Colin Cross33bac242021-07-14 17:03:16 -0700212func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700213 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700214}
215
Colin Cross33bac242021-07-14 17:03:16 -0700216func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700217 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700218}
219
Greg Hartman09302be2017-10-04 17:31:43 -0700220func (t *toolchainLinuxX86) YasmFlags() string {
221 return "${config.LinuxX86YasmFlags}"
222}
223
224func (t *toolchainLinuxX8664) YasmFlags() string {
225 return "${config.LinuxX8664YasmFlags}"
226}
227
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700228func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500229 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700230}
231
232func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
233 return "x86_64"
234}
235
Colin Crossb98c8b02016-07-29 13:44:28 -0700236func (t *toolchainLinux) AvailableLibraries() []string {
237 return linuxAvailableLibraries
238}
239
Colin Crossfc3b0642022-09-01 11:02:15 -0700240func (toolchainLinux) ShlibSuffix() string {
241 return ".so"
242}
243
244func (toolchainLinux) ExecutableSuffix() string {
245 return ""
246}
247
Colin Cross528d67e2021-07-23 22:23:07 +0000248// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700249
Colin Cross528d67e2021-07-23 22:23:07 +0000250type toolchainGlibc struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700251 toolchainNoCrt
Colin Crossb98c8b02016-07-29 13:44:28 -0700252}
253
Colin Cross528d67e2021-07-23 22:23:07 +0000254func (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
Colin Cross72ee6762022-01-28 14:05:22 -0800278func (t *toolchainLinuxGlibcX86) ClangTriple() string {
279 return "i686-linux-gnu"
280}
281
Colin Cross528d67e2021-07-23 22:23:07 +0000282func (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
Colin Cross72ee6762022-01-28 14:05:22 -0800294func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
295 return "x86_64-linux-gnu"
296}
297
Colin Cross528d67e2021-07-23 22:23:07 +0000298func (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
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800328func (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 }
Colin Cross528d67e2021-07-23 22:23:07 +0000335
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000336func (toolchainMusl) DefaultSharedLibraries() []string { return MuslDefaultSharedLibraries }
Colin Cross528d67e2021-07-23 22:23:07 +0000337
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
Colin Cross72ee6762022-01-28 14:05:22 -0800360func (t *toolchainLinuxMuslX86) ClangTriple() string {
361 return "i686-linux-musl"
362}
363
Colin Cross528d67e2021-07-23 22:23:07 +0000364func (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
Colin Cross72ee6762022-01-28 14:05:22 -0800376func (t *toolchainLinuxMuslX8664) ClangTriple() string {
377 return "x86_64-linux-musl"
378}
379
Colin Cross528d67e2021-07-23 22:23:07 +0000380func (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
Colin Crossb98c8b02016-07-29 13:44:28 -0700401}
402
403func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000404 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)
Colin Crossb98c8b02016-07-29 13:44:28 -0700408}