More fixes after the upgrades:

- GLIBC requires a fix to work with binutils 2.30 on aarch64. This fix
  relies on binutils 2.24 or newer, which is okay for glibc 2.26 since
  it needs 2.25 or newer anyway. But older glibc versions are now pinned
  to binutils 2.29 or older on aarch64.
- xtensa needs patches in libgcc with gcc 7.3.
- comment in newlib's patch to indicate it is a reversal of a commit.

Signed-off-by: Alexey Neyman <stilor@att.net>
This commit is contained in:
Alexey Neyman 2018-01-30 15:08:18 -08:00
parent 1c329c33bf
commit 36bb675a71
21 changed files with 1052 additions and 942 deletions

View File

@ -26,9 +26,14 @@ config GLIBC_DEP_KERNEL_HEADERS_VERSION
def_bool y def_bool y
select LINUX_REQUIRE_3_2_or_later if GLIBC_2_24_or_later select LINUX_REQUIRE_3_2_or_later if GLIBC_2_24_or_later
# Glibc 2.26 requires at least binutils 2.25.
# Also, binutils 2.30 fail while compiling aarch64 glibc; fixed in 2.27
# and backported to 2.26. For other versions, require binutils older than
# 2.30 (if the patch is backported, binutils 2.23 will break).
config GLIBC_DEP_BINUTILS config GLIBC_DEP_BINUTILS
def_bool y def_bool y
select BINUTILS_REQUIRE_2_25_or_later if GLIBC_2_26_or_later select BINUTILS_REQUIRE_2_25_or_later if GLIBC_2_26_or_later
select BINUTILS_REQUIRE_older_than_2_30 if GLIBC_older_than_2_26 && ARCH_ARM && ARCH_64
config GLIBC_DEP_GCC config GLIBC_DEP_GCC
def_bool y def_bool y

View File

@ -1,6 +1,6 @@
repository='git git://sourceware.org/git/binutils-gdb.git' repository='git git://sourceware.org/git/binutils-gdb.git'
mirrors='$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)' mirrors='$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)'
origin='GNU' origin='GNU'
milestones='2.23 2.25' milestones='2.23 2.25 2.30'
archive_formats='.tar.xz .tar.bz2 .tar.gz' archive_formats='.tar.xz .tar.bz2 .tar.gz'
signature_format='packed/.sig' signature_format='packed/.sig'

View File

@ -53,7 +53,7 @@
if test x"$have_pic_shared" != x"yes" -o x"$ac_cv_search_dlopen" = x"no"; then if test x"$have_pic_shared" != x"yes" -o x"$ac_cv_search_dlopen" = x"no"; then
--- a/gcc/configure --- a/gcc/configure
+++ b/gcc/configure +++ b/gcc/configure
@@ -29478,6 +29478,9 @@ @@ -29510,6 +29510,9 @@
pluginlibs= pluginlibs=
@ -63,7 +63,7 @@
case "${host}" in case "${host}" in
*-*-darwin*) *-*-darwin*)
if test x$build = x$host; then if test x$build = x$host; then
@@ -29488,6 +29491,11 @@ @@ -29520,6 +29523,11 @@
export_sym_check= export_sym_check=
fi fi
;; ;;
@ -75,7 +75,7 @@
*) *)
if test x$build = x$host; then if test x$build = x$host; then
export_sym_check="objdump${exeext} -T" export_sym_check="objdump${exeext} -T"
@@ -29600,23 +29608,23 @@ @@ -29632,23 +29640,23 @@
case "${host}" in case "${host}" in
*-*-darwin*) *-*-darwin*)
CFLAGS=`echo $CFLAGS | sed s/-mdynamic-no-pic//g` CFLAGS=`echo $CFLAGS | sed s/-mdynamic-no-pic//g`

View File

@ -10,7 +10,7 @@ Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
--- a/libgcc/config.host --- a/libgcc/config.host
+++ b/libgcc/config.host +++ b/libgcc/config.host
@@ -820,7 +820,7 @@ @@ -821,7 +821,7 @@
m68k*-*-openbsd*) m68k*-*-openbsd*)
;; ;;
m68k-*-uclinux*) # Motorola m68k/ColdFire running uClinux with uClibc m68k-*-uclinux*) # Motorola m68k/ColdFire running uClinux with uClibc

529
packages/gcc/7.3.0/0012-crystax.patch vendored Normal file
View File

