/* Exclude Android because linker.h below includes its own version. */
# include <elf.h>
# endif
-# include <link.h>
-# if defined(PLATFORM_ANDROID) && !defined(GC_DONT_DEFINE_LINK_MAP)
+# ifdef PLATFORM_ANDROID
/* If you don't need the "dynamic loading" feature, you may build */
/* the collector with -D IGNORE_DYNAMIC_LOADING. */
- /* 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;
- };
+# ifdef BIONIC_ELFDATA_REDEF_BUG
+ /* Workaround a problem in Bionic (as of Android 4.2) 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 <link.h>
+# if !defined(GC_DONT_DEFINE_LINK_MAP)
+ /* 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
+# else
+# include <link.h>
# endif
#endif