| From 1fc21976be58987f036caa1103b821d51449af05 Mon Sep 17 00:00:00 2001 |
| From: David 'Digit' Turner <digit@google.com> |
| Date: Fri, 17 Feb 2012 19:38:08 +0100 |
| Subject: gcc: prevent crash on Eclair and older platforms. |
| |
| The point of this patch is to work-around a bug in the Eclair |
| dynamic linker, which doesn't support weak symbols. By default, |
| libsupc++ and libstdc++ generate static C++ constructors that |
| reference weak symbols. |
| |
| When they are statically linked into shared libraries, the |
| corresponding code is referenced in its .init_array section |
| and run when the shared library is loaded. |
| |
| On Eclair and previous release, the weak symbol is not resolved |
| before the constructor are launched, resulting in a crash when |
| the PLT entry tries to jump to address 0. |
| |
| By not generating weak symbol references, we avoid the problem |
| completely. And we don't need them because the pthread symbols |
| are all in the C library on Android, unlike legacy Linux systems |
| which put them in libpthread.so (and provide weak stubs in libc.so). |
| --- |
| gcc-4.4.3/gcc/gthr-posix.h | 13 +++++++++++++ |
| gcc-4.6/gcc/gthr-posix.h | 13 +++++++++++++ |
| 2 files changed, 26 insertions(+), 0 deletions(-) |
| |
| diff --git a/gcc-4.4.3/gcc/gthr-posix.h b/gcc-4.4.3/gcc/gthr-posix.h |
| index 27652f9..a104d91 100644 |
| --- a/gcc-4.4.3/gcc/gthr-posix.h |
| +++ b/gcc-4.4.3/gcc/gthr-posix.h |
| @@ -38,6 +38,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| #define _REENTRANT 1 |
| #endif |
| |
| +/* 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> |
| #include <unistd.h> |
| |
| diff --git a/gcc-4.6/gcc/gthr-posix.h b/gcc-4.6/gcc/gthr-posix.h |
| index ecb06e2..8372c64 100644 |
| --- a/gcc-4.6/gcc/gthr-posix.h |
| +++ b/gcc-4.6/gcc/gthr-posix.h |
| @@ -38,6 +38,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| #define _REENTRANT 1 |
| #endif |
| |
| +/* 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> |
| #include <unistd.h> |
| |
| diff --git a/gcc-4.7/libgcc/gthr-posix.h b/gcc-4.7/libgcc/gthr-posix.h |
| index a935e92..08281b7 100644 |
| --- a/gcc-4.7/libgcc/gthr-posix.h |
| +++ b/gcc-4.7/libgcc/gthr-posix.h |
| @@ -38,6 +38,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| #define _REENTRANT 1 |
| #endif |
| |
| +/* 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)) \ |
| -- |
| 1.7.6.rc0 |
| |