@ -0,0 +1,529 @@
commit 080803512c8f6f87c2f1f711170d54033144d628
Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Wed Jul 29 11:28:29 2015 +0300
[android] Apply Android-related modifications
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
[Edited: keep libstdc++, drop libcrystax-related modifications]
---
gcc/config.gcc | 17 +++++++-
gcc/config/aarch64/aarch64-linux-android.h | 59 +++++++++++++++++++++++++++++
gcc/config/aarch64/aarch64-linux.h | 9 +++-
gcc/config/arm/arm.h | 3 -
gcc/config/arm/arm.md | 2
gcc/config/arm/arm.opt | 4 +
gcc/config/arm/elf.h | 9 ++--
gcc/config/arm/linux-eabi.h | 7 ++-
gcc/config/i386/gnu-user.h | 7 ++-
gcc/config/i386/gnu-user64.h | 5 ++
gcc/config/i386/linux-common.h | 8 +++
gcc/config/linux-android.h | 13 +++---
gcc/config/mips/android.h | 49 ++++++++++++++++++++++++
gcc/config/mips/gnu-user.h | 6 +-
gcc/config/mips/linux-common.h | 2
gcc/config/mips/t-linux-android | 3 +
gcc/config/mips/t-linux-android64 | 4 +
libgcc/gthr-posix.h | 13 ++++++
libstdc++-v3/configure | 12 +++++
libstdc++-v3/include/bits/locale_facets.h | 18 +++++++-
libstdc++-v3/libsupc++/guard.cc | 5 ++
21 files changed, 235 insertions(+), 20 deletions(-)
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -963,13 +963,17 @@
tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-aarch64-freebsd"
;;
aarch64*-*-linux*)
- tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h"
+ tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h"
tm_file="${tm_file} aarch64/aarch64-elf.h aarch64/aarch64-linux.h"
+ extra_options="${extra_options} linux-android.opt"
tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-aarch64-linux"
case $target in
aarch64_be-*)
tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
;;
+ aarch64*-*-linux-android*)
+ tm_file="${tm_file} aarch64/aarch64-linux-android.h"
+ ;;
esac
aarch64_multilibs="${with_multilib_list}"
if test "$aarch64_multilibs" = "default"; then
@@ -2092,6 +2096,17 @@
tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h"
extra_options="${extra_options} linux-android.opt"
case ${target} in
+ mips64*android*)
+ default_mips_arch=mips64r6
+ default_mips_abi=64
+ tm_file="${tm_file} mips/android.h"
+ tmake_file="${tmake_file} mips/t-linux-android64"
+ ;;
+ mips*android*)
+ default_mips_arch=mips32
+ tm_file="${tm_file} mips/android.h"
+ tmake_file="$tmake_file mips/t-linux-android"
+ ;;
mipsisa32r6*)
default_mips_arch=mips32r6
;;
--- /dev/null
+++ b/gcc/config/aarch64/aarch64-linux-android.h
@@ -0,0 +1,59 @@
+/* Machine description for AArch64 architecture.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_AARCH64_LINUX_ANDROID_H
+#define GCC_AARCH64_LINUX_ANDROID_H
+
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ GNU_USER_TARGET_OS_CPP_BUILTINS(); \
+ ANDROID_TARGET_OS_CPP_BUILTINS(); \
+ } \
+ while (0)
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+ LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
+ LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
+
+#undef CC1_SPEC
+#define CC1_SPEC \
+ LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
+ GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC("-fpic"))
+
+#define CC1PLUS_SPEC \
+ LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
+
+#undef LIB_SPEC
+#define LIB_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
+ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
+
+#endif /* GCC_AARCH64_LINUX_ANDROID_H */
--- a/gcc/config/aarch64/aarch64-linux.h
+++ b/gcc/config/aarch64/aarch64-linux.h
@@ -21,7 +21,14 @@
#ifndef GCC_AARCH64_LINUX_H
#define GCC_AARCH64_LINUX_H
-#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
+#ifndef RUNTIME_ROOT_PREFIX
+#define RUNTIME_ROOT_PREFIX ""
+#endif
+#define GLIBC_DYNAMIC_LINKER RUNTIME_ROOT_PREFIX "/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
+#ifdef BIONIC_DYNAMIC_LINKER
+#undef BIONIC_DYNAMIC_LINKER
+#endif
+#define BIONIC_DYNAMIC_LINKER RUNTIME_ROOT_PREFIX "/system/bin/linker64"
#undef MUSL_DYNAMIC_LINKER
#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -1876,10 +1876,11 @@
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB1 \
+ && !inline_thumb1_jump_table \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
- (TARGET_THUMB1 \
+ (TARGET_THUMB1 && !inline_thumb1_jump_table \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -8668,7 +8668,7 @@
(match_operand:SI 2 "const_int_operand" "") ; total range
(match_operand:SI 3 "" "") ; table label
(match_operand:SI 4 "" "")] ; Out of range label
- "(TARGET_32BIT || optimize_size || flag_pic) && !target_pure_code"
+ "(TARGET_32BIT || ((optimize_size || flag_pic) && !inline_thumb1_jump_table)) && !target_pure_code"
"
{
enum insn_code code;
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -193,6 +193,10 @@
Target Report Mask(INTERWORK)
Support calls between Thumb and ARM instruction sets.
+minline-thumb1-jumptable
+Target Report Var(inline_thumb1_jump_table)
+Inline Thumb1 Jump table code
+
mtls-dialect=
Target RejectNegative Joined Enum(tls_type) Var(target_tls_dialect) Init(TLS_GNU)
Specify thread local storage scheme.
--- a/gcc/config/arm/elf.h
+++ b/gcc/config/arm/elf.h
@@ -56,8 +56,7 @@
#undef SUBSUBTARGET_EXTRA_SPECS
#define SUBSUBTARGET_EXTRA_SPECS
-#ifndef ASM_SPEC
-#define ASM_SPEC "\
+#define DEFAULT_ASM_SPEC "\
%{mbig-endian:-EB} \
%{mlittle-endian:-EL} \
%(asm_cpu_spec) \
@@ -66,6 +65,9 @@
%{mthumb-interwork:-mthumb-interwork} \
%{mfloat-abi=*} %{mfpu=*} \
%(subtarget_extra_asm_spec)"
+
+#ifndef ASM_SPEC
+#define ASM_SPEC DEFAULT_ASM_SPEC
#endif
/* The ARM uses @ are a comment character so we need to redefine
@@ -95,7 +97,8 @@
the code more efficient, but for Thumb-1 it's better to put them out of
band unless we are generating compressed tables. */
#define JUMP_TABLES_IN_TEXT_SECTION \
- ((TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic))) \
+ ((TARGET_32BIT || (TARGET_THUMB && !inline_thumb1_jump_table \
+ && (optimize_size || flag_pic))) \
&& !target_pure_code)
#ifndef LINK_SPEC
--- a/gcc/config/arm/linux-eabi.h
+++ b/gcc/config/arm/linux-eabi.h
@@ -102,11 +102,16 @@
#define CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC, \
GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " \
- ANDROID_CC1_SPEC)
+ ANDROID_CC1_SPEC("-fpic"))
#define CC1PLUS_SPEC \
LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
+#undef ASM_SPEC
+#define ASM_SPEC \
+ LINUX_OR_ANDROID_CC (DEFAULT_ASM_SPEC, \
+ DEFAULT_ASM_SPEC " " ANDROID_ASM_SPEC)
+
#undef LIB_SPEC
#define LIB_SPEC \
LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
--- a/gcc/config/i386/gnu-user.h
+++ b/gcc/config/i386/gnu-user.h
@@ -65,9 +65,14 @@
When the -shared link option is used a final link is not being
done. */
+#undef ANDROID_TARGET_CC1_SPEC
+#define ANDROID_TARGET_CC1_SPEC \
+ " -mssse3 -fno-short-enums " \
+
#undef ASM_SPEC
#define ASM_SPEC \
- "--32 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}"
+ "--32 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}} " \
+ LINUX_OR_ANDROID_CC ("", ANDROID_ASM_SPEC)
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
--- a/gcc/config/i386/gnu-user64.h
+++ b/gcc/config/i386/gnu-user64.h
@@ -46,6 +46,11 @@
#define SPEC_X32 "mx32"
#endif
+#undef ANDROID_TARGET_CC1_SPEC
+#define ANDROID_TARGET_CC1_SPEC \
+ "%{m32:-mssse3 -fno-short-enums}" \
+ "%{!m32:-msse4.2 -mpopcnt}"
+
#undef ASM_SPEC
#define ASM_SPEC "%{" SPEC_32 ":--32} \
%{" SPEC_64 ":--64} \
--- a/gcc/config/i386/linux-common.h
+++ b/gcc/config/i386/linux-common.h
@@ -30,7 +30,13 @@
#undef CC1_SPEC
#define CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
+ GNU_USER_TARGET_CC1_SPEC \
+ ANDROID_TARGET_CC1_SPEC \
+ " " \
+ ANDROID_CC1_SPEC("-fPIC"))
+
+#define CC1PLUS_SPEC \
+ LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
#undef LINK_SPEC
#define LINK_SPEC \
--- a/gcc/config/linux-android.h
+++ b/gcc/config/linux-android.h
@@ -38,15 +38,18 @@
"%{" NOANDROID "|tno-android-ld:" LINUX_SPEC ";:" ANDROID_SPEC "}"
#define ANDROID_LINK_SPEC \
- "%{shared: -Bsymbolic}"
+ "%{shared: -Bsymbolic} -z noexecstack -z relro -z now"
-#define ANDROID_CC1_SPEC \
+#define ANDROID_CC1_SPEC(ANDROID_PIC_DEFAULT) \
"%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} " \
- "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}"
+ "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: " ANDROID_PIC_DEFAULT "}}}}"
#define ANDROID_CC1PLUS_SPEC \
- "%{!fexceptions:%{!fno-exceptions: -fno-exceptions}} " \
- "%{!frtti:%{!fno-rtti: -fno-rtti}}"
+ "%{!fexceptions:%{!fno-exceptions: -fexceptions}} " \
+ "%{!frtti:%{!fno-rtti: -frtti}}"
+
+#define ANDROID_ASM_SPEC \
+ "--noexecstack"
#define ANDROID_LIB_SPEC \
"%{!static: -ldl}"
--- /dev/null
+++ b/gcc/config/mips/android.h
@@ -0,0 +1,49 @@
+/* Target macros for mips*-*android* targets.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+ /* Make sure a -mips option is present. This helps us to pick \
+ the right multilib, and also makes the later specs easier \
+ to write. */ \
+ MIPS_ISA_LEVEL_SPEC, \
+ \
+ /* Infer the default float setting from -march. */ \
+ MIPS_ARCH_FLOAT_SPEC, \
+ \
+ /* Infer the -msynci setting from -march if not explicitly set. */ \
+ MIPS_ISA_SYNCI_SPEC, \
+ \
+ /* If no ABI option is specified, infer one from the ISA level \
+ or -mgp setting. */ \
+ "%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=64}}", \
+ \
+ /* If no FP ABI option is specified, infer one from the \
+ ABI/ISA level unless there is a conflicting option. */ \
+ "%{!msoft-float: %{!msingle-float: %{!mfp*: %{!mmsa: %{mabi=32: %{" \
+ MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}}", \
+ \
+ /* If no odd-spreg option is specified, infer one from the ISA. */ \
+ "%{!modd-spreg: %{mabi=32: %{mips32r6: -mno-odd-spreg}}}", \
+ \
+ /* Base SPECs. */ \
+ BASE_DRIVER_SELF_SPECS, \
+ \
+ /* Use the standard linux specs for everything else. */ \
+ LINUX_DRIVER_SELF_SPECS
--- a/gcc/config/mips/gnu-user.h
+++ b/gcc/config/mips/gnu-user.h
@@ -36,6 +36,7 @@
/* The GNU C++ standard library requires this. */ \
if (c_dialect_cxx ()) \
builtin_define ("_GNU_SOURCE"); \
+ ANDROID_TARGET_OS_CPP_BUILTINS(); \
} while (0)
#undef SUBTARGET_CPP_SPEC
@@ -71,7 +72,8 @@
#undef SUBTARGET_ASM_SPEC
#define SUBTARGET_ASM_SPEC \
- "%{!mno-abicalls:%{mplt:-call_nonpic;:-KPIC}}"
+ "%{!mno-abicalls:%{mplt:-call_nonpic;:-KPIC}} " \
+ LINUX_OR_ANDROID_CC ("", ANDROID_ASM_SPEC)
/* The MIPS assembler has different syntax for .set. We set it to
.dummy to trap any errors. */
@@ -120,7 +122,7 @@
#endif
#define LINUX_DRIVER_SELF_SPECS \
- NO_SHARED_SPECS \
+ LINUX_OR_ANDROID_CC(NO_SHARED_SPECS, "") \
MARCH_MTUNE_NATIVE_SPECS, \
/* -mplt has no effect without -mno-shared. Simplify later \
specs handling by removing a redundant option. */ \
--- a/gcc/config/mips/linux-common.h
+++ b/gcc/config/mips/linux-common.h
@@ -35,7 +35,7 @@
#undef SUBTARGET_CC1_SPEC
#define SUBTARGET_CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
+ GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC("-fpic"))
#undef CC1PLUS_SPEC
#define CC1PLUS_SPEC \
--- /dev/null
+++ b/gcc/config/mips/t-linux-android
@@ -0,0 +1,3 @@
+MULTILIB_OPTIONS = mips32r2/mips32r6
+MULTILIB_DIRNAMES = mips-r2 mips-r6
+MULTILIB_OSDIRNAMES = ../libr2 ../libr6
--- /dev/null
+++ b/gcc/config/mips/t-linux-android64
@@ -0,0 +1,4 @@
+MULTILIB_OPTIONS = mabi=32 mips32/mips32r2/mips32r6/mips64r2/mips64r6
+MULTILIB_DIRNAMES = 32 mips-r1 mips-r2 mips-r6 mips64-r2 mips64-r6
+MULTILIB_OSDIRNAMES = ../lib ../lib ../libr2 ../libr6 ../lib64r2 ../lib64
+MULTILIB_REQUIRED = mabi=32/mips32 mabi=32/mips32r2 mabi=32/mips32r6 mips64r2 mips64r6
--- a/libgcc/gthr-posix.h
+++ b/libgcc/gthr-posix.h
@@ -32,6 +32,19 @@
#define __GTHREADS 1
#define __GTHREADS_CXX0X 1
+/* The following should normally be in a different header file,
+ * but I couldn't find the right location. The point of the macro
+ * definition below is to prevent libsupc++ and libstdc++ to reference
+ * weak symbols in their static C++ constructors. Such code crashes
+ * when a shared object linked statically to these libraries is
+ * loaded on Android 2.1 (Eclair) and older platform releases, due
+ * to a dynamic linker bug.
+ */
+#ifdef __ANDROID__
+#undef GTHREAD_USE_WEAK
+#define GTHREAD_USE_WEAK 0
+#endif
+
#include <pthread.h>
#if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -78536,6 +78536,12 @@
/* end confdefs.h. */
#include <sys/syscall.h>
int lk;
+#if !defined(SYS_gettid)
+#define SYS_gettid __NR_gettid
+#endif
+#if !defined(SYS_futex)
+#define SYS_futex __NR_futex
+#endif
int
main ()
{
@@ -78594,6 +78600,12 @@
/* end confdefs.h. */
#include <sys/syscall.h>
int lk;
+#if !defined(SYS_gettid)
+#define SYS_gettid __NR_gettid
+#endif
+#if !defined(SYS_futex)
+#define SYS_futex __NR_futex
+#endif
int
main ()
{
--- a/libstdc++-v3/include/bits/locale_facets.h
+++ b/libstdc++-v3/include/bits/locale_facets.h
@@ -47,6 +47,20 @@
#include <ext/numeric_traits.h>
#include <bits/streambuf_iterator.h>
+#if !__clang__ && __GNUC__ == 4 && __GNUC_MINOR__ == 9 && __i386__
+// CrystaX: for some reason, x86 gcc-4.9 makes ctype<char>::do_widen() and
+// ctype<char>::_M_widen_init() methods working wrong if optimization enabled.
+// For ctype<char>::do_widen(), values of passed arguments (__lo, __hi and __to)
+// are completely messed up and don't correspond to passed values. In case if
+// we disable optimization for those methods, things become correct so we apply
+// this workaround here for a time.
+// TODO: figure out what exactly wrong here - is it bug in GCC optimization
+// algorithm or smth else?
+#define __CRYSTAX_X86_DONT_OPTIMIZE __attribute__((optimize(0)))
+#else
+#define __CRYSTAX_X86_DONT_OPTIMIZE
+#endif
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -1102,7 +1116,7 @@
* @return @a __hi.
*/
virtual const char*
- do_widen(const char* __lo, const char* __hi, char_type* __to) const
+ do_widen(const char* __lo, const char* __hi, char_type* __to) const __CRYSTAX_X86_DONT_OPTIMIZE
{
__builtin_memcpy(__to, __lo, __hi - __lo);
return __hi;
@@ -1163,7 +1177,7 @@
private:
void _M_narrow_init() const;
- void _M_widen_init() const;
+ void _M_widen_init() const __CRYSTAX_X86_DONT_OPTIMIZE;
};
#ifdef _GLIBCXX_USE_WCHAR_T
--- a/libstdc++-v3/libsupc++/guard.cc
+++ b/libstdc++-v3/libsupc++/guard.cc
@@ -34,7 +34,12 @@
#if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \
&& (ATOMIC_INT_LOCK_FREE > 1) && defined(_GLIBCXX_HAVE_LINUX_FUTEX)
# include <climits>
+#if defined(__ANDROID__)
+# include <sys/syscall.h>
+# define SYS_futex __NR_futex
+#else
# include <syscall.h>
+#endif
# include <unistd.h>
# define _GLIBCXX_USE_FUTEX
# define _GLIBCXX_FUTEX_WAIT 0

View File

@ -1,529 +1,27 @@
commit 080803512c8f6f87c2f1f711170d54033144d628 commit 9f057b62caafe08c968103d39b5df82486a175c2
Author: Dmitry Moskalchuk <dm@crystax.net> Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Wed Jul 29 11:28:29 2015 +0300 Date: Thu Aug 13 16:11:54 2015 +0300
[android] Apply Android-related modifications [android] Add additional multilib option: mfloat-abi=hard
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
[Edited: keep libstdc++, drop libcrystax-related modifications]
--- ---
gcc/config.gcc | 17 +++++++- gcc/config/arm/t-linux-androideabi | 7 ++++---
gcc/config/aarch64/aarch64-linux-android.h | 59 +++++++++++++++++++++++++++++ 1 file changed, 4 insertions(+), 3 deletions(-)
gcc/config/aarch64/aarch64-linux.h | 9 +++-
gcc/config/arm/arm.h | 3 -
gcc/config/arm/arm.md | 2
gcc/config/arm/arm.opt | 4 +
gcc/config/arm/elf.h | 9 ++--
gcc/config/arm/linux-eabi.h | 7 ++-
gcc/config/i386/gnu-user.h | 7 ++-
gcc/config/i386/gnu-user64.h | 5 ++
gcc/config/i386/linux-common.h | 8 +++
gcc/config/linux-android.h | 13 +++---
gcc/config/mips/android.h | 49 ++++++++++++++++++++++++
gcc/config/mips/gnu-user.h | 6 +-
gcc/config/mips/linux-common.h | 2
gcc/config/mips/t-linux-android | 3 +
gcc/config/mips/t-linux-android64 | 4 +
libgcc/gthr-posix.h | 13 ++++++
libstdc++-v3/configure | 12 +++++
libstdc++-v3/include/bits/locale_facets.h | 18 +++++++-
libstdc++-v3/libsupc++/guard.cc | 5 ++
21 files changed, 235 insertions(+), 20 deletions(-)
--- a/gcc/config.gcc --- a/gcc/config/arm/t-linux-androideabi
+++ b/gcc/config.gcc +++ b/gcc/config/arm/t-linux-androideabi
@@ -961,13 +961,17 @@ @@ -1,8 +1,9 @@
tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-aarch64-freebsd" -MULTILIB_OPTIONS = march=armv7-a mthumb
;; -MULTILIB_DIRNAMES = armv7-a thumb
aarch64*-*-linux*) -MULTILIB_EXCEPTIONS =
- tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h" +MULTILIB_OPTIONS = march=armv7-a mthumb mfloat-abi=hard
+ tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h" +MULTILIB_DIRNAMES = armv7-a thumb hard
tm_file="${tm_file} aarch64/aarch64-elf.h aarch64/aarch64-linux.h" +MULTILIB_EXCEPTIONS = mfloat-abi=hard* mthumb/mfloat-abi=hard*
+ extra_options="${extra_options} linux-android.opt" MULTILIB_MATCHES =
tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-aarch64-linux" MULTILIB_OSDIRNAMES =
case $target in +MULTILIB_EXTRA_OPTS = Wl,--no-warn-mismatch
aarch64_be-*)
tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
;;
+ aarch64*-*-linux-android*)
+ tm_file="${tm_file} aarch64/aarch64-linux-android.h"
+ ;;
esac
aarch64_multilibs="${with_multilib_list}"
if test "$aarch64_multilibs" = "default"; then
@@ -2079,6 +2083,17 @@
tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h"
extra_options="${extra_options} linux-android.opt"
case ${target} in
+ mips64*android*)
+ default_mips_arch=mips64r6
+ default_mips_abi=64
+ tm_file="${tm_file} mips/android.h"
+ tmake_file="${tmake_file} mips/t-linux-android64"
+ ;;
+ mips*android*)
+ default_mips_arch=mips32
+ tm_file="${tm_file} mips/android.h"
+ tmake_file="$tmake_file mips/t-linux-android"
+ ;;
mipsisa32r6*)
default_mips_arch=mips32r6
;;
--- /dev/null
+++ b/gcc/config/aarch64/aarch64-linux-android.h
@@ -0,0 +1,59 @@
+/* Machine description for AArch64 architecture.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_AARCH64_LINUX_ANDROID_H
+#define GCC_AARCH64_LINUX_ANDROID_H
+
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ GNU_USER_TARGET_OS_CPP_BUILTINS(); \
+ ANDROID_TARGET_OS_CPP_BUILTINS(); \
+ } \
+ while (0)
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+ LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
+ LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
+
+#undef CC1_SPEC
+#define CC1_SPEC \
+ LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
+ GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC("-fpic"))
+
+#define CC1PLUS_SPEC \
+ LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
+
+#undef LIB_SPEC
+#define LIB_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
+ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
+
+#endif /* GCC_AARCH64_LINUX_ANDROID_H */
--- a/gcc/config/aarch64/aarch64-linux.h
+++ b/gcc/config/aarch64/aarch64-linux.h
@@ -21,7 +21,14 @@
#ifndef GCC_AARCH64_LINUX_H
#define GCC_AARCH64_LINUX_H
-#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1" # The "special" multilib can be used to build native applications for Android,
+#ifndef RUNTIME_ROOT_PREFIX # as opposed to native shared libraries that are then called via JNI.
+#define RUNTIME_ROOT_PREFIX ""
+#endif
+#define GLIBC_DYNAMIC_LINKER RUNTIME_ROOT_PREFIX "/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
+#ifdef BIONIC_DYNAMIC_LINKER
+#undef BIONIC_DYNAMIC_LINKER
+#endif
+#define BIONIC_DYNAMIC_LINKER RUNTIME_ROOT_PREFIX "/system/bin/linker64"
#undef MUSL_DYNAMIC_LINKER
#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -1878,10 +1878,11 @@
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB1 \
+ && !inline_thumb1_jump_table \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
- (TARGET_THUMB1 \
+ (TARGET_THUMB1 && !inline_thumb1_jump_table \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -8668,7 +8668,7 @@
(match_operand:SI 2 "const_int_operand" "") ; total range
(match_operand:SI 3 "" "") ; table label
(match_operand:SI 4 "" "")] ; Out of range label
- "(TARGET_32BIT || optimize_size || flag_pic) && !target_pure_code"
+ "(TARGET_32BIT || ((optimize_size || flag_pic) && !inline_thumb1_jump_table)) && !target_pure_code"
"
{
enum insn_code code;
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -193,6 +193,10 @@
Target Report Mask(INTERWORK)
Support calls between Thumb and ARM instruction sets.
+minline-thumb1-jumptable
+Target Report Var(inline_thumb1_jump_table)
+Inline Thumb1 Jump table code
+
mtls-dialect=
Target RejectNegative Joined Enum(tls_type) Var(target_tls_dialect) Init(TLS_GNU)
Specify thread local storage scheme.
--- a/gcc/config/arm/elf.h
+++ b/gcc/config/arm/elf.h
@@ -56,8 +56,7 @@
#undef SUBSUBTARGET_EXTRA_SPECS
#define SUBSUBTARGET_EXTRA_SPECS
-#ifndef ASM_SPEC
-#define ASM_SPEC "\
+#define DEFAULT_ASM_SPEC "\
%{mbig-endian:-EB} \
%{mlittle-endian:-EL} \
%(asm_cpu_spec) \
@@ -66,6 +65,9 @@
%{mthumb-interwork:-mthumb-interwork} \
%{mfloat-abi=*} %{mfpu=*} \
%(subtarget_extra_asm_spec)"
+
+#ifndef ASM_SPEC
+#define ASM_SPEC DEFAULT_ASM_SPEC
#endif
/* The ARM uses @ are a comment character so we need to redefine
@@ -95,7 +97,8 @@
the code more efficient, but for Thumb-1 it's better to put them out of
band unless we are generating compressed tables. */
#define JUMP_TABLES_IN_TEXT_SECTION \
- ((TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic))) \
+ ((TARGET_32BIT || (TARGET_THUMB && !inline_thumb1_jump_table \
+ && (optimize_size || flag_pic))) \
&& !target_pure_code)
#ifndef LINK_SPEC
--- a/gcc/config/arm/linux-eabi.h
+++ b/gcc/config/arm/linux-eabi.h
@@ -102,11 +102,16 @@
#define CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC, \
GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " \
- ANDROID_CC1_SPEC)
+ ANDROID_CC1_SPEC("-fpic"))
#define CC1PLUS_SPEC \
LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
+#undef ASM_SPEC
+#define ASM_SPEC \
+ LINUX_OR_ANDROID_CC (DEFAULT_ASM_SPEC, \
+ DEFAULT_ASM_SPEC " " ANDROID_ASM_SPEC)
+
#undef LIB_SPEC
#define LIB_SPEC \
LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
--- a/gcc/config/i386/gnu-user.h
+++ b/gcc/config/i386/gnu-user.h
@@ -65,9 +65,14 @@
When the -shared link option is used a final link is not being
done. */
+#undef ANDROID_TARGET_CC1_SPEC
+#define ANDROID_TARGET_CC1_SPEC \
+ " -mssse3 -fno-short-enums " \
+
#undef ASM_SPEC
#define ASM_SPEC \
- "--32 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}"
+ "--32 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}} " \
+ LINUX_OR_ANDROID_CC ("", ANDROID_ASM_SPEC)
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
--- a/gcc/config/i386/gnu-user64.h
+++ b/gcc/config/i386/gnu-user64.h
@@ -46,6 +46,11 @@
#define SPEC_X32 "mx32"
#endif
+#undef ANDROID_TARGET_CC1_SPEC
+#define ANDROID_TARGET_CC1_SPEC \
+ "%{m32:-mssse3 -fno-short-enums}" \
+ "%{!m32:-msse4.2 -mpopcnt}"
+
#undef ASM_SPEC
#define ASM_SPEC "%{" SPEC_32 ":--32} \
%{" SPEC_64 ":--64} \
--- a/gcc/config/i386/linux-common.h
+++ b/gcc/config/i386/linux-common.h
@@ -30,7 +30,13 @@
#undef CC1_SPEC
#define CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
+ GNU_USER_TARGET_CC1_SPEC \
+ ANDROID_TARGET_CC1_SPEC \
+ " " \
+ ANDROID_CC1_SPEC("-fPIC"))
+
+#define CC1PLUS_SPEC \
+ LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
#undef LINK_SPEC
#define LINK_SPEC \
--- a/gcc/config/linux-android.h
+++ b/gcc/config/linux-android.h
@@ -38,15 +38,18 @@
"%{" NOANDROID "|tno-android-ld:" LINUX_SPEC ";:" ANDROID_SPEC "}"
#define ANDROID_LINK_SPEC \
- "%{shared: -Bsymbolic}"
+ "%{shared: -Bsymbolic} -z noexecstack -z relro -z now"
-#define ANDROID_CC1_SPEC \
+#define ANDROID_CC1_SPEC(ANDROID_PIC_DEFAULT) \
"%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} " \
- "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}"
+ "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: " ANDROID_PIC_DEFAULT "}}}}"
#define ANDROID_CC1PLUS_SPEC \
- "%{!fexceptions:%{!fno-exceptions: -fno-exceptions}} " \
- "%{!frtti:%{!fno-rtti: -fno-rtti}}"
+ "%{!fexceptions:%{!fno-exceptions: -fexceptions}} " \
+ "%{!frtti:%{!fno-rtti: -frtti}}"
+
+#define ANDROID_ASM_SPEC \
+ "--noexecstack"
#define ANDROID_LIB_SPEC \
"%{!static: -ldl}"
--- /dev/null
+++ b/gcc/config/mips/android.h
@@ -0,0 +1,49 @@
+/* Target macros for mips*-*android* targets.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+ /* Make sure a -mips option is present. This helps us to pick \
+ the right multilib, and also makes the later specs easier \
+ to write. */ \
+ MIPS_ISA_LEVEL_SPEC, \
+ \
+ /* Infer the default float setting from -march. */ \
+ MIPS_ARCH_FLOAT_SPEC, \
+ \
+ /* Infer the -msynci setting from -march if not explicitly set. */ \
+ MIPS_ISA_SYNCI_SPEC, \
+ \
+ /* If no ABI option is specified, infer one from the ISA level \
+ or -mgp setting. */ \
+ "%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=64}}", \
+ \
+ /* If no FP ABI option is specified, infer one from the \
+ ABI/ISA level unless there is a conflicting option. */ \
+ "%{!msoft-float: %{!msingle-float: %{!mfp*: %{!mmsa: %{mabi=32: %{" \
+ MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}}", \
+ \
+ /* If no odd-spreg option is specified, infer one from the ISA. */ \
+ "%{!modd-spreg: %{mabi=32: %{mips32r6: -mno-odd-spreg}}}", \
+ \
+ /* Base SPECs. */ \
+ BASE_DRIVER_SELF_SPECS, \
+ \
+ /* Use the standard linux specs for everything else. */ \
+ LINUX_DRIVER_SELF_SPECS
--- a/gcc/config/mips/gnu-user.h
+++ b/gcc/config/mips/gnu-user.h
@@ -36,6 +36,7 @@
/* The GNU C++ standard library requires this. */ \
if (c_dialect_cxx ()) \
builtin_define ("_GNU_SOURCE"); \
+ ANDROID_TARGET_OS_CPP_BUILTINS(); \
} while (0)
#undef SUBTARGET_CPP_SPEC
@@ -71,7 +72,8 @@
#undef SUBTARGET_ASM_SPEC
#define SUBTARGET_ASM_SPEC \
- "%{!mno-abicalls:%{mplt:-call_nonpic;:-KPIC}}"
+ "%{!mno-abicalls:%{mplt:-call_nonpic;:-KPIC}} " \
+ LINUX_OR_ANDROID_CC ("", ANDROID_ASM_SPEC)
/* The MIPS assembler has different syntax for .set. We set it to
.dummy to trap any errors. */
@@ -120,7 +122,7 @@
#endif
#define LINUX_DRIVER_SELF_SPECS \
- NO_SHARED_SPECS \
+ LINUX_OR_ANDROID_CC(NO_SHARED_SPECS, "") \
MARCH_MTUNE_NATIVE_SPECS, \
/* -mplt has no effect without -mno-shared. Simplify later \
specs handling by removing a redundant option. */ \
--- a/gcc/config/mips/linux-common.h
+++ b/gcc/config/mips/linux-common.h
@@ -35,7 +35,7 @@
#undef SUBTARGET_CC1_SPEC
#define SUBTARGET_CC1_SPEC \
LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
+ GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC("-fpic"))
#undef CC1PLUS_SPEC
#define CC1PLUS_SPEC \
--- /dev/null
+++ b/gcc/config/mips/t-linux-android
@@ -0,0 +1,3 @@
+MULTILIB_OPTIONS = mips32r2/mips32r6
+MULTILIB_DIRNAMES = mips-r2 mips-r6
+MULTILIB_OSDIRNAMES = ../libr2 ../libr6
--- /dev/null
+++ b/gcc/config/mips/t-linux-android64
@@ -0,0 +1,4 @@
+MULTILIB_OPTIONS = mabi=32 mips32/mips32r2/mips32r6/mips64r2/mips64r6
+MULTILIB_DIRNAMES = 32 mips-r1 mips-r2 mips-r6 mips64-r2 mips64-r6
+MULTILIB_OSDIRNAMES = ../lib ../lib ../libr2 ../libr6 ../lib64r2 ../lib64
+MULTILIB_REQUIRED = mabi=32/mips32 mabi=32/mips32r2 mabi=32/mips32r6 mips64r2 mips64r6
--- a/libgcc/gthr-posix.h
+++ b/libgcc/gthr-posix.h
@@ -32,6 +32,19 @@
#define __GTHREADS 1
#define __GTHREADS_CXX0X 1
+/* The following should normally be in a different header file,
+ * but I couldn't find the right location. The point of the macro
+ * definition below is to prevent libsupc++ and libstdc++ to reference
+ * weak symbols in their static C++ constructors. Such code crashes
+ * when a shared object linked statically to these libraries is
+ * loaded on Android 2.1 (Eclair) and older platform releases, due
+ * to a dynamic linker bug.
+ */
+#ifdef __ANDROID__
+#undef GTHREAD_USE_WEAK
+#define GTHREAD_USE_WEAK 0
+#endif
+
#include <pthread.h>
#if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -78536,6 +78536,12 @@
/* end confdefs.h. */
#include <sys/syscall.h>
int lk;
+#if !defined(SYS_gettid)
+#define SYS_gettid __NR_gettid
+#endif
+#if !defined(SYS_futex)
+#define SYS_futex __NR_futex
+#endif
int
main ()
{
@@ -78594,6 +78600,12 @@
/* end confdefs.h. */
#include <sys/syscall.h>
int lk;
+#if !defined(SYS_gettid)
+#define SYS_gettid __NR_gettid
+#endif
+#if !defined(SYS_futex)
+#define SYS_futex __NR_futex
+#endif
int
main ()
{
--- a/libstdc++-v3/include/bits/locale_facets.h
+++ b/libstdc++-v3/include/bits/locale_facets.h
@@ -47,6 +47,20 @@
#include <ext/numeric_traits.h>
#include <bits/streambuf_iterator.h>
+#if !__clang__ && __GNUC__ == 4 && __GNUC_MINOR__ == 9 && __i386__
+// CrystaX: for some reason, x86 gcc-4.9 makes ctype<char>::do_widen() and
+// ctype<char>::_M_widen_init() methods working wrong if optimization enabled.
+// For ctype<char>::do_widen(), values of passed arguments (__lo, __hi and __to)
+// are completely messed up and don't correspond to passed values. In case if
+// we disable optimization for those methods, things become correct so we apply
+// this workaround here for a time.
+// TODO: figure out what exactly wrong here - is it bug in GCC optimization
+// algorithm or smth else?
+#define __CRYSTAX_X86_DONT_OPTIMIZE __attribute__((optimize(0)))
+#else
+#define __CRYSTAX_X86_DONT_OPTIMIZE
+#endif
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -1102,7 +1116,7 @@
* @return @a __hi.
*/
virtual const char*
- do_widen(const char* __lo, const char* __hi, char_type* __to) const
+ do_widen(const char* __lo, const char* __hi, char_type* __to) const __CRYSTAX_X86_DONT_OPTIMIZE
{
__builtin_memcpy(__to, __lo, __hi - __lo);
return __hi;
@@ -1163,7 +1177,7 @@
private:
void _M_narrow_init() const;
- void _M_widen_init() const;
+ void _M_widen_init() const __CRYSTAX_X86_DONT_OPTIMIZE;
};
#ifdef _GLIBCXX_USE_WCHAR_T
--- a/libstdc++-v3/libsupc++/guard.cc
+++ b/libstdc++-v3/libsupc++/guard.cc
@@ -34,7 +34,12 @@
#if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \
&& (ATOMIC_INT_LOCK_FREE > 1) && defined(_GLIBCXX_HAVE_LINUX_FUTEX)
# include <climits>
+#if defined(__ANDROID__)
+# include <sys/syscall.h>
+# define SYS_futex __NR_futex
+#else
# include <syscall.h>
+#endif
# include <unistd.h>
# define _GLIBCXX_USE_FUTEX
# define _GLIBCXX_FUTEX_WAIT 0

View File

@ -1,27 +1,293 @@
commit 9f057b62caafe08c968103d39b5df82486a175c2 commit 44a81ebb7698dac41ffa7acd5e0cc1578e5ab1fd
Author: Dmitry Moskalchuk <dm@crystax.net> Author: H.J. Lu <hongjiu.lu@intel.com>
Date: Thu Aug 13 16:11:54 2015 +0300 Date: Mon Apr 14 15:59:47 2014 -0700
[android] Add additional multilib option: mfloat-abi=hard [android] Always enable --eh-frame-hdr for static executable
See 5e6cdf76af295c9a39b695ca228cff675e8ff4ae and
23e3137ee2897464b051599b85a09f130d3ad05d
Change-Id: Ibda473188e5a10f2a0592f2494ad00ad1f91e04b
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
gcc/config/arm/t-linux-androideabi | 7 ++++--- gcc/config.in | 6 +++++
1 file changed, 4 insertions(+), 3 deletions(-) gcc/config/alpha/elf.h | 4 +++
gcc/config/freebsd.h | 4 +++
gcc/config/gnu-user.h | 4 +++
gcc/config/openbsd.h | 4 +++
gcc/config/rs6000/sysv4.h | 6 ++++-
gcc/config/sol2.h | 4 +++
gcc/configure | 36 +++++++++++++++++++++++++++++++++
gcc/configure.ac | 29 ++++++++++++++++++++++++++
gcc/testsuite/g++.dg/eh/spec3-static.C | 25 ++++++++++++++++++++++
libgcc/crtstuff.c | 11 ++++++----
11 files changed, 128 insertions(+), 5 deletions(-)
--- a/gcc/config/arm/t-linux-androideabi --- a/gcc/config.in
+++ b/gcc/config/arm/t-linux-androideabi +++ b/gcc/config.in
@@ -1,8 +1,9 @@ @@ -2186,6 +2186,12 @@
-MULTILIB_OPTIONS = march=armv7-a mthumb #endif
-MULTILIB_DIRNAMES = armv7-a thumb
-MULTILIB_EXCEPTIONS =
+MULTILIB_OPTIONS = march=armv7-a mthumb mfloat-abi=hard
+MULTILIB_DIRNAMES = armv7-a thumb hard
+MULTILIB_EXCEPTIONS = mfloat-abi=hard* mthumb/mfloat-abi=hard*
MULTILIB_MATCHES =
MULTILIB_OSDIRNAMES =
+MULTILIB_EXTRA_OPTS = Wl,--no-warn-mismatch
# The "special" multilib can be used to build native applications for Android,
# as opposed to native shared libraries that are then called via JNI. +/* Define if your system supports PT_GNU_EH_FRAME for static executable. */
+#ifndef USED_FOR_TARGET
+#undef USE_EH_FRAME_HDR_FOR_STATIC
+#endif
+
+
/* Define to 1 if the 'long long' type is wider than 'long' but still
efficiently supported by the host hardware. */
#ifndef USED_FOR_TARGET
--- a/gcc/config/alpha/elf.h
+++ b/gcc/config/alpha/elf.h
@@ -168,5 +168,9 @@
I imagine that other systems will catch up. In the meantime, it
doesn't harm to make sure that the data exists to be used later. */
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
--- a/gcc/config/freebsd.h
+++ b/gcc/config/freebsd.h
@@ -45,8 +45,12 @@
#define LIB_SPEC FBSD_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#ifdef TARGET_LIBC_PROVIDES_SSP
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
--- a/gcc/config/gnu-user.h
+++ b/gcc/config/gnu-user.h
@@ -132,8 +132,12 @@
#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
--- a/gcc/config/openbsd.h
+++ b/gcc/config/openbsd.h
@@ -136,8 +136,12 @@
#define LIB_SPEC OBSD_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#undef LIB_SPEC
#define LIB_SPEC OBSD_LIB_SPEC
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -815,7 +815,11 @@
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
#if defined(HAVE_LD_EH_FRAME_HDR)
-# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+# ifdef USE_EH_FRAME_HDR_FOR_STATIC
+# define LINK_EH_SPEC "--eh-frame-hdr "
+# else
+# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+# endif
#endif
#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
--- a/gcc/config/sol2.h
+++ b/gcc/config/sol2.h
@@ -367,7 +367,11 @@
/* Solaris 11 build 135+ implements dl_iterate_phdr. GNU ld needs
--eh-frame-hdr to create the required .eh_frame_hdr sections. */
#if defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+#endif
#endif /* HAVE_LD_EH_FRAME && TARGET_DL_ITERATE_PHDR */
#endif
--- a/gcc/configure
+++ b/gcc/configure
@@ -939,6 +939,7 @@
enable_fix_cortex_a53_843419
with_glibc_version
enable_gnu_unique_object
+enable_eh_frame_hdr_for_static
enable_linker_build_id
enable_default_ssp
with_long_double_128
@@ -1676,6 +1677,9 @@
--enable-gnu-unique-object
enable the use of the @gnu_unique_object ELF
extension on glibc systems
+ --enable-eh-frame-hdr-for-static
+ enable linker PT_GNU_EH_FRAME support for static
+ executable
--enable-linker-build-id
compiler will always pass --build-id to linker
--enable-default-ssp enable Stack Smashing Protection as default
@@ -28082,6 +28086,38 @@
$as_echo "#define HAVE_LD_EH_FRAME_HDR 1" >>confdefs.h
+ # Check whether --enable-eh-frame-hdr-for-static was given.
+if test "${enable_eh_frame_hdr_for_static+set}" = set; then :
+ enableval=$enable_eh_frame_hdr_for_static; case $enable_eh_frame_hdr_for_static in
+ yes | no) ;;
+ *) as_fn_error "'$enable_eh_frame_hdr_for_static' is an invalid
+value for --enable-eh-frame-hdr-for-static.
+Valid choices are 'yes' and 'no'." "$LINENO" 5 ;;
+ esac
+else
+ # Only support for glibc 2.3.0 or higher with AT_PHDR/AT_PHNUM from
+# Linux kernel.
+ if test x$host = x$build -a x$host = x$target &&
+ ldd --version 2>&1 >/dev/null &&
+ glibcver=`ldd --version 2>/dev/null | sed 's/.* //;q'`; then
+ glibcmajor=`expr "$glibcver" : "\([0-9]*\)"`
+ glibcminor=`expr "$glibcver" : "[2-9]*\.\([0-9]*\)"`
+ glibcnum=`expr $glibcmajor \* 1000 + $glibcminor`
+ if test "$glibcnum" -ge 2003 ; then
+ auvx=`LD_SHOW_AUXV=1 ldd 2>/dev/null`
+ if echo "$auvx" | grep AT_PHDR > /dev/null &&
+ echo "$auvx" | grep AT_PHNUM > /dev/null; then
+ enable_eh_frame_hdr_for_static=yes
+ fi
+ fi
+ fi
+fi
+
+ if test x$enable_eh_frame_hdr_for_static = xyes; then
+
+$as_echo "#define USE_EH_FRAME_HDR_FOR_STATIC 1" >>confdefs.h
+
+ fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_eh_frame_hdr" >&5
$as_echo "$gcc_cv_ld_eh_frame_hdr" >&6; }
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4986,6 +4986,35 @@
if test x"$gcc_cv_ld_eh_frame_hdr" = xyes; then
AC_DEFINE(HAVE_LD_EH_FRAME_HDR, 1,
[Define if your linker supports .eh_frame_hdr.])
+ AC_ARG_ENABLE(eh-frame-hdr-for-static,
+ [AS_HELP_STRING([--enable-eh-frame-hdr-for-static],
+ [enable linker PT_GNU_EH_FRAME support for static executable])],
+ [case $enable_eh_frame_hdr_for_static in
+ yes | no) ;;
+ *) AC_MSG_ERROR(['$enable_eh_frame_hdr_for_static' is an invalid
+value for --enable-eh-frame-hdr-for-static.
+Valid choices are 'yes' and 'no'.]) ;;
+ esac],
+# Only support for glibc 2.3.0 or higher with AT_PHDR/AT_PHNUM from
+# Linux kernel.
+ [[if test x$host = x$build -a x$host = x$target &&
+ ldd --version 2>&1 >/dev/null &&
+ glibcver=`ldd --version 2>/dev/null | sed 's/.* //;q'`; then
+ glibcmajor=`expr "$glibcver" : "\([0-9]*\)"`
+ glibcminor=`expr "$glibcver" : "[2-9]*\.\([0-9]*\)"`
+ glibcnum=`expr $glibcmajor \* 1000 + $glibcminor`
+ if test "$glibcnum" -ge 2003 ; then
+ auvx=`LD_SHOW_AUXV=1 ldd 2>/dev/null`
+ if echo "$auvx" | grep AT_PHDR > /dev/null &&
+ echo "$auvx" | grep AT_PHNUM > /dev/null; then
+ enable_eh_frame_hdr_for_static=yes
+ fi
+ fi
+ fi]])
+ if test x$enable_eh_frame_hdr_for_static = xyes; then
+ AC_DEFINE(USE_EH_FRAME_HDR_FOR_STATIC, 1,
+[Define if your system supports PT_GNU_EH_FRAME for static executable.])
+ fi
fi
AC_MSG_RESULT($gcc_cv_ld_eh_frame_hdr)
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/spec3-static.C
@@ -0,0 +1,25 @@
+// PR c++/4381
+// Test that exception-specs work properly for classes with virtual bases.
+
+// { dg-do run }
+// { dg-options "-static" }
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void func() throw (B,A)
+{
+ throw A();
+}
+
+int main(void)
+{
+ try { func(); }
+ catch (A& a) { }
+}
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -88,7 +88,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(BSD_DL_ITERATE_PHDR_AVAILABLE)
#include <link.h>
# define USE_PT_GNU_EH_FRAME
@@ -97,7 +98,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(__sun__) && defined(__svr4__)
#include <link.h>
# define USE_PT_GNU_EH_FRAME
@@ -106,7 +108,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(__GLIBC__) && __GLIBC__ >= 2
#include <link.h>
/* uClibc pretends to be glibc 2.2 and DT_CONFIG is defined in its link.h.
@@ -121,7 +124,7 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(CRTSTUFFT_O) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(inhibit_libc) \
&& (defined(__GLIBC__) || defined(__gnu_linux__) || defined(__GNU__))
/* On systems using glibc, an inhibit_libc build of libgcc is only

View File

@ -1,293 +1,22 @@
commit 44a81ebb7698dac41ffa7acd5e0cc1578e5ab1fd commit 778a9ef107f51544d583f110e92b75f4d9d79117
Author: H.J. Lu <hongjiu.lu@intel.com> Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Mon Apr 14 15:59:47 2014 -0700 Date: Thu Aug 20 19:11:07 2015 +0300
[android] Always enable --eh-frame-hdr for static executable [android] Don't use PIE copyrelocs for x86/x86_64
See 5e6cdf76af295c9a39b695ca228cff675e8ff4ae and
23e3137ee2897464b051599b85a09f130d3ad05d
Change-Id: Ibda473188e5a10f2a0592f2494ad00ad1f91e04b
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
gcc/config.in | 6 +++++ gcc/config/i386/i386.c | 1 +
gcc/config/alpha/elf.h | 4 +++ 1 file changed, 1 insertion(+)
gcc/config/freebsd.h | 4 +++
gcc/config/gnu-user.h | 4 +++
gcc/config/openbsd.h | 4 +++
gcc/config/rs6000/sysv4.h | 6 ++++-
gcc/config/sol2.h | 4 +++
gcc/configure | 36 +++++++++++++++++++++++++++++++++
gcc/configure.ac | 29 ++++++++++++++++++++++++++
gcc/testsuite/g++.dg/eh/spec3-static.C | 25 ++++++++++++++++++++++
libgcc/crtstuff.c | 11 ++++++----
11 files changed, 128 insertions(+), 5 deletions(-)
--- a/gcc/config.in --- a/gcc/config/i386/i386.c
+++ b/gcc/config.in +++ b/gcc/config/i386/i386.c
@@ -2180,6 +2180,12 @@ @@ -16113,6 +16113,7 @@
#endif else if (!SYMBOL_REF_FAR_ADDR_P (op0)
&& (SYMBOL_REF_LOCAL_P (op0)
|| (HAVE_LD_PIE_COPYRELOC
+/* Define if your system supports PT_GNU_EH_FRAME for static executable. */ + && !TARGET_HAS_BIONIC
+#ifndef USED_FOR_TARGET && flag_pie
+#undef USE_EH_FRAME_HDR_FOR_STATIC && !SYMBOL_REF_WEAK (op0)
+#endif && !SYMBOL_REF_FUNCTION_P (op0)))
+
+
/* Define to 1 if the 'long long' type is wider than 'long' but still
efficiently supported by the host hardware. */
#ifndef USED_FOR_TARGET
--- a/gcc/config/alpha/elf.h
+++ b/gcc/config/alpha/elf.h
@@ -168,5 +168,9 @@
I imagine that other systems will catch up. In the meantime, it
doesn't harm to make sure that the data exists to be used later. */
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
--- a/gcc/config/freebsd.h
+++ b/gcc/config/freebsd.h
@@ -45,8 +45,12 @@
#define LIB_SPEC FBSD_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#ifdef TARGET_LIBC_PROVIDES_SSP
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
--- a/gcc/config/gnu-user.h
+++ b/gcc/config/gnu-user.h
@@ -118,8 +118,12 @@
#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
--- a/gcc/config/openbsd.h
+++ b/gcc/config/openbsd.h
@@ -136,8 +136,12 @@
#define LIB_SPEC OBSD_LIB_SPEC
#if defined(HAVE_LD_EH_FRAME_HDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+#endif
#undef LIB_SPEC
#define LIB_SPEC OBSD_LIB_SPEC
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -805,7 +805,11 @@
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
#if defined(HAVE_LD_EH_FRAME_HDR)
-# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+# ifdef USE_EH_FRAME_HDR_FOR_STATIC
+# define LINK_EH_SPEC "--eh-frame-hdr "
+# else
+# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+# endif
#endif
#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
--- a/gcc/config/sol2.h
+++ b/gcc/config/sol2.h
@@ -367,7 +367,11 @@
/* Solaris 11 build 135+ implements dl_iterate_phdr. GNU ld needs
--eh-frame-hdr to create the required .eh_frame_hdr sections. */
#if defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR)
+#ifdef USE_EH_FRAME_HDR_FOR_STATIC
+#define LINK_EH_SPEC "--eh-frame-hdr "
+#else
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+#endif
#endif /* HAVE_LD_EH_FRAME && TARGET_DL_ITERATE_PHDR */
#endif
--- a/gcc/configure
+++ b/gcc/configure
@@ -939,6 +939,7 @@
enable_fix_cortex_a53_843419
with_glibc_version
enable_gnu_unique_object
+enable_eh_frame_hdr_for_static
enable_linker_build_id
enable_default_ssp
with_long_double_128
@@ -1676,6 +1677,9 @@
--enable-gnu-unique-object
enable the use of the @gnu_unique_object ELF
extension on glibc systems
+ --enable-eh-frame-hdr-for-static
+ enable linker PT_GNU_EH_FRAME support for static
+ executable
--enable-linker-build-id
compiler will always pass --build-id to linker
--enable-default-ssp enable Stack Smashing Protection as default
@@ -28050,6 +28054,38 @@
$as_echo "#define HAVE_LD_EH_FRAME_HDR 1" >>confdefs.h
+ # Check whether --enable-eh-frame-hdr-for-static was given.
+if test "${enable_eh_frame_hdr_for_static+set}" = set; then :
+ enableval=$enable_eh_frame_hdr_for_static; case $enable_eh_frame_hdr_for_static in
+ yes | no) ;;
+ *) as_fn_error "'$enable_eh_frame_hdr_for_static' is an invalid
+value for --enable-eh-frame-hdr-for-static.
+Valid choices are 'yes' and 'no'." "$LINENO" 5 ;;
+ esac
+else
+ # Only support for glibc 2.3.0 or higher with AT_PHDR/AT_PHNUM from
+# Linux kernel.
+ if test x$host = x$build -a x$host = x$target &&
+ ldd --version 2>&1 >/dev/null &&
+ glibcver=`ldd --version 2>/dev/null | sed 's/.* //;q'`; then
+ glibcmajor=`expr "$glibcver" : "\([0-9]*\)"`
+ glibcminor=`expr "$glibcver" : "[2-9]*\.\([0-9]*\)"`
+ glibcnum=`expr $glibcmajor \* 1000 + $glibcminor`
+ if test "$glibcnum" -ge 2003 ; then
+ auvx=`LD_SHOW_AUXV=1 ldd 2>/dev/null`
+ if echo "$auvx" | grep AT_PHDR > /dev/null &&
+ echo "$auvx" | grep AT_PHNUM > /dev/null; then
+ enable_eh_frame_hdr_for_static=yes
+ fi
+ fi
+ fi
+fi
+
+ if test x$enable_eh_frame_hdr_for_static = xyes; then
+
+$as_echo "#define USE_EH_FRAME_HDR_FOR_STATIC 1" >>confdefs.h
+
+ fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_eh_frame_hdr" >&5
$as_echo "$gcc_cv_ld_eh_frame_hdr" >&6; }
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4981,6 +4981,35 @@
if test x"$gcc_cv_ld_eh_frame_hdr" = xyes; then
AC_DEFINE(HAVE_LD_EH_FRAME_HDR, 1,
[Define if your linker supports .eh_frame_hdr.])
+ AC_ARG_ENABLE(eh-frame-hdr-for-static,
+ [AS_HELP_STRING([--enable-eh-frame-hdr-for-static],
+ [enable linker PT_GNU_EH_FRAME support for static executable])],
+ [case $enable_eh_frame_hdr_for_static in
+ yes | no) ;;
+ *) AC_MSG_ERROR(['$enable_eh_frame_hdr_for_static' is an invalid
+value for --enable-eh-frame-hdr-for-static.
+Valid choices are 'yes' and 'no'.]) ;;
+ esac],
+# Only support for glibc 2.3.0 or higher with AT_PHDR/AT_PHNUM from
+# Linux kernel.
+ [[if test x$host = x$build -a x$host = x$target &&
+ ldd --version 2>&1 >/dev/null &&
+ glibcver=`ldd --version 2>/dev/null | sed 's/.* //;q'`; then
+ glibcmajor=`expr "$glibcver" : "\([0-9]*\)"`
+ glibcminor=`expr "$glibcver" : "[2-9]*\.\([0-9]*\)"`
+ glibcnum=`expr $glibcmajor \* 1000 + $glibcminor`
+ if test "$glibcnum" -ge 2003 ; then
+ auvx=`LD_SHOW_AUXV=1 ldd 2>/dev/null`
+ if echo "$auvx" | grep AT_PHDR > /dev/null &&
+ echo "$auvx" | grep AT_PHNUM > /dev/null; then
+ enable_eh_frame_hdr_for_static=yes
+ fi
+ fi
+ fi]])
+ if test x$enable_eh_frame_hdr_for_static = xyes; then
+ AC_DEFINE(USE_EH_FRAME_HDR_FOR_STATIC, 1,
+[Define if your system supports PT_GNU_EH_FRAME for static executable.])
+ fi
fi
AC_MSG_RESULT($gcc_cv_ld_eh_frame_hdr)
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/spec3-static.C
@@ -0,0 +1,25 @@
+// PR c++/4381
+// Test that exception-specs work properly for classes with virtual bases.
+
+// { dg-do run }
+// { dg-options "-static" }
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void func() throw (B,A)
+{
+ throw A();
+}
+
+int main(void)
+{
+ try { func(); }
+ catch (A& a) { }
+}
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -88,7 +88,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(BSD_DL_ITERATE_PHDR_AVAILABLE)
#include <link.h>
# define USE_PT_GNU_EH_FRAME
@@ -97,7 +98,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(__sun__) && defined(__svr4__)
#include <link.h>
# define USE_PT_GNU_EH_FRAME
@@ -106,7 +108,8 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+ && !defined(inhibit_libc) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(__GLIBC__) && __GLIBC__ >= 2
#include <link.h>
/* uClibc pretends to be glibc 2.2 and DT_CONFIG is defined in its link.h.
@@ -121,7 +124,7 @@
#if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
- && !defined(CRTSTUFFT_O) \
+ && (defined(USE_EH_FRAME_HDR_FOR_STATIC) || !defined(CRTSTUFFT_O)) \
&& defined(inhibit_libc) \
&& (defined(__GLIBC__) || defined(__gnu_linux__) || defined(__GNU__))
/* On systems using glibc, an inhibit_libc build of libgcc is only

View File

@ -1,22 +1,26 @@
commit 778a9ef107f51544d583f110e92b75f4d9d79117 commit dbeae1190cabad83999f2540523f045acc1bb4ec
Author: Dmitry Moskalchuk <dm@crystax.net> Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Thu Aug 20 19:11:07 2015 +0300 Date: Fri Aug 21 17:41:59 2015 +0300
[android] Don't use PIE copyrelocs for x86/x86_64 [android] Always use gthr-posix.h instead of gthr-default.h
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
gcc/config/i386/i386.c | 1 + libgcc/gthr.h | 4 ++++
1 file changed, 1 insertion(+) 1 file changed, 4 insertions(+)
--- a/gcc/config/i386/i386.c --- a/libgcc/gthr.h
+++ b/gcc/config/i386/i386.c +++ b/libgcc/gthr.h
@@ -15753,6 +15753,7 @@ @@ -145,7 +145,11 @@
else if (!SYMBOL_REF_FAR_ADDR_P (op0) #define GTHREAD_USE_WEAK 1
&& (SYMBOL_REF_LOCAL_P (op0) #endif
|| (HAVE_LD_PIE_COPYRELOC #endif
+ && !TARGET_HAS_BIONIC +#if __ANDROID__
&& flag_pie +#include "gthr-posix.h"
&& !SYMBOL_REF_WEAK (op0) +#else
&& !SYMBOL_REF_FUNCTION_P (op0))) #include "gthr-default.h"
+#endif
#ifndef HIDE_EXPORTS
#pragma GCC visibility pop

View File

@ -1,26 +1,33 @@
commit dbeae1190cabad83999f2540523f045acc1bb4ec commit 8a66d422721ae5999737d7825701ff22097d287b
Author: Dmitry Moskalchuk <dm@crystax.net> Author: Andrew Hsieh <andrewhsieh@google.com>
Date: Fri Aug 21 17:41:59 2015 +0300 Date: Mon Apr 14 21:05:51 2014 -0700
[android] Always use gthr-posix.h instead of gthr-default.h [android] Fix ARM generates insufficient alignment for NEON vst/vld
See d909af3e2469aad87d5c3e79b93c778fd26c03a9
Change-Id: Ie1de9f946f397196bb6f1623f5add86933739484
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
libgcc/gthr.h | 4 ++++ gcc/config/arm/arm.c | 8 ++++++--
1 file changed, 4 insertions(+) 1 file changed, 6 insertions(+), 2 deletions(-)
--- a/libgcc/gthr.h --- a/gcc/config/arm/arm.c
+++ b/libgcc/gthr.h +++ b/gcc/config/arm/arm.c
@@ -145,7 +145,11 @@ @@ -22292,9 +22292,13 @@
#define GTHREAD_USE_WEAK 1 memsize = MEM_SIZE (x);
#endif
#endif
+#if __ANDROID__
+#include "gthr-posix.h"
+#else
#include "gthr-default.h"
+#endif
#ifndef HIDE_EXPORTS /* Only certain alignment specifiers are supported by the hardware. */
#pragma GCC visibility pop - if (memsize == 32 && (align % 32) == 0)
+ /* Note that ARM EABI only guarentees 8-byte stack alignment. While GCC
+ honors stricter alignment of composite type in user code, it doesn't
+ observe the alignment of memory passed as an extra argument for function
+ returning large composite type. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57271 */
+ if (memsize == 32 && (align % 32) == 0 && !TARGET_AAPCS_BASED)
align_bits = 256;
- else if ((memsize == 16 || memsize == 32) && (align % 16) == 0)
+ else if ((memsize == 16 || memsize == 32) && (align % 16) == 0 && !TARGET_AAPCS_BASED)
align_bits = 128;
else if (memsize >= 8 && (align % 8) == 0)
align_bits = 64;

