Skip to content

Commit 4bd2c6b

Browse files
author
Andrey Kamaev
committed
Android toolchain: added fixes/workarounds for NDK r8b and NDK r6 bugs
1 parent e2d9fc4 commit 4bd2c6b

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

android/android.toolchain.cmake

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ elseif( ANDROID_STANDALONE_TOOLCHAIN )
474474
set( BUILD_WITH_STANDALONE_TOOLCHAIN True )
475475
else()
476476
list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH)
477-
message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolcahin.
477+
message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain.
478478
You should either set an environment variable:
479479
export ANDROID_NDK=~/my-android-ndk
480480
or
@@ -773,6 +773,27 @@ You are strongly recommended to switch to another NDK release.
773773
" )
774774
endif()
775775

776+
if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
777+
message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
778+
See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
779+
diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
780+
index 5e28c64..65892a1 100644
781+
--- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
782+
+++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
783+
@@ -51,7 +51,11 @@ typedef long int ssize_t;
784+
#endif
785+
#ifndef _PTRDIFF_T
786+
#define _PTRDIFF_T
787+
-typedef long ptrdiff_t;
788+
+# ifdef __ANDROID__
789+
+ typedef int ptrdiff_t;
790+
+# else
791+
+ typedef long ptrdiff_t;
792+
+# endif
793+
#endif
794+
" )
795+
endif()
796+
776797
# setup paths and STL for NDK
777798
if( BUILD_WITH_ANDROID_NDK )
778799
set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
@@ -1048,6 +1069,11 @@ if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
10481069
set( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
10491070
set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
10501071
endif()
1072+
if ( X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
1073+
# workaround "undefined reference to `__dso_handle'" problem
1074+
set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
1075+
set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
1076+
endif()
10511077
if( EXISTS "${__libstl}" )
10521078
set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" )
10531079
set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" )
@@ -1111,10 +1137,13 @@ if( ANDROID_FUNCTION_LEVEL_LINKING )
11111137
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
11121138
endif()
11131139

1114-
if( CMAKE_HOST_UNIX AND (ARMEABI_V7A OR X86) AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
1115-
if( ANDROID_GOLD_LINKER )
1116-
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
1117-
endif()
1140+
if( ANDROID_GOLD_LINKER AND CMAKE_HOST_UNIX AND (ARMEABI OR ARMEABI_V7A OR X86) AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
1141+
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
1142+
elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" AND NOT _CMAKE_IN_TRY_COMPILE )
1143+
message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
1144+
On Linux and OS X host platform you can workaround this problem using gold linker (default).
1145+
Rerun cmake with -DANDROID_GOLD_LINKER=ON option.
1146+
" )
11181147
endif()
11191148

11201149
if( ANDROID_NOEXECSTACK )

0 commit comments

Comments
 (0)