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