Repository navigation
Cross Compile for Android and issues with PyExc_OSError #111225
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Oct 23, 2023 - addedbuildThe build process and cross-buildThe build process and cross-build
on Oct 24, 2023 I'm not sure if this is useful, but I did find this in the Android NDK 26 notes
Issue 360: thread_local variables with non-trivial destructors will cause segfaults if the containing library is dlcloseed. This was fixed in API 28, but code running on devices older than API 28 will need a workaround. The simplest fix is to stop calling dlclose. If you absolutely must continue calling dlclose, see the following table:
Issue 360: thread_local variables with non-trivial destructors will cause segfaults if the containing library is dlcloseed
That doesn't seem relevant, because you're not seeing a segfault.
More likely, _socket.cpython-3.12.so has not been linked against libpython3.12.so. You can check this using
readelf -d.@mhsmith, based on your comment, can we close this issue as not-planned?
- addedpendingThe issue will be closed if no feedback is providedThe issue will be closed if no feedback is provided
on Jan 16, 2024 I've just remembered, I also encountered this problem when building Python 3.12 for Chaquopy. I was able to fix it with this patch, which I'll turn into a pull request in the near future.
Reacted by Brian Spratke- removedpendingThe issue will be closed if no feedback is providedThe issue will be closed if no feedback is provided
on Jan 18, 2024 @mhsmith - Thanks for the update. I have tried your patch as is. Something is still different because it's looking for python3.12.so instead of libpython3.12.so.
I'm playing with your patch file, I'm not an expert but looking at it and trying to figure out what my build needs for some of your changes.
/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang -shared -L/python3-android/src/Python-3.12.1/Android/sysroot/usr/lib -pie Modules/arraymodule.o -lpython3.12 -o Modules/array.cpython-312.so
clang-17: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]
ld.lld: error: unable to find library -lpython3.12It doesn't say it's looking for python3.12.so, it says it's looking for
-lpython3.12, which on Android, just like Linux, should be transformed into libpython3.12.so.The issue is probably that this file doesn't exist in any of the
-Ldirectories on your command line. In particular, I see that the command line doesn't contain-L., even though that should have been assigned to BLDLIBRARY here whenac_sys_system=Linux-android:Lines 7500 to 7502 in 2305ca5
Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*) LDLIBRARY='libpython$(LDVERSION).so' BLDLIBRARY='-L. -lpython$(LDVERSION)' Are you sure you applied the whole patch?
I am pretty confident that I applied the entire patch. What I'm not sure is how I can tell if ac_sys_system is being set right. Is there a log or anything I could put into the configure? I tried using an echo and a printf, but not having any luck.
In looking at this more, and doing a before and after, I can see that it is trying to apply the patch, I don't see errors, but the configure patch is not being applied. I will look into this and make sure the patch is being applied. Sorry about that.
I haven't looked at your build process, but maybe you're regenerating the configure script from the configure.ac file after applying the patch.
You are correct. I didn't realize the script I was using was doing an auto reconfigure, and I was applying the patch before this. Once I applied the patch in the proper place, things worked as expected.
I truly appreciate your help and time looking into this with me.
That's great, but please reopen the issue, because the original bug still exists in an unpatched version of Python.
It's been a while, trying to build against 3.12.4, is this patch still needed?
It's still needed on Python 3.12 and older, but it won't be needed in Python 3.13.
Perfect, I figured as much but wanted to be sure. I appreciate it.

Bug report
Bug description:
In trying to run Python 3.12 on Android. I have been cross-compiling Python for a number of years. Having built a 64bit version I am getting the following error when I try to run
I get the following error at runtime.
ImportError('dlopen failed: cannot locate symbol "PyExc_OSError" referenced by "/data/data/com.myapp/files/Python64/lib-dynload/_socket.cpython-312.so"...')
I have verified that the _socket.cpython-3.12.so exists. I'm not really sure what other info would be beneficial for people to help me understand this error so I will start with this and happily add more details if requested.
CPython versions tested on:
3.12
Operating systems tested on:
Other
Linked PRs