Description
Attempting to link the .NET for Android NAOT sample breaks when NDK r29 is installed, with the following error (output broken up into lines to make it easier to read):
Android (13989888, +pgo, +bolt, +lto, +mlgo, based on r563880c) clang version 21.0.0 (https://android.googlesource.com/toolchain/llvm-project 5e96669f06077099aa41290cdb4c5e6fa0f59349)
Target: aarch64-unknown-linux-android21
Thread model: posix
InstalledDir: ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin
"~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" -EL
--fix-cortex-a53-843419 -z now -z relro -z max-page-size=16384 --no-rosegment --hash-style=both
--eh-frame-hdr -m aarch64linux -shared
-o bin/Release/net10.0-android/android-arm64/native/NativeAOT.so
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21/crtbegin_so.o
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib
--compress-debug-sections=zlib obj/Release/net10.0-android/android-arm64/native/NativeAOT.o
--version-script=obj/Release/net10.0-android/android-arm64/native/NativeAOT.exports
--export-dynamic
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Globalization.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.IO.Compression.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Security.Cryptography.Native.Android.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbootstrapperdll.o
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libeventpipe-disabled.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libstandalonegc-disabled.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libaotminipal.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlienc.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlidec.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlicommon.a
--build-id=sha1 --as-needed -e 0x0 -ldl -lz -llog -lm -z relro -z now --eh-frame-hdr -z
max-page-size=16384 -soname libNativeAOT.so --error-unresolved-symbols --no-undefined
~/vc/xamarin/xamarin-android-worktrees/ndk-r29/bin/Debug/lib/packs/Microsoft.Android.Runtime.NativeAOT.36.android-arm64/36.1.99/runtimes/android-arm64/native/libnaot-android.release-static-release.a
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_static.a
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
obj/Release/net10.0-android/android-arm64/android/jni_init_funcs.arm64-v8a.o
obj/Release/net10.0-android/android-arm64/android/environment.arm64-v8a.o --discard-all
--gc-sections -T obj/Release/net10.0-android/android-arm64/native/sections.ld
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/libclang_rt.builtins-aarch64-android.a
-l:libunwind.a -ldl -lc
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/libclang_rt.builtins-aarch64-android.a
-l:libunwind.a -ldl
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21/crtend_so.o
ld.lld: error: duplicate symbol: __unw_init_local
>>> defined at libunwind.cpp:44 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:44)
>>> libunwind.cpp.o:(__unw_init_local) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_init_local+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: libunwind::LocalAddressSpace::sThisAddressSpace
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(libunwind::LocalAddressSpace::sThisAddressSpace) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.bss._ZN9libunwind17LocalAddressSpace17sThisAddressSpaceE+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_get_reg
>>> defined at libunwind.cpp:99 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:99)
>>> libunwind.cpp.o:(__unw_get_reg) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_get_reg+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_set_reg
>>> defined at libunwind.cpp:114 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:114)
>>> libunwind.cpp.o:(__unw_set_reg) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_set_reg+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_get_fpreg
>>> defined at libunwind.cpp:146 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:146)
>>> libunwind.cpp.o:(__unw_get_fpreg) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_get_fpreg+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_set_fpreg
>>> defined at libunwind.cpp:161 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:161)
>>> libunwind.cpp.o:(__unw_set_fpreg) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_set_fpreg+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_step
>>> defined at libunwind.cpp:197 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:197)
>>> libunwind.cpp.o:(__unw_step) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_step+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_step_stage2
>>> defined at libunwind.cpp:207 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:207)
>>> libunwind.cpp.o:(__unw_step_stage2) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_step_stage2+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_get_proc_info
>>> defined at libunwind.cpp:212 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:212)
>>> libunwind.cpp.o:(__unw_get_proc_info) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_get_proc_info+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_resume
>>> defined at libunwind.cpp:224 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:224)
>>> libunwind.cpp.o:(__unw_resume) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_resume+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_get_proc_name
>>> defined at libunwind.cpp:238 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:238)
>>> libunwind.cpp.o:(__unw_get_proc_name) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_get_proc_name+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_is_fpreg
>>> defined at libunwind.cpp:251 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:251)
>>> libunwind.cpp.o:(__unw_is_fpreg) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_is_fpreg+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_regname
>>> defined at libunwind.cpp:265 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:265)
>>> libunwind.cpp.o:(__unw_regname) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_regname+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_is_signal_frame
>>> defined at libunwind.cpp:270 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:270)
>>> libunwind.cpp.o:(__unw_is_signal_frame) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_is_signal_frame+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_iterate_dwarf_unwind_cache
>>> defined at libunwind.cpp:303 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:303)
>>> libunwind.cpp.o:(__unw_iterate_dwarf_unwind_cache) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_iterate_dwarf_unwind_cache+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_add_dynamic_fde
>>> defined at libunwind.cpp:312 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:312)
>>> libunwind.cpp.o:(__unw_add_dynamic_fde) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_add_dynamic_fde+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_remove_dynamic_fde
>>> defined at libunwind.cpp:331 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:331)
>>> libunwind.cpp.o:(__unw_remove_dynamic_fde) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_remove_dynamic_fde+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_add_dynamic_eh_frame_section
>>> defined at libunwind.cpp:336 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:336)
>>> libunwind.cpp.o:(__unw_add_dynamic_eh_frame_section) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_add_dynamic_eh_frame_section+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: __unw_remove_dynamic_eh_frame_section
>>> defined at libunwind.cpp:358 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:358)
>>> libunwind.cpp.o:(__unw_remove_dynamic_eh_frame_section) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.text.__unw_remove_dynamic_eh_frame_section+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
ld.lld: error: duplicate symbol: unw_local_addr_space
>>> defined at libunwind.cpp:38 (/__w/1/s/src/runtime/src/native/external/llvm-libunwind/src/libunwind.cpp:38)
>>> libunwind.cpp.o:(unw_local_addr_space) in archive ~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
>>> defined at libunwind.cpp
>>> libunwind.cpp.o:(.data.unw_local_addr_space+0x0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64/libunwind.a
I hoped that passing -unwindlib=none would make linking work, but unfortunately, it causes the following error:
Android (13989888, +pgo, +bolt, +lto, +mlgo, based on r563880c) clang version 21.0.0 (https://android.googlesource.com/toolchain/llvm-project 5e96669f06077099aa41290cdb4c5e6fa0f59349)
Target: aarch64-unknown-linux-android21
Thread model: posix
InstalledDir: ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin
"~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" -EL
--fix-cortex-a53-843419 -z now -z relro -z max-page-size=16384 --no-rosegment --hash-style=both
--eh-frame-hdr -m aarch64linux -shared -o
bin/Release/net10.0-android/android-arm64/native/NativeAOT.so
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21/crtbegin_so.o
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/aarch64
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android
-L~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib
--compress-debug-sections=zlib obj/Release/net10.0-android/android-arm64/native/NativeAOT.o
--version-script=obj/Release/net10.0-android/android-arm64/native/NativeAOT.exports
--export-dynamic
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Globalization.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.IO.Compression.Native.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libSystem.Security.Cryptography.Native.Android.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbootstrapperdll.o
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libRuntime.WorkstationGC.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libeventpipe-disabled.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libstandalonegc-disabled.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libaotminipal.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlienc.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlidec.a
~/.nuget/packages/microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native/libbrotlicommon.a
--build-id=sha1 --as-needed -e 0x0 -ldl -lz -llog -lm -z relro -z now --eh-frame-hdr -z
max-page-size=16384 -soname libNativeAOT.so --error-unresolved-symbols --no-undefined
~/vc/xamarin/xamarin-android-worktrees/ndk-r29/bin/Debug/lib/packs/Microsoft.Android.Runtime.NativeAOT.36.android-arm64/36.1.99/runtimes/android-arm64/native/libnaot-android.release-static-release.a
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_static.a
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
obj/Release/net10.0-android/android-arm64/android/jni_init_funcs.arm64-v8a.o
obj/Release/net10.0-android/android-arm64/android/environment.arm64-v8a.o --discard-all
--gc-sections -T obj/Release/net10.0-android/android-arm64/native/sections.ld
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/libclang_rt.builtins-aarch64-android.a
-ldl -lc
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/21/lib/linux/libclang_rt.builtins-aarch64-android.a
-ldl
~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21/crtend_so.o
ld.lld: error: undefined symbol: _Unwind_Resume
>>> referenced by stdexcept:0 (out/lib/device-libcxx-aarch64-ndk-cxx/include/c++/v1/stdexcept:0)
>>> hash.cpp.o:(std::__ndk1::__throw_overflow_error[abi:ne210000](char const*)) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_static.a
>>> referenced by thread.cpp:0 (out/llvm-project/libcxx/src/thread.cpp:0)
>>> thread.cpp.o:(std::__ndk1::__thread_local_data()) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_static.a
>>> referenced by call_once.cpp:0 (out/llvm-project/libcxx/src/call_once.cpp:0)
>>> call_once.cpp.o:(std::__ndk1::__call_once(unsigned long volatile&, void*, void (*)(void*))) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_static.a
>>> referenced 198 more times
ld.lld: error: undefined symbol: _Unwind_RaiseException
>>> referenced by cxa_exception.cpp:295 (out/llvm-project/libcxxabi/src/cxa_exception.cpp:295)
>>> cxa_exception.cpp.o:(__cxa_throw) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
ld.lld: error: undefined symbol: _Unwind_SetGR
>>> referenced by cxa_personality.cpp:556 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:556)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
>>> referenced by cxa_personality.cpp:558 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:558)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
>>> referenced by cxa_personality.cpp:556 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:556)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
>>> referenced 1 more times
ld.lld: error: undefined symbol: _Unwind_SetIP
>>> referenced by cxa_personality.cpp:560 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:560)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
>>> referenced by cxa_personality.cpp:560 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:560)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
ld.lld: error: undefined symbol: _Unwind_GetLanguageSpecificData
>>> referenced by cxa_personality.cpp:626 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:626)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
ld.lld: error: undefined symbol: _Unwind_GetIP
>>> referenced by cxa_personality.cpp:641 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:641)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
ld.lld: error: undefined symbol: _Unwind_GetRegionStart
>>> referenced by cxa_personality.cpp:644 (out/llvm-project/libcxxabi/src/cxa_personality.cpp:644)
>>> cxa_personality.cpp.o:(__gxx_personality_v0) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
ld.lld: error: undefined symbol: _Unwind_DeleteException
>>> referenced by cxa_exception.cpp:586 (out/llvm-project/libcxxabi/src/cxa_exception.cpp:586)
>>> cxa_exception.cpp.o:(__cxa_end_catch) in archive ~/android-toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++abi.a
The problem, I think, stems from the fact that libRuntime.WorkstationGC.a exports libunwind symbols where it should keep them hidden:
microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native$ nm -C libRuntime.WorkstationGC.a | grep __unw
0000000000000000 T __unw_add_dynamic_eh_frame_section
0000000000000000 T __unw_add_dynamic_fde
0000000000000000 T __unw_get_fpreg
0000000000000000 T __unw_get_proc_info
0000000000000000 T __unw_get_proc_name
0000000000000000 T __unw_get_reg
0000000000000000 T __unw_get_save_loc
0000000000000000 T __unw_init_local
0000000000000000 T __unw_is_fpreg
0000000000000000 T __unw_is_signal_frame
0000000000000000 T __unw_iterate_dwarf_unwind_cache
0000000000000000 T __unw_regname
0000000000000000 T __unw_remove_dynamic_eh_frame_section
0000000000000000 T __unw_remove_dynamic_fde
0000000000000000 T __unw_resume
0000000000000000 T __unw_set_fpreg
0000000000000000 T __unw_set_reg
0000000000000000 T __unw_step
0000000000000000 T __unw_step_stage2
0000000000000000 T __unw_getcontext
NDK r29 uses LLVM 21
Reproduction Steps
- Check out the https://github.com/dotnet/android/
dev/grendel/ndk-r29 branch locally (from this PR)
- Go to the checked-out directory and run:
- On Linux/macOS:
make prepare all
- On Windows:
build.cmd
- After the build completes, go to the
samples/NativeAOT directory and run
- On Linux/macOS:
../../dotnet-local.sh build -c Release -bl
- On Windows:
..\..\dotnet-local.cmd build -c Release -bl
Expected behavior
Application should be linked without errors
Actual behavior
Application linking fails with errors
Regression?
No response
Known Workarounds
No known workarounds
Configuration
- .NET version: 10.0.100
- OS: not dependent on the operating system
- Architecture: not dependent on the architecture
- Specific to building a .NET for Android app using NativeAOT with NDK r29
Other information
No response
Description
Attempting to link the .NET for Android NAOT sample breaks when NDK r29 is installed, with the following error (output broken up into lines to make it easier to read):
I hoped that passing
-unwindlib=nonewould make linking work, but unfortunately, it causes the following error:The problem, I think, stems from the fact that
libRuntime.WorkstationGC.aexportslibunwindsymbols where it should keep them hidden:microsoft.netcore.app.runtime.nativeaot.android-arm64/10.0.0/runtimes/android-arm64/native$ nm -C libRuntime.WorkstationGC.a | grep __unw 0000000000000000 T __unw_add_dynamic_eh_frame_section 0000000000000000 T __unw_add_dynamic_fde 0000000000000000 T __unw_get_fpreg 0000000000000000 T __unw_get_proc_info 0000000000000000 T __unw_get_proc_name 0000000000000000 T __unw_get_reg 0000000000000000 T __unw_get_save_loc 0000000000000000 T __unw_init_local 0000000000000000 T __unw_is_fpreg 0000000000000000 T __unw_is_signal_frame 0000000000000000 T __unw_iterate_dwarf_unwind_cache 0000000000000000 T __unw_regname 0000000000000000 T __unw_remove_dynamic_eh_frame_section 0000000000000000 T __unw_remove_dynamic_fde 0000000000000000 T __unw_resume 0000000000000000 T __unw_set_fpreg 0000000000000000 T __unw_set_reg 0000000000000000 T __unw_step 0000000000000000 T __unw_step_stage2 0000000000000000 T __unw_getcontextNDK r29 uses LLVM 21
Reproduction Steps
dev/grendel/ndk-r29branch locally (from this PR)make prepare allbuild.cmdsamples/NativeAOTdirectory and run../../dotnet-local.sh build -c Release -bl..\..\dotnet-local.cmd build -c Release -blExpected behavior
Application should be linked without errors
Actual behavior
Application linking fails with errors
Regression?
No response
Known Workarounds
No known workarounds
Configuration
Other information
No response