Closed NowanIlfideme closed 3 years ago
Thanks for reporting the issue! The problem is in different architectures. You can make it working if you’ll compile tdlib on your phone or find a package for your platform) We definitely would like to support different architectures out of the box but it’s not top priority.
I've been trying to build tdlib on my phone but it ends like this at the step cmake --build . --target prepare_cross_compiling
:
StdStreams.cpp:(.text._ZN2td6detail17BufferedStdinImplC2Ev[_ZN2td6detail17BufferedStdinImplC2Ev]+0x58): undefined reference to `__atomic_fetch_add_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(StdStreams.cpp.o): in function `td::ChainBufferWriter::init(unsigned int)':
StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x3c): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x84): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x164): undefined reference to `__atomic_store_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x174): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x198): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17ChainBufferWriter4initEj]+0x1c8): undefined reference to `__atomic_fetch_add_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::NativeFd::NativeFd(int)':
NativeFd.cpp:(.text._ZN2td8NativeFdC2Ei+0x2c): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::NativeFd::close()':
NativeFd.cpp:(.text._ZN2td8NativeFd5closeEv+0x34): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: NativeFd.cpp:(.text._ZN2td8NativeFd5closeEv+0x1a8): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::NativeFd::release()':
NativeFd.cpp:(.text._ZN2td8NativeFd7releaseEv+0x28): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(ExitGuard.cpp.o): in function `td::ExitGuard::~ExitGuard()':
ExitGuard.cpp:(.text._ZN2td9ExitGuardD2Ev+0x1c): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ExitGuard.cpp:(.text._ZN2td9ExitGuardD2Ev+0x30): undefined reference to `__atomic_exchange_4'
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [td/generate/CMakeFiles/generate_json.dir/build.make:122: td/generate/generate_json] Error 1
make[2]: *** [CMakeFiles/Makefile2:916: td/generate/CMakeFiles/generate_json.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:520: CMakeFiles/prepare_cross_compiling.dir/rule] Error 2
make: *** [Makefile:246: prepare_cross_compiling] Error 2
I ignored that because i not cross compiling anyway? (No idea) then it got stuck at cmake --build . --target install
u0_a159@localhost ~/tmp/td/build master cmake --build . --target install
Scanning dependencies of target tdsqlite
[ 0%] Building C object sqlite/CMakeFiles/tdsqlite.dir/sqlite/sqlite3.c.o
Someone might have a build of tdlib for arm 32 bits that we can use (which is my case), or EM_AARCH64 (183) (?).
I am following as here: https://tdlib.github.io/td/build.html?language=Python
After quite a while cmake --build . --target install
started producing output but I only got as far as 56% and the process got killed (?). I think I should really cross compile it instead :P
[ 54%] Building CXX object CMakeFiles/tdcore.dir/td/telegram/MessageId.cpp.o
[ 56%] Building CXX object CMakeFiles/tdcore.dir/td/telegram/MessageReplyInfo.cpp.o
[ 56%] Building CXX object CMakeFiles/tdcore.dir/td/telegram/MessagesDb.cpp.o
[ 56%] Building CXX object CMakeFiles/tdcore.dir/td/telegram/MessageSearchFilter.cpp.o
[ 56%] Building CXX object CMakeFiles/tdcore.dir/td/telegram/MessagesManager.cpp.o
make[2]: *** [CMakeFiles/tdcore.dir/build.make:1213: CMakeFiles/tdcore.dir/td/telegram/MessagesManager.cpp.o] Killed
make[1]: *** [CMakeFiles/Makefile2:546: CMakeFiles/tdcore.dir/all] Error 2
make: *** [Makefile:160: all] Error 2
Did you choose a checkbox?
I have less than 3.5 GB of RAM. Now you will need only 1 GB of RAM to build TDLib.
Did you choose a checkbox?
I have less than 3.5 GB of RAM. Now you will need only 1 GB of RAM to build TDLib.
Yes I did as:
git clone https://github.com/tdlib/td.git
cd td
rm -rf build
mkdir build
cd build
CXXFLAGS="-stdlib=libc++" CC=$(which clang) CXX=$(which clang++) cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../tdlib ..
cmake --build . --target prepare_cross_compiling
cd ..
php SplitSource.php
cd build
cmake --build . --target install
cd ..
php SplitSource.php --undo
cd ..
ls -l td/tdlib
And I made sure I had at least 500mb of ram free (I had more than 1 gb all the time). Now the result was at cmake --build . --target install
:
[ 76%] Linking CXX static library libtdclient.a
[ 76%] Built target tdclient
[ 77%] Built target memprof
[ 77%] Linking CXX executable generate_json
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(logging.cpp.o): in function `td::Log
ger::Logger(td::LogInterface&, td::LogOptions const&, int, td::Slice, int, td::Slice)':
logging.cpp:(.text._ZN2td6LoggerC2ERNS_12LogInterfaceERKNS_10LogOptionsEiNS_5SliceEiS6_+0x90): undefined reference to `__atom
ic_load_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(logging.cpp.o): in function `td::Log
ger::~Logger()':
logging.cpp:(.text._ZN2td6LoggerD2Ev+0x1c): undefined reference to `__atomic_load_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(logging.cpp.o): in function `td::TsC
err::TsCerr()':
logging.cpp:(.text._ZN2td6TsCerrC2Ev+0x28): undefined reference to `__atomic_exchange_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: logging.cpp:(.text._ZN2td6TsCerrC2Ev+0x3c): undefined reference
to `__atomic_load_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(logging.cpp.o): in function `td::TsC
err::enterCritical()':
logging.cpp:(.text._ZN2td6TsCerr13enterCriticalEv+0x24): undefined reference to `__atomic_exchange_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: logging.cpp:(.text._ZN2td6TsCerr13enterCriticalEv+0x38): undefi
ned reference to `__atomic_load_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(logging.cpp.o): in function `td::TsC
err::~TsCerr()':
(...)
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initE[174/2867]
ChainBufferWriter4initEj]+0x84): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17
ChainBufferWriter4initEj]+0x164): undefined reference to `__atomic_store_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17
ChainBufferWriter4initEj]+0x174): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17
ChainBufferWriter4initEj]+0x198): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: StdStreams.cpp:(.text._ZN2td17ChainBufferWriter4initEj[_ZN2td17
ChainBufferWriter4initEj]+0x1c8): undefined reference to `__atomic_fetch_add_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::Na
tiveFd::NativeFd(int)':
NativeFd.cpp:(.text._ZN2td8NativeFdC2Ei+0x2c): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::Na
tiveFd::close()':
NativeFd.cpp:(.text._ZN2td8NativeFd5closeEv+0x34): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: NativeFd.cpp:(.text._ZN2td8NativeFd5closeEv+0x1a8): undefined r
eference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(NativeFd.cpp.o): in function `td::Na
tiveFd::release()':
NativeFd.cpp:(.text._ZN2td8NativeFd7releaseEv+0x28): undefined reference to `__atomic_load_4'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ../../tdutils/libtdutils.a(ExitGuard.cpp.o): in function `td::E
xitGuard::~ExitGuard()':
ExitGuard.cpp:(.text._ZN2td9ExitGuardD2Ev+0x1c): undefined reference to `__atomic_store_1'
/data/data/com.termux/files/usr/bin/arm-linux-androideabi-ld: ExitGuard.cpp:(.text._ZN2td9ExitGuardD2Ev+0x30): undefined refe
rence to `__atomic_exchange_4'
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [td/generate/CMakeFiles/generate_json.dir/build.make:122: td/generate/generate_json] Error 1
make[1]: *** [CMakeFiles/Makefile2:916: td/generate/CMakeFiles/generate_json.dir/all] Error 2
make: *** [Makefile:160: all] Error 2
I am compiling with clang and gcc/g++ is not avaiable for termux. I am thinking on trying to compile this on a emulator.
Alpine linux has a build: https://dl-cdn.alpinelinux.org/alpine/edge/testing/armv7/telegram-tdlib-1.6.0-r1.apk
Added it to my config:
│ File: .config/tg/conf.py
───────────────────────────────────────
1 │ PHONE = '+****************'
2 │ TDLIB_PATH = "/data/data/com.termux/files/home/lib/libtdjson.so.1.6.0"
───────┴───────────────────────────────────
u0_a159@localhost ~ ldd lib/libtdjson.so.1.6.0
libssl.so.1.1
libcrypto.so.1.1
libz.so.1
libstdc++.so.6
libgcc_s.so.1
libc.musl-armv7.so.1
u0_a159@localhost ~ for i in $(ldd lib/libtdjson.so.1.6.0)
do
locate $i
done
/data/data/com.termux/files/usr/lib/libssl.so.1.1
/data/data/com.termux/files/usr/lib/libcrypto.so.1.1
/data/data/com.termux/files/usr/lib/libz.so.1
/data/data/com.termux/files/usr/lib/libz.so.1.2.11
✘ u0_a159@localhost ~ tg
Traceback (most recent call last):
File "/data/data/com.termux/files/usr/bin/tg", line 8, in <module>
sys.exit(main())
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/tg/__main__.py", line 48, in main
tg = Tdlib(
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/client.py", line 113, in __init__
self._tdjson = TDJson(library_path=library_path, verbosity=tdlib_verbosity)
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/tdjson.py", line 27, in __init__
self._build_client(library_path, verbosity)
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/tdjson.py", line 36, in _build_client
self._tdjson = CDLL(library_path)
File "/data/data/com.termux/files/usr/lib/python3.9/ctypes/__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen failed: library "libssl.so.1.1" not found
✘ u0_a159@localhost ~
Didn't expect this to work but shouldn't at least libssl should be found? 😅
Wow friend, you moved so far, that's awesome)
Maybe try to debug it with strace? Try to find out where is it looking for libraries. Maybe setting LD_LIBRARY_PATH can help?
Okay setting LD_LIBRARY_PATH really helped and made it see the libs. Now the problem is the missing libraries. Maybe somewhere there could be a static built tdlib for armv7? So what I did so far was digging around specially on the alpine repos for arm versions of those i didn't find on termux repositories:
FROM:
✘ u0_a159@localhost ~ ldd lib/libtdjson.so.1.6.0
libssl.so.1.1
libcrypto.so.1.1
libz.so.1
libstdc++.so.6
libgcc_s.so.1
libc.musl-armv7.so.1
I ddin't find on termux these:
libstdc++.so.6
libgcc_s.so.1
libc.musl-armv7.so.1
So after digging I found what should be armv7 replacement for those. This is my lib folder: lib.zip
The problem now is:
✘ u0_a159@localhost ~ export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib/:lib/:/system/lib/
u0_a159@localhost ~ strace -o strace.txt tg
Traceback (most recent call last):
File "/data/data/com.termux/files/usr/bin/tg", line 8, in <module>
sys.exit(main())
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/tg/__main__.py", line 48, in main
tg = Tdlib(
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/client.py", line 113, in __init__
self._tdjson = TDJson(library_path=library_path, verbosity=tdlib_verbosity)
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/tdjson.py", line 27, in __init__
self._build_client(library_path, verbosity)
File "/data/data/com.termux/files/usr/lib/python3.9/site-packages/telegram/tdjson.py", line 36, in _build_client
self._tdjson = CDLL(library_path)
File "/data/data/com.termux/files/usr/lib/python3.9/ctypes/__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen failed: cannot locate symbol "_ZNSt19_Sp_make_shared_tag5_S_eqERKSt9type_info" referenced by "/data/data/com.termux/files/home/lib/libtdjson.so.1.6.0"...
And this is the strace: strace.txt
Was just looking at this,and seems like there's tdlib package in the termux repo,so after using that as the binary it works
pkg install unstable-repo
apt install libtd
Then edit the config in /data/data/com.termux/files/home/.config/tg with the tdib path TDLIB_PATH = "/data/data/com.termux/files/usr/lib/libtdjson.so"
And after that it seems to work fine,I guess this issue can be closed now
Thanks for update!
For fun I tested it on Android and it couldn't load a DLL due to packaging errors (possibly my own local problems):
This is probably outside of your scope, this is mostly an FYI for folks who are crazy enough to try it. :p