]> granicus.if.org Git - gc/commitdiff
Register dynamic libraries via dl_iterate_phdr on Android if possible
authorIvan Maidanski <ivmai@mail.ru>
Sat, 1 Jun 2013 10:33:33 +0000 (14:33 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 1 Jun 2013 10:33:33 +0000 (14:33 +0400)
* dyn_load.c (HAVE_DL_ITERATE_PHDR): Define also for Android.
* dyn_load.c (dl_iterate_phdr): Declare explicitly for Android (since
no prototype in NDK link.h for ARM).

dyn_load.c

index a6f4a86500b4d82998c3e8fb2c5f733847cae13d..246195d9b10b49e63fa6725cf5f8abdc48e32f33 100644 (file)
@@ -392,16 +392,21 @@ GC_INNER GC_bool GC_register_main_static_data(void)
 #else /* !USE_PROC_FOR_LIBRARIES */
 
 /* The following is the preferred way to walk dynamic libraries */
-/* For glibc 2.2.4+.  Unfortunately, it doesn't work for older  */
+/* for glibc 2.2.4+.  Unfortunately, it doesn't work for older  */
 /* versions.  Thanks to Jakub Jelinek for most of the code.     */
 
-#if (defined(LINUX) || defined (__GLIBC__)) /* Are others OK here, too? */ \
-     && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
-         || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
+    || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)) \
+    || defined(PLATFORM_ANDROID) /* Are others OK here, too? */
 /* We have the header files for a glibc that includes dl_iterate_phdr.  */
 /* It may still not be available in the library on the target system.   */
 /* Thus we also treat it as a weak symbol.                              */
 # define HAVE_DL_ITERATE_PHDR
+# ifdef PLATFORM_ANDROID
+    /* Android headers might have no such definition for some targets.  */
+    int dl_iterate_phdr(int (*cb)(struct dl_phdr_info *, size_t, void *),
+                        void *data);
+# endif
 # pragma weak dl_iterate_phdr
 #endif