# Changelog

Report issues to [GitHub].

For Android Studio issues, follow the docs on the [Android Studio site].

[GitHub]: https://github.com/android-ndk/ndk/issues
[Android Studio site]: http://tools.android.com/filing-bugs

## Announcements

 * 32-bit Windows is no longer supported. This does not affect the vast majority
   of users. If you do still need to build NDK apps from 32-bit versions of
   Windows, continue using NDK r20.

   For more information on this change within Android Developer tools, see the
   [blog post] on the topic.

[blog post]: https://android-developers.googleblog.com/2019/06/moving-android-studio-and-android.html

 * macOS 10.8 is no longer supported as of r21b (r21 supports 10.8). macOS 10.15
   requires that binaries be notarized, and notarization is only supported for
   binaries built for 10.9 or newer.

 * [LLD](https://lld.llvm.org/) is now available for testing. AOSP has switched
   to using LLD by default and the NDK will follow (timeline unknown). Test LLD
   in your app by passing `-fuse-ld=lld` when linking. Note that [Issue 843]
   will affect builds using LLD with binutils strip and objcopy as opposed to
   llvm-strip and llvm-objcopy.

 * The legacy toolchain install paths will be removed over the coming releases.
   These paths have been obsolete since NDK r19 and take up a considerable
   amount of space in the NDK. The paths being removed are:

   * platforms
   * sources/cxx-stl
   * sysroot
   * toolchains (with the exception of toolchains/llvm)

   In general this change should only affect build system maintainers, or those
   using build systems that are not up to date. ndk-build and the CMake
   toolchain users are unaffected, and neither are
   `make_standalone_toolchain.py` users (though that script has been unnecessary
   since r19).

   For information on migrating away from the legacy toolchain layout, see the
   [Build System Maintainers Guide] for the NDK version you're using.

 * The Play Store will require 64-bit support when uploading an APK beginning in
   August 2019. Start porting now to avoid surprises when the time comes. For
   more information, see [this blog post](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

[Build System Maintainers Guide]: https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md

## r21e

 * [Issue 147772940]: Passing `APP_BUILD_SCRIPT` to ndk-build with a file named
   something other than Android.mk works again.

[Issue 147772940]: https://issuetracker.google.com/147772940

## r21c

 * [Issue 1060]: A macOS app bundle that is signed and notarized is now
   available for download from our wiki and our website. Note that because only
   bundles may use RPATHs and pass notarization, the traditional NDK package for
   macOS **cannot* be notarized.  The SDK will continue to use the traditional
   package as the app bundle requires layout changes that would make it
   incompatible with Android Studio.  The NDK is not quarantined when it is
   downloaded via the SDK manager, so is curently allowed by Gatekeeper.

   **The SDK manager is currently the most reliable way to get the NDK for
   macOS.**

 * [Issue 1207]: Fix fatal error in clang when building with -O2 on arm64.

 * [Issue 1239]: Fix network drive issues for clang.

 * [Issue 1229]: README.md turned back to ordinary file.

[Issue 1060]: https://github.com/android/ndk/issues/1060
[Issue 1207]: https://github.com/android/ndk/issues/1207
[Issue 1239]: https://github.com/android/ndk/issues/1239
[Issue 1229]: https://github.com/android/ndk/issues/1229

## r21b

 * Fixed debugging processes containing Java with gdb. Cherrypicked
   "gdb: Don't fault for 'maint print psymbols' when using an index", which
   fixes a bug that caused gdb to fail when debugging a process with Java.
   Pure C/C++ executables were fine, but this effectively broke all app
   debugging. The error from gdb that confirms you were affected by this was
   `gdb-8.3/gdb/psymtab.c:316: internal-error: sect_index_text not initialized`.
 * [Issue 1166]: Rehid unwinder symbols all architectures.
 * [Issue 1173]: Fix gdb python symbol missing issue on Darwin.
 * [Issue 1176]: Fix strip failing with "File truncated" errors on Windows.
 * [Issue 1178]: Revert changes to stdatomic.h to maintain compatibility with
   C's `_Atomic` type qualifier. Note that the C++ standard will likely mandate
   this breakage in the future. See [P0943R4] for more details.
 * [Issue 1184]: Fix Clang crash for x86_64.
 * [Issue 1198]: Fix incorrect constant folding of long doubles on Windows.
 * [Issue 1201]: Fixed issue in ndk-build that was causing `APP_PLATFORM` to be
   corrupted for API 30+ with LP64 ABIs.
 * [Issue 1203]: libc++ prebuilts and CRT objects are no longer built as Neon.
 * [Issue 1205]: Potential fixes for relocation out of range issues with LLD.
 * [Issue 1206]: LLD support for --fix-cortex-a8.

[Issue 1166]: https://github.com/android/ndk/issues/1166
[Issue 1173]: https://github.com/android/ndk/issues/1173
[Issue 1176]: https://github.com/android/ndk/issues/1176
[Issue 1178]: https://github.com/android/ndk/issues/1178
[Issue 1184]: https://github.com/android/ndk/issues/1184
[Issue 1198]: https://github.com/android/ndk/issues/1198
[Issue 1201]: https://github.com/android/ndk/issues/1201
[Issue 1203]: https://github.com/android/ndk/issues/1203
[Issue 1205]: https://github.com/android/ndk/issues/1205
[Issue 1206]: https://github.com/android/ndk/issues/1206
[P0943R4]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0943r4.html

## Changes

 * Updated Clang and LLD to r365631.
     * [Issue 855]: LLD no longer hangs when using multithreaded linking on
       Windows.
     * [Issue 884]: Clang no longer passes `-faddrsig` by default.
     * [Issue 859]: Clang now default to using Neon for all 32-bit Android Arm
       targets.
         * If your minSdkVersion is 23 or higher, or if you were already
           enabling Neon manually, this change does not affect you.
         * CPUs that do not support this feature are uncommon.
         * If you need to continue supporting these devices you can disable
           Neon explicitly by setting `LOCAL_ARM_NEON := false` in ndk-build or
           passing `-DANDROID_ARM_NEON=false` to CMake.
         * Alternatively, use the Play Console to [exclude CPUs] without
           Neon to disallow your app from being installed on those devices.
     * [Issue 1004]: Fixed bug with bad line number information when building
       Arm64 with `-O0`.
     * [Issue 1028]: OpenMP is now available in both static and shared variants.
       Note that shared is the default behavior, but in prior NDK releases the
       static library would be used because there was no shared library. To keep
       the old behavior, link with `-static-openmp`.
 * Updated libc++ to r369764.
 * Updated make to 4.2.1.
     * Modified ndk-build to supply `-O` for more readable errors with parallel
       builds.
     * `abspath` now works properly with Windows drive letters, so if you're
       using the [workaround] similar to what's found in the NDK samples, you'll
       need to either drop the workaround or make sure it's only used prior to
       r21.
 * Updated glibc to 2.17.
 * Updated gdb to 8.3.
 * [Issue 885]: For LLD+LLDB compatibility, the NDK build systems now pass
   `-Wl,--build-id=sha1` instead of `-Wl,--build-id` when using LLD. Note that
   the CMake toolchain does not have access to flags set in CMakeLists.txt, so
   using an explicit `-fuse-ld=lld` instead of `ANDROID_LD=lld` will produce
   output that cannot be debugged with Android Studio. Third-party build systems
   need to apply the workaround manually. For more details, see the [Build
   System Maintainers Guide][maintainer_linkers].
 * Fixed ndk-build to use Clang's default C++ standard version (currently C++14)
   when using libc++.
 * Removed the `cxx-stl/system` module from ndk-build. The system STL is still
   available (for now, see [Issue 744]); only an implementation detail has been
   removed. If you were explicitly linking libstdc++ or importing
   `cxx-stl/system`, remove that and ensure that `APP_STL` is set to `system`
   instead.
 * [Issue 976]: ndk-build and the CMake toolchain file now enable
   `_FORTIFY_SOURCE` by default. See [FORTIFY in Android] for more details.
 * Added `NDK_GRADLE_INJECTED_IMPORT_PATH` support to ndk-build. This is to
   support import of dependencies from AAR dependencies. See [Issue 916] for
   more information.
 * Added `NDK_MAJOR`, `NDK_MINOR`, `NDK_BETA`, `NDK_CANARY`, and
   `ndk-major-at-least` APIs to ndk-build. These can be used to check what
   version of the NDK you are using from within ndk-build (CMake already has
   equivalent APIs). The first three are integers, `NDK_CANARY` is either `true`
   or `false`, and `ndk-major-at-least` is a function that takes a single
   integer. For example, to check if your build is being performed with NDK r21
   or newer:

   ```makefile
   # This check works even on pre-r21 NDKs. The function is undefined pre-r21,
   # and calling an undefined function in make returns the empty string, which
   # is not equal to "true", so the else branch will be taken.
   ifeq ($(call ndk-major-at-least,21),true)
       # Using at least NDK r21.
   else
       # Using something earlier than r21.
   endif
   ```

   Note that because this API was not available before r21, it cannot be used to
   determine *which* NDK version earlier than 21 is being used.
 * [Issue 1092]: Fixed hiding of unwinder symbols in outputs of ndk-build and
   CMake. Maintainers of third-party build systems should apply similar fixes
   when using NDK r19 and above to guard against possible future compatibility
   issues.

[FORTIFY in Android]: https://android-developers.googleblog.com/2017/04/fortify-in-android.html
[Issue 1004]: https://github.com/android-ndk/ndk/issues/1004
[Issue 1028]: https://github.com/android/ndk/issues/1028
[Issue 1092]: https://github.com/android/ndk/issues/1092
[Issue 744]: https://github.com/android/ndk/issues/744
[Issue 855]: https://github.com/android-ndk/ndk/issues/855
[Issue 859]: https://github.com/android-ndk/ndk/issues/859
[Issue 884]: https://github.com/android-ndk/ndk/issues/884
[Issue 885]: https://github.com/android-ndk/ndk/issues/885
[Issue 916]: https://github.com/android-ndk/ndk/issues/916
[Issue 976]: https://github.com/android/ndk/issues/976
[exclude CPUs]: https://support.google.com/googleplay/android-developer/answer/7353455?hl=en
[maintainer_linkers]: https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#Linkers
[workaround]: https://github.com/android/ndk-samples/blob/2c97a9eb5b9b5de233b7ece4dd0d0d28fa4cb4c2/other-builds/ndkbuild/common.mk#L26

## Known Issues

 * This is not intended to be a comprehensive list of all outstanding bugs.
 * [Issue 360]: `thread_local` variables with non-trivial destructors will cause
   segfaults if the containing library is `dlclose`ed on devices running M or
   newer, or devices before M when using a static STL. The simple workaround is
   to not call `dlclose`.
 * [Issue 70838247]: Gold emits broken debug information for AArch64. AArch64
   still uses BFD by default.
 * [Issue 906]: Clang does not pass `-march=armv7-a` to the assembler when using
   `-fno-integrated-as`. This results in the assembler generating ARMv5
   instructions. Note that by default Clang uses the integrated assembler which
   does not have this problem. To workaround this issue, explicitly use
   `-march=armv7-a` when building for 32-bit ARM with the non-integrated
   assembler, or use the integrated assembler. ndk-build and CMake already
   contain these workarounds.
 * [Issue 906]: Clang does not pass `-march=armv7-a` to the assembler when using
   `-fno-integrated-as`. This results in the assembler generating ARMv5
   instructions. Note that by default Clang uses the integrated assembler which
   does not have this problem. To workaround this issue, explicitly use
   `-march=armv7-a` when building for 32-bit ARM with the non-integrated
   assembler, or use the integrated assembler. ndk-build and CMake already
   contain these workarounds.
 * [Issue 988]: Exception handling when using ASan via wrap.sh can crash. To
   workaround this issue when using libc++_shared, ensure that your
   application's libc++_shared.so is in `LD_PRELOAD` in your `wrap.sh` as in the
   following example:

   ```bash
   #!/system/bin/sh
   HERE="$(cd "$(dirname "$0")" && pwd)"
   export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
   ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so)
   if [ -f "$HERE/libc++_shared.so" ]; then
       # Workaround for https://github.com/android-ndk/ndk/issues/988.
       export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so"
   else
       export LD_PRELOAD="$ASAN_LIB"
   fi
   "$@"
    ```

   There is no known workaround for libc++_static.

   Note that because this is a platform bug rather than an NDK bug this
   workaround will be necessary for this use case to work on all devices until
   at least Android R.
 * This version of the NDK is incompatible with the Android Gradle plugin
   version 3.0 or older. If you see an error like
   `No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android`,
   update your project file to [use plugin version 3.1 or newer]. You will also
   need to upgrade to Android Studio 3.1 or newer.
 * [Issue 843]: Using LLD with binutils `strip` or `objcopy` breaks RelRO.

[Issue 360]: https://github.com/android-ndk/ndk/issues/360
[Issue 70838247]: https://issuetracker.google.com/70838247
[Issue 843]: https://github.com/android-ndk/ndk/issues/843
[Issue 906]: https://github.com/android-ndk/ndk/issues/906
[Issue 988]: https://github.com/android-ndk/ndk/issues/988
[use plugin version 3.1 or newer]: https://developer.android.com/studio/releases/gradle-plugin#updating-plugin