View File

@ -1,33 +1,23 @@
commit 8a66d422721ae5999737d7825701ff22097d287b commit 89d27bc45ee7325dcfff6748da0f8b9c1dc1f234
Author: Andrew Hsieh <andrewhsieh@google.com> Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Mon Apr 14 21:05:51 2014 -0700 Date: Sat Aug 22 09:55:55 2015 +0300
[android] Fix ARM generates insufficient alignment for NEON vst/vld [android][i386] Remove throw() declaration from posix_memalign() proto
See d909af3e2469aad87d5c3e79b93c778fd26c03a9
Change-Id: Ie1de9f946f397196bb6f1623f5add86933739484
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
gcc/config/arm/arm.c | 8 ++++++-- gcc/config/i386/pmm_malloc.h | 2 +-
1 file changed, 6 insertions(+), 2 deletions(-) 1 file changed, 1 insertion(+), 1 deletion(-)
--- a/gcc/config/arm/arm.c --- a/gcc/config/i386/pmm_malloc.h
+++ b/gcc/config/arm/arm.c +++ b/gcc/config/i386/pmm_malloc.h
@@ -22270,9 +22270,13 @@ @@ -31,7 +31,7 @@
memsize = MEM_SIZE (x); #ifndef __cplusplus
extern int posix_memalign (void **, size_t, size_t);
#else
-extern "C" int posix_memalign (void **, size_t, size_t) throw ();
+extern "C" int posix_memalign (void **, size_t, size_t);
#endif
/* Only certain alignment specifiers are supported by the hardware. */ static __inline void *
- if (memsize == 32 && (align % 32) == 0)
+ /* Note that ARM EABI only guarentees 8-byte stack alignment. While GCC
+ honors stricter alignment of composite type in user code, it doesn't
+ observe the alignment of memory passed as an extra argument for function
+ returning large composite type. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57271 */
+ if (memsize == 32 && (align % 32) == 0 && !TARGET_AAPCS_BASED)
align_bits = 256;
- else if ((memsize == 16 || memsize == 32) && (align % 16) == 0)
+ else if ((memsize == 16 || memsize == 32) && (align % 16) == 0 && !TARGET_AAPCS_BASED)
align_bits = 128;
else if (memsize >= 8 && (align % 8) == 0)
align_bits = 64;

