]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/linux.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / linux.h
CommitLineData
deb14f24 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.
f1717362 5 Copyright (C) 1995-2016 Free Software Foundation, Inc.
b80b8662 6 Contributed by Eric Youngdale.
997d68fe 7 Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
b80b8662 8
9a4d577b 9This file is part of GCC.
b80b8662 10
9a4d577b 11GCC is free software; you can redistribute it and/or modify
b80b8662 12it under the terms of the GNU General Public License as published by
038d1e19 13the Free Software Foundation; either version 3, or (at your option)
b80b8662 14any later version.
15
9a4d577b 16GCC is distributed in the hope that it will be useful,
b80b8662 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
6bc9506f 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
038d1e19 28<http://www.gnu.org/licenses/>. */
b80b8662 29
66fd9df9 30/* C libraries supported on Linux. */
d9993a19 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)
f2d678af 35#undef OPTION_MUSL
a9173cea 36#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL)
d9993a19 37#else
66fd9df9 38#define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
39#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
40#define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
f2d678af 41#undef OPTION_MUSL
a9173cea 42#define OPTION_MUSL (linux_libc == LIBC_MUSL)
d9993a19 43#endif
66fd9df9 44
493a87fa 45#define GNU_USER_TARGET_OS_CPP_BUILTINS() \
bcc76966 46 do { \
66fd9df9 47 if (OPTION_GLIBC) \
48 builtin_define ("__gnu_linux__"); \
bcc76966 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
ee085235 56/* Determine which dynamic linker to use depending on whether GLIBC or
a9173cea 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. */
66fd9df9 60
a9173cea 61#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4) \
62 "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}"
66fd9df9 63
64#if DEFAULT_LIBC == LIBC_GLIBC
a9173cea 65#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
66 CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M)
66fd9df9 67#elif DEFAULT_LIBC == LIBC_UCLIBC
a9173cea 68#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
69 CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M)
66fd9df9 70#elif DEFAULT_LIBC == LIBC_BIONIC
a9173cea 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)
ee085235 76#else
66fd9df9 77#error "Unsupported DEFAULT_LIBC"
78#endif /* DEFAULT_LIBC */
ee085235 79
c490c13b 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. */
ee085235 84#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
c490c13b 85#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
86#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
596b2ba3 87#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
66fd9df9 88#define BIONIC_DYNAMIC_LINKER "/system/bin/linker"
89#define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker"
90#define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64"
596b2ba3 91#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
a9173cea 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"
66fd9df9 97
493a87fa 98#define GNU_USER_DYNAMIC_LINKER \
66fd9df9 99 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
a9173cea 100 BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
493a87fa 101#define GNU_USER_DYNAMIC_LINKER32 \
66fd9df9 102 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
a9173cea 103 BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
493a87fa 104#define GNU_USER_DYNAMIC_LINKER64 \
66fd9df9 105 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
a9173cea 106 BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
596b2ba3 107#define GNU_USER_DYNAMIC_LINKERX32 \
108 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
a9173cea 109 BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKERX32)
ee085235 110
05c1aa95 111/* Whether we have Bionic libc runtime */
112#undef TARGET_HAS_BIONIC
113#define TARGET_HAS_BIONIC (OPTION_BIONIC)
30f690e0 114
a9173cea 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 \
599e4bed 177 INCLUDE_DEFAULTS_MUSL_LOCAL \
a9173cea 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
89ac5e5b 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
30f690e0 205/* Determine what functions are present at the runtime;
206 this includes full c99 runtime and sincos. */
89ac5e5b 207# undef TARGET_LIBC_HAS_FUNCTION
208# define TARGET_LIBC_HAS_FUNCTION linux_libc_has_function
209
210#endif