]> granicus.if.org Git - gc/commitdiff
Fix dyn_load.c compilation for Android 4.3
authorIvan Maidanski <ivmai@mail.ru>
Sat, 9 Nov 2013 07:56:35 +0000 (11:56 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 9 Nov 2013 14:30:34 +0000 (18:30 +0400)
* dyn_load.c (struct link_map, r_debug): Define explicitly (matching
that of Android 4.2 Bionic) instead of include linker.h (only if
PLATFORM_ANDROID); remove workaround enabled by
BIONIC_ELFDATA_REDEF_BUG regarding ELF_DATA redefinition (as linker.h
is not included); update comment.

dyn_load.c

index 215967e955f1c99d30097693c6c801dfc0b7738f..866d73f6ff2b3dfd58ac1067e12568b5eda8f2d6 100644 (file)
@@ -96,22 +96,27 @@ STATIC GC_has_static_roots_func GC_has_static_roots = 0;
     /* Exclude Android because linker.h below includes its own version. */
 #   include <elf.h>
 # endif
-# ifdef PLATFORM_ANDROID
-    /* The header file is in "bionic/linker" folder of Android sources. */
+# include <link.h>
+# if defined(PLATFORM_ANDROID) && !defined(GC_DONT_DEFINE_LINK_MAP)
     /* If you don't need the "dynamic loading" feature, you may build   */
     /* the collector with -D IGNORE_DYNAMIC_LOADING.                    */
-#   ifdef BIONIC_ELFDATA_REDEF_BUG
-      /* Workaround a problem in Android 4.1 (and 4.2) Bionic which has */
-      /* mismatching ELF_DATA definitions in sys/exec_elf.h and         */
-      /* asm/elf.h included from linker.h file (similar to EM_ALPHA).   */
-#     include <asm/elf.h>
-#     include <linux/elf-em.h>
-#     undef ELF_DATA
-#     undef EM_ALPHA
-#   endif
-#   include <linker.h>
-# else
-#   include <link.h>
+    /* Otherwise, link_map and r_debug should be defined explicitly,    */
+    /* as only bionic/linker/linker.h defines them but the header       */
+    /* itself is a C++ one starting from Android 4.3.                   */
+    struct link_map {
+      uintptr_t l_addr;
+      char* l_name;
+      uintptr_t l_ld;
+      struct link_map* l_next;
+      struct link_map* l_prev;
+    };
+    struct r_debug {
+      int32_t r_version;
+      struct link_map* r_map;
+      void (*r_brk)(void);
+      int32_t r_state;
+      uintptr_t r_ldbase;
+    };
 # endif
 #endif