paul-nameless / tg

terminal telegram client
The Unlicense
938 stars 76 forks source link

Does not work in Termux on Android #116

Closed NowanIlfideme closed 3 years ago

NowanIlfideme commented 4 years ago

For fun I tested it on Android and it couldn't load a DLL due to packaging errors (possibly my own local problems):

$ tg
Enter your phone number in international format (including country code)
phone> +375298625706
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.8/site-packages/tg/main.py", line 47, in main
    tg = Tdlib(
  File "/data/data/com.termux/files/usr/lib/python3.8/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.8/site-packages/telegram/tdjson.py", line 27, in __init__
    self._build_client(library_path, verbosity)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/telegram/tdjson.py", line 36, in _build_client
    self._tdjson = CDLL(library_path)
  File "/data/data/com.termux/files/usr/lib/python3.8/ctypes/__init__.py", line 373, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen failed: "/data/data/com.termux/files/usr/lib/python3.8/site-packages/telegram/lib/linux/libtdjson.so" is for EM_X86_64 (62) instead of EM_AARCH64 (183)
$

This is probably outside of your scope, this is mostly an FYI for folks who are crazy enough to try it. :p

paul-nameless commented 4 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.

matheusfillipe commented 3 years ago

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) (?).

matheusfillipe commented 3 years ago

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
paul-nameless commented 3 years ago

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.

matheusfillipe commented 3 years ago

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.

matheusfillipe commented 3 years ago

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? 😅

paul-nameless commented 3 years ago

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?

matheusfillipe commented 3 years ago

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

MercWith commented 3 years ago

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

paul-nameless commented 3 years ago

Thanks for update!