View File

@ -1,23 +1,34 @@
commit 89d27bc45ee7325dcfff6748da0f8b9c1dc1f234 commit 9ae82f7cfc1073820092dd9f957559667e77db0d
Author: Dmitry Moskalchuk <dm@crystax.net> Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Sat Aug 22 09:55:55 2015 +0300 Date: Tue Aug 25 09:36:42 2015 +0300
[android][i386] Remove throw() declaration from posix_memalign() proto [android] Explicitly make _Unwind_Resume visible for arm64/mips64
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net> Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
--- ---
gcc/config/i386/pmm_malloc.h | 2 +- gcc/config/aarch64/aarch64-linux-android.h | 4 ++++
1 file changed, 1 insertion(+), 1 deletion(-) gcc/config/mips/linux-common.h | 4 ++++
2 files changed, 8 insertions(+)
--- a/gcc/config/i386/pmm_malloc.h --- a/gcc/config/aarch64/aarch64-linux-android.h
+++ b/gcc/config/i386/pmm_malloc.h +++ b/gcc/config/aarch64/aarch64-linux-android.h
@@ -31,7 +31,7 @@ @@ -56,4 +56,8 @@
#ifndef __cplusplus #define ENDFILE_SPEC \
extern int posix_memalign (void **, size_t, size_t); LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
#else
-extern "C" int posix_memalign (void **, size_t, size_t) throw ();
+extern "C" int posix_memalign (void **, size_t, size_t);
#endif
static __inline void * +#ifdef IN_LIBGCC2
+#define LIBGCC2_UNWIND_ATTRIBUTE __attribute__((visibility("default")))
+#endif
+
#endif /* GCC_AARCH64_LINUX_ANDROID_H */
--- a/gcc/config/mips/linux-common.h
+++ b/gcc/config/mips/linux-common.h
@@ -62,3 +62,7 @@
/* The default value isn't sufficient in 64-bit mode. */
#define STACK_CHECK_PROTECT (TARGET_64BIT ? 16 * 1024 : 12 * 1024)
+
+#ifdef IN_LIBGCC2
+#define LIBGCC2_UNWIND_ATTRIBUTE __attribute__((visibility("default")))
+#endif

