-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unable to publish NativeAOT project for linux-bionic-arm64 #87340
Comments
Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas Issue DetailsDescriptionBuilding a simple Hello World sample works for the linux-bionic-x64 and linux-bionic-arm64 rids, but publishing AOT fails for linux-bionic-arm64, but works for linux-bionic-x64. The following error is thrown immediately when attempting the build,
Reproduction StepsA simple project with the required nuget packages already referenced here, https://github.com/emmauss/test-aot. Expected behaviorThe project quickly builds and a compatible executable is generated. Actual behaviorThe following error is displayed,
Regression?No response Known WorkaroundsNo response ConfigurationOS: Fedora 38 on WSL2 running on Windows 11 x64 host Other informationNo response
|
This is not expected to work yet. A fix that should get rid of the error you're seeing just went in a day a two ago but didn't make into installer yet. The fix was for building iOS but it should make progress with Bionic too. I didn't test Bionic with it yet but I was waiting until it merges to make more progress on Bionic. |
Thank you for the reply. I'll wait then and test it when it's ready. |
It's possible to try this out now:
The more interesting variation of this is building shared libraries that you can call into with JNI. There's a sample for that at https://github.com/josephmoresena/NativeAOT-AndroidHelloJniLib. The instructions obviously don't explain how to use this with today's bits, but @josephmoresena should be able to greatly simplify it soon (or you can send a PR). |
I can't access a Windows/Linux machine at the moment (I only have a MacBook Air for now), so I guess I can't test this. I will of course accept any PR with these instructions for .NET8. The only simplification of the instructions I've done on that repository was the use of BFlat. I would think it will be a while before I can test this but I think this is excellent news. Could I do something similar from MacOS? |
I would be surprised if the above instructions didn't work for macOS. I see there's some extra notes around macOS in the NDK downloads ("Only a DMG is provided for direct download for macOS because it is required for Catalina and newer. In most cases it will be easier to use the Android SDK manager to install the NDK.") but I assume those are just the general macOS pains that everyone bought into that ecosystem is already accustomed to :). |
Thanks. A sample Hello World project builds and runs fine on termux. |
Moving on to building a much larger library with many dependencies, one of which rely on
Is it possible to link openssl? |
We don't build/provide an openssl build because we don't want to be in the business of maintaining it and doing all the necessary security servicing. There's one we use in testing at https://netcorenativeassets.blob.core.windows.net/resource-packages/external/android/openssl-1.1.1l-beta-1.zip (you'll have to look around this repo for how it's consumed - I don't actually know). |
Following hints found in https://github.com/josephmoresena/NativeAOT-AndroidHelloJniLib , I'm unable to load anative shared library built. Logcat error is as follows;
When building an ndk library in android studio, they are linked at compile time to the android log library. Those binaries load fine using the same method as when loading the dotnet nativeaot shared library. |
Can you try adding this to the project file, delete obj and bin directories and publish again? <ItemGroup>
<LinkerArg Include="-llog" />
</ItemGroup> |
Adding this works, and I'm able to call functions from the library. Thanks. |
Fixes issue reported in #87340 (comment).
Thanks for confirming - I created #87862 to include this by default when targeting Bionic. Once that merges and propagates through the systems, the workaround won't be needed. |
Fixes issue reported in #87340 (comment).
#87900 was the last fix. The only remaining issue is to document how to set up the environment, and the gotcha with openssl. |
Nice. Am I right to assume we can publish Release builds now? And that we can strip symbols? |
Yes and yes. #87900 might need to flow into installer still, but if you're not on Windows, that one shouldn't be needed and latest installer should have everything I think. |
What's the expected behavior of OperatingSystem/RuntimeInformation apis when running on android when called in a bionic library? They both detect it as a Linux system, and not specifically Android, with RuntimeInformation,OSDescription returning the linux kernel version. I'm not able to call any functions in a shared library when built as Release using the following; |
I wonder if something like |
We would still have to handle OperatingSystem.IsAndroid. The only OS, to my knowledge, that you'd run bionic binaries on is Android. |
Android typically means the Android RID with Java interop support, etc. What would you do differently based on knowing this is Bionic? (Right now this feels like no different from whether this is Ubuntu, or Red Hat or Gentoo - they're all Linux but still quite different). You should see Bionic in
How is it failing? Is there a failing stack you could share? |
No stack, the app just crashes |
Did you try running it under a debugger to see if there's a stack at the point of failure? (E.g. File -> Profile or Debug APK in Android Studio, or equivalent). |
Yes. It's an Android project that's consuming the library, and I debug with Android Studio. Simply replacing the debug library with no code change on the kotlin project, and it falls on the first function call to the library. |
The debugger doesn't break, and logcat prints this,
|
There's probably something that is needed for Android Studio to break into the debugger when the SIGSEGV happens. Quick search seems to indicate there's a UI option to enable native debugging. Maybe something along the lines of this? https://stackoverflow.com/questions/28602260/how-to-get-breakpoint-in-ndk-native-code-and-debug-native-code-in-android-studio (Sorry I don't actually have much Android experience myself, but there should be a stack associated with a SIGSEGV - it's an out of range attempt to access memory and there needs to be something that did it). |
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
If Unity decides to use Bionic for Android Apps when switching to NativeAOT, the users will probably expect to see Android being returned. JNI support won't matter there. |
We can deal with that problem once/if Unity runs into it. This is not the only place where Android treatment is debatable today. For example, |
I see you're using the JNI templete NativeAOT-HelloWorldJNI. Please open a discussion at that repo. I'm working on a high level project from this. You're getting the Utf8 Chats from VM but you need to encode them to UTF16 or retrieve directly UTF16 chars from VM. |
On moving to use the windows daily releases, I came across 2 issues that caused build to fail;
|
If you remove -fuse-ld=bfd does it work? |
I don't know how to modify the clang commands, as this was run with just dotnet publish.
Right after this point on a working build, will be the text |
We make some decisions based on the linker flavor and version, so we want to know the linker's name the toolchain is going to use. Detecting which linker is used by a given toolchain (clang or gcc) is quite rough, so we are using this approximate mapping runtime/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets Lines 24 to 25 in cc585f6
I think, in the unlikely event, when this (platform->[default]linker) list becomes large or unmaintainable, we can replace it with the detection but for now™️, lets add the third one for linux-bionic. :) |
Sounds good, thank you! @emmauss if you can confirm |
Setting lld makes it build successfully with ndk 25 |
Thanks for confirming! #88179 should fix this. |
Description
Building a simple Hello World sample works for the linux-bionic-x64 and linux-bionic-arm64 rids, but publishing AOT fails for linux-bionic-arm64, but works for linux-bionic-x64. The following error is thrown immediately when attempting the build,
Reproduction Steps
A simple project with the required nuget packages already referenced here, https://github.com/emmauss/test-aot.
Restore and build it with
dotnet publish -r linux-bionic-arm64 -c Debug -p:SysRoot=/.tools/android-rootfs/android-ndk-r21/sysroot
. The error is immediately thrown.Expected behavior
The project quickly builds and a compatible executable is generated.
Actual behavior
The following error is displayed,
Regression?
No response
Known Workarounds
No response
Configuration
OS: Fedora 38 on WSL2 running on Windows 11 x64 host
.Net Version: 8.0.0-preview.6.23307.4 daily build
Other information
No response
The text was updated successfully, but these errors were encountered: