diff options
Diffstat (limited to 'gcc-4.4.3/gcc/config/linux.h')
-rw-r--r-- | gcc-4.4.3/gcc/config/linux.h | 72 |
1 files changed, 51 insertions, 21 deletions
diff --git a/gcc-4.4.3/gcc/config/linux.h b/gcc-4.4.3/gcc/config/linux.h index 581c6c34e..443db22bd 100644 --- a/gcc-4.4.3/gcc/config/linux.h +++ b/gcc-4.4.3/gcc/config/linux.h @@ -42,16 +42,17 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see provides part of the support for getting C++ file-scope static object constructed before entering `main'. */ -#undef STARTFILE_SPEC #if defined HAVE_LD_PIE -#define STARTFILE_SPEC \ +#define LINUX_TARGET_STARTFILE_SPEC \ "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \ crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" #else -#define STARTFILE_SPEC \ +#define LINUX_TARGET_STARTFILE_SPEC \ "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \ crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" #endif +#undef STARTFILE_SPEC +#define STARTFILE_SPEC LINUX_TARGET_STARTFILE_SPEC /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on the GNU/Linux magical crtend.o file (see crtstuff.c) which @@ -59,33 +60,44 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see object constructed before entering `main', followed by a normal GNU/Linux "finalizer" file, `crtn.o'. */ -#undef ENDFILE_SPEC -#define ENDFILE_SPEC \ +#define LINUX_TARGET_ENDFILE_SPEC \ "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s" +#undef ENDFILE_SPEC +#define ENDFILE_SPEC LINUX_TARGET_ENDFILE_SPEC /* This is for -profile to use -lc_p instead of -lc. */ +#define LINUX_TARGET_CC1_SPEC "%{profile:-p}" #ifndef CC1_SPEC -#define CC1_SPEC "%{profile:-p}" +#define CC1_SPEC LINUX_TARGET_CC1_SPEC #endif /* The GNU C++ standard library requires that these macros be defined. */ #undef CPLUSPLUS_CPP_SPEC #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" -#undef LIB_SPEC -#define LIB_SPEC \ +#define LINUX_TARGET_LIB_SPEC \ "%{pthread:-lpthread} \ %{shared:-lc} \ %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}" +#undef LIB_SPEC +#define LIB_SPEC LINUX_TARGET_LIB_SPEC + +/* C libraries supported on Linux. */ +#define OPTION_GLIBC (linux_libc == LIBC_GLIBC) +#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC) +#define OPTION_BIONIC (linux_libc == LIBC_BIONIC) #define LINUX_TARGET_OS_CPP_BUILTINS() \ do { \ - builtin_define ("__gnu_linux__"); \ + if (OPTION_GLIBC) \ + builtin_define ("__gnu_linux__"); \ builtin_define_std ("linux"); \ builtin_define_std ("unix"); \ builtin_assert ("system=linux"); \ builtin_assert ("system=unix"); \ builtin_assert ("system=posix"); \ + if (OPTION_ANDROID) \ + builtin_define ("__ANDROID__"); \ } while (0) #if defined(HAVE_LD_EH_FRAME_HDR) @@ -105,13 +117,24 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif /* Determine which dynamic linker to use depending on whether GLIBC or - uClibc is the default C library and whether -muclibc or -mglibc has - been passed to change the default. */ -#if UCLIBC_DEFAULT -#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}" ++ uClibc or Bionic is the default C library and whether ++ -muclibc or -mglibc or -mbionic has been passed to change the default. */ + +#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LD1, LD2, LD3) \ + "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:" LD1 "}}" + +#if DEFAULT_LIBC == LIBC_GLIBC +#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ + CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", G, U, B) +#elif DEFAULT_LIBC == LIBC_UCLIBC +#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ + CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", U, G, B) +#elif DEFAULT_LIBC == LIBC_BIONIC +#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ + CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", B, G, U) #else -#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}" -#endif +#error "Unsupported DEFAULT_LIBC" +#endif /* DEFAULT_LIBC */ /* For most targets the following definitions suffice; GLIBC_DYNAMIC_LINKER must be defined for each target using them, or @@ -123,12 +146,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define UCLIBC_DYNAMIC_LINKER RUNTIME_ROOT_PREFIX "/lib/ld-uClibc.so.0" #define UCLIBC_DYNAMIC_LINKER32 RUNTIME_ROOT_PREFIX "/lib/ld-uClibc.so.0" #define UCLIBC_DYNAMIC_LINKER64 RUNTIME_ROOT_PREFIX "/lib/ld64-uClibc.so.0" -#define LINUX_DYNAMIC_LINKER \ - CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) -#define LINUX_DYNAMIC_LINKER32 \ - CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32) -#define LINUX_DYNAMIC_LINKER64 \ - CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) +#define BIONIC_DYNAMIC_LINKER "/system/bin/linker" +#define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker" +#define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64" + +#define LINUX_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \ + BIONIC_DYNAMIC_LINKER) +#define LINUX_DYNAMIC_LINKER32 \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \ + BIONIC_DYNAMIC_LINKER32) +#define LINUX_DYNAMIC_LINKER64 \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \ + BIONIC_DYNAMIC_LINKER64) /* Determine whether the entire c99 runtime is present in the runtime library. */ |