View File

@ -1,34 +0,0 @@
commit 9ae82f7cfc1073820092dd9f957559667e77db0d
Author: Dmitry Moskalchuk <dm@crystax.net>
Date: Tue Aug 25 09:36:42 2015 +0300
[android] Explicitly make _Unwind_Resume visible for arm64/mips64
Signed-off-by: Dmitry Moskalchuk <dm@crystax.net>
---
gcc/config/aarch64/aarch64-linux-android.h | 4 ++++
gcc/config/mips/linux-common.h | 4 ++++
2 files changed, 8 insertions(+)
--- a/gcc/config/aarch64/aarch64-linux-android.h
+++ b/gcc/config/aarch64/aarch64-linux-android.h
@@ -56,4 +56,8 @@
#define ENDFILE_SPEC \
LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
+#ifdef IN_LIBGCC2
+#define LIBGCC2_UNWIND_ATTRIBUTE __attribute__((visibility("default")))
+#endif
+
#endif /* GCC_AARCH64_LINUX_ANDROID_H */
--- a/gcc/config/mips/linux-common.h
+++ b/gcc/config/mips/linux-common.h
@@ -62,3 +62,7 @@
/* The default value isn't sufficient in 64-bit mode. */
#define STACK_CHECK_PROTECT (TARGET_64BIT ? 16 * 1024 : 12 * 1024)
+
+#ifdef IN_LIBGCC2
+#define LIBGCC2_UNWIND_ATTRIBUTE __attribute__((visibility("default")))
+#endif

View File

@ -0,0 +1,28 @@
libgcc: xtensa: fix build with -mtext-section-literals
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
libgcc/config/xtensa/ieee754-df.S | 1 +
libgcc/config/xtensa/ieee754-sf.S | 1 +
2 files changed, 2 insertions(+)
--- a/libgcc/config/xtensa/ieee754-sf.S
+++ b/libgcc/config/xtensa/ieee754-sf.S
@@ -55,6 +55,7 @@
#ifdef L_addsubsf3
+ .literal_position
/* Addition */
__addsf3_aux:
--- a/libgcc/config/xtensa/ieee754-df.S
+++ b/libgcc/config/xtensa/ieee754-df.S
@@ -55,6 +55,7 @@
#ifdef L_addsubdf3
+ .literal_position
/* Addition */
__adddf3_aux:

View File

@ -0,0 +1,75 @@
commit a68ba2f3cd3cbe32c1f31e13c20ed13487727b32
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Wed Oct 18 17:26:23 2017 +0100
[AARCH64] Rewrite elf_machine_load_address using _DYNAMIC symbol
This patch rewrites aarch64 elf_machine_load_address to use special _DYNAMIC
symbol instead of _dl_start.
The static address of _DYNAMIC symbol is stored in the first GOT entry.
Here is the change which makes this solution work (part of binutils 2.24):
https://sourceware.org/ml/binutils/2013-06/msg00248.html
i386, x86_64 targets use the same method to do this as well.
The original implementation relies on a trick that R_AARCH64_ABS32 relocation
being resolved at link time and the static address fits in the 32bits.
However, in LP64, normally, the address is defined to be 64 bit.
Here is the C version one which should be portable in all cases.
* sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use
_DYNAMIC symbol to calculate load address.
---
sysdeps/aarch64/dl-machine.h | 37 ++++---------------------------------
1 file changed, 4 insertions(+), 33 deletions(-)
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -51,40 +51,11 @@
/* To figure out the load address we use the definition that for any symbol:
dynamic_addr(symbol) = static_addr(symbol) + load_addr
- The choice of symbol is arbitrary. The static address we obtain
- by constructing a non GOT reference to the symbol, the dynamic
- address of the symbol we compute using adrp/add to compute the
- symbol's address relative to the PC.
- This depends on 32/16bit relocations being resolved at link time
- and that the static address fits in the 32/16 bits. */
+ _DYNAMIC sysmbol is used here as its link-time address stored in
+ the special unrelocated first GOT entry. */
- ElfW(Addr) static_addr;
- ElfW(Addr) dynamic_addr;
-
- asm (" \n"
-" adrp %1, _dl_start; \n"
-#ifdef __LP64__
-" add %1, %1, #:lo12:_dl_start \n"
-#else
-" add %w1, %w1, #:lo12:_dl_start \n"
-#endif
-" ldr %w0, 1f \n"
-" b 2f \n"
-"1: \n"
-#ifdef __LP64__
-" .word _dl_start \n"
-#else
-# ifdef __AARCH64EB__
-" .short 0 \n"
-# endif
-" .short _dl_start \n"
-# ifndef __AARCH64EB__
-" .short 0 \n"
-# endif
-#endif
-"2: \n"
- : "=r" (static_addr), "=r" (dynamic_addr));
- return dynamic_addr - static_addr;
+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
+ return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
}
/* Set up the loaded object described by L so its unrelocated PLT

View File

@ -1,3 +1,5 @@
Revert the commit below. A better solution is being discussed on newlib's mailing list.
commit fcd33916ac03086b9090c68e88036afa4b25d913 commit fcd33916ac03086b9090c68e88036afa4b25d913
Author: Alexander Fedotov <alfedotov@gmail.com> Author: Alexander Fedotov <alfedotov@gmail.com>
Date: Mon Dec 25 16:28:22 2017 +0300 Date: Mon Dec 25 16:28:22 2017 +0300