1/* Definitions for systems using the Linux kernel, with or without
2 MMU, using ELF at the compiler level but possibly FLT for final
3 linked executables and shared libraries in some no-MMU cases, and
4 possibly with a choice of libc implementations.
5 Copyright (C) 1995-2017 Free Software Foundation, Inc.
6 Contributed by Eric Youngdale.
7 Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
8
9This file is part of GCC.
10
11GCC is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 3, or (at your option)
14any later version.
15
16GCC is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21Under Section 7 of GPL version 3, you are granted additional
22permissions described in the GCC Runtime Library Exception, version
233.1, as published by the Free Software Foundation.
24
25You should have received a copy of the GNU General Public License and
26a copy of the GCC Runtime Library Exception along with this program;
27see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
28<http://www.gnu.org/licenses/>. */
29
30/* C libraries supported on Linux. */
31#ifdef SINGLE_LIBC
32#define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
33#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
34#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
35#undef OPTION_MUSL
36#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL)
37#else
38#define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
39#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
40#define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
41#undef OPTION_MUSL
42#define OPTION_MUSL (linux_libc == LIBC_MUSL)
43#endif
44
45#define GNU_USER_TARGET_OS_CPP_BUILTINS() \
46 do { \
47 if (OPTION_GLIBC) \
48 builtin_define ("__gnu_linux__"); \
49 builtin_define_std ("linux"); \
50 builtin_define_std ("unix"); \
51 builtin_assert ("system=linux"); \
52 builtin_assert ("system=unix"); \
53 builtin_assert ("system=posix"); \
54 } while (0)
55
56/* Determine which dynamic linker to use depending on whether GLIBC or
57 uClibc or Bionic or musl is the default C library and whether
58 -muclibc or -mglibc or -mbionic or -mmusl has been passed to change
59 the default. */
60
61#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4) \
62 "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}"
63
64#if DEFAULT_LIBC == LIBC_GLIBC
65#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
66 CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M)
67#elif DEFAULT_LIBC == LIBC_UCLIBC
68#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
69 CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M)
70#elif DEFAULT_LIBC == LIBC_BIONIC
71#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
72 CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", "mmusl", B, G, U, M)
73#elif DEFAULT_LIBC == LIBC_MUSL
74#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
75 CHOOSE_DYNAMIC_LINKER1 ("mmusl", "mglibc", "muclibc", "mbionic", M, G, U, B)
76#else
77#error "Unsupported DEFAULT_LIBC"
78#endif /* DEFAULT_LIBC */
79
80/* For most targets the following definitions suffice;
81 GLIBC_DYNAMIC_LINKER must be defined for each target using them, or
82 GLIBC_DYNAMIC_LINKER32 and GLIBC_DYNAMIC_LINKER64 for targets
83 supporting both 32-bit and 64-bit compilation. */
84#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
85#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
86#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
87#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
88#define BIONIC_DYNAMIC_LINKER "/system/bin/linker"
89#define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker"
90#define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64"
91#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
92/* Should be redefined for each target that supports musl. */
93#define MUSL_DYNAMIC_LINKER "/dev/null"
94#define MUSL_DYNAMIC_LINKER32 "/dev/null"
95#define MUSL_DYNAMIC_LINKER64 "/dev/null"
96#define MUSL_DYNAMIC_LINKERX32 "/dev/null"
97
98#define GNU_USER_DYNAMIC_LINKER \
99 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
100 BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
101#define GNU_USER_DYNAMIC_LINKER32 \
102 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
103 BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
104#define GNU_USER_DYNAMIC_LINKER64 \
105 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
106 BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
107#define GNU_USER_DYNAMIC_LINKERX32 \
108 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
109 BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKERX32)
110
111/* Whether we have Bionic libc runtime */
112#undef TARGET_HAS_BIONIC
113#define TARGET_HAS_BIONIC (OPTION_BIONIC)
114
115/* musl avoids problematic includes by rearranging the include directories.
116 * Unfortunately, this is mostly duplicated from cppdefault.c */
117#if DEFAULT_LIBC == LIBC_MUSL
118#define INCLUDE_DEFAULTS_MUSL_GPP \
119 { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, \
120 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 }, \
121 { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1, \
122 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 }, \
123 { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, \
124 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
125
126#ifdef LOCAL_INCLUDE_DIR
127#define INCLUDE_DEFAULTS_MUSL_LOCAL \
128 { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, \
129 { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
130#else
131#define INCLUDE_DEFAULTS_MUSL_LOCAL
132#endif
133
134#ifdef PREFIX_INCLUDE_DIR
135#define INCLUDE_DEFAULTS_MUSL_PREFIX \
136 { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0},
137#else
138#define INCLUDE_DEFAULTS_MUSL_PREFIX
139#endif
140
141#ifdef CROSS_INCLUDE_DIR
142#define INCLUDE_DEFAULTS_MUSL_CROSS \
143 { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0},
144#else
145#define INCLUDE_DEFAULTS_MUSL_CROSS
146#endif
147
148#ifdef TOOL_INCLUDE_DIR
149#define INCLUDE_DEFAULTS_MUSL_TOOL \
150 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0},
151#else
152#define INCLUDE_DEFAULTS_MUSL_TOOL
153#endif
154
155#ifdef NATIVE_SYSTEM_HEADER_DIR
156#define INCLUDE_DEFAULTS_MUSL_NATIVE \
157 { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 }, \
158 { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
159#else
160#define INCLUDE_DEFAULTS_MUSL_NATIVE
161#endif
162
163#if defined (CROSS_DIRECTORY_STRUCTURE) && !defined (TARGET_SYSTEM_ROOT)
164# undef INCLUDE_DEFAULTS_MUSL_LOCAL
165# define INCLUDE_DEFAULTS_MUSL_LOCAL
166# undef INCLUDE_DEFAULTS_MUSL_NATIVE
167# define INCLUDE_DEFAULTS_MUSL_NATIVE
168#else
169# undef INCLUDE_DEFAULTS_MUSL_CROSS
170# define INCLUDE_DEFAULTS_MUSL_CROSS
171#endif
172
173#undef INCLUDE_DEFAULTS
174#define INCLUDE_DEFAULTS \
175 { \
176 INCLUDE_DEFAULTS_MUSL_GPP \
177 INCLUDE_DEFAULTS_MUSL_LOCAL \
178 INCLUDE_DEFAULTS_MUSL_PREFIX \
179 INCLUDE_DEFAULTS_MUSL_CROSS \
180 INCLUDE_DEFAULTS_MUSL_TOOL \
181 INCLUDE_DEFAULTS_MUSL_NATIVE \
182 { GCC_INCLUDE_DIR, "GCC", 0, 1, 0, 0 }, \
183 { 0, 0, 0, 0, 0, 0 } \
184 }
185#endif
186
187#if (DEFAULT_LIBC == LIBC_UCLIBC) && defined (SINGLE_LIBC) /* uClinux */
188/* This is a *uclinux* target. We don't define below macros to normal linux
189 versions, because doing so would require *uclinux* targets to include
190 linux.c, linux-protos.h, linux.opt, etc. We could, alternatively, add
191 these files to *uclinux* targets, but that would only pollute option list
192 (add -mglibc, etc.) without adding any useful support. */
193
194/* Define TARGET_LIBC_HAS_FUNCTION for *uclinux* targets to
195 no_c99_libc_has_function, because uclibc does not, normally, have
196 c99 runtime. If, in special cases, uclibc does have c99 runtime,
197 this should be defined to a new hook. Also please note that for targets
198 like *-linux-uclibc that similar check will also need to be added to
199 linux_libc_has_function. */
200# undef TARGET_LIBC_HAS_FUNCTION
201# define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function
202
203#else /* !uClinux, i.e., normal Linux */
204
205/* Determine what functions are present at the runtime;
206 this includes full c99 runtime and sincos. */
207# undef TARGET_LIBC_HAS_FUNCTION
208# define TARGET_LIBC_HAS_FUNCTION linux_libc_has_function
209
210#endif
211