tdlib / td

Cross-platform library for building Telegram clients
https://core.telegram.org/tdlib
Boost Software License 1.0
7.1k stars 1.44k forks source link

New JSON interface with ffi-napi returns an error: symbol not found #1261

Closed esindger closed 4 years ago

esindger commented 4 years ago

I cloned the last version (1.6.9) of TDLib, built it and trying to describe new JSON interface like this:

const client = ffi.Library(
      PATH_TO_LIBRARY_FILE,
      {
        td_create_client: ['int', []],
        td_send: ['void', ['int', 'string']],
        td_receive: ['string', ['double']],
        td_execute: ['string', ['string']]
      }
)

and I got an error:

Error: Dynamic Symbol Retrieval Error: dlsym(0x1044295f0, td_create_client): symbol not found
    at DynamicLibrary.get (/path/to/project/node_modules/ffi-napi/lib/dynamic_library.js:112:11)
    at /path/to/project/node_modules/ffi-napi/lib/library.js:50:21
    at Array.forEach (<anonymous>)
    at Object.Library (/path/to/project/node_modules/ffi-napi/lib/library.js:47:28)
    at new TdProxy (/path/to/project/packages/airgram/src/components/TdProxy.ts:59:23)
    at Object.exports.createProviderFactory (/path/to/project/packages/airgram/src/utils/provider.ts:6:70)
    at new Airgram (/path/to/project/packages/airgram/src/Airgram.ts:19:13)
    at /path/to/project/packages/airgram/dev/index.ts:12:21
    at step (/path/to/project/packages/airgram/dev/index.ts:34:23)
    at Object.next (/path/to/project/packages/airgram/dev/index.ts:15:53)

Do I miss something?

levlam commented 4 years ago

Everything looks correct. I expect that the shared library isn't for the latest TDLib version.

esindger commented 4 years ago

I checked the folder double. This is the latest TDLib version.

levlam commented 4 years ago

The methods are defined in the same file as other TDLib JSON methods in exactly the same way. I tested them from the C++ JSON example, so I have no other ideas. Could you check that the symbols are present in the shared library using a tool like nm?

esindger commented 4 years ago

I found _td_create_client only in libtdjson_static.a but not in libtdjson.1.6.9.dylib.

Output:

$ nm /td-1.6.9/build/libtdjson.1.6.9.dylib

``` U _BIO_clear_flags U _BIO_free U _BIO_get_data U _BIO_get_new_index U _BIO_meth_new U _BIO_meth_set_create U _BIO_meth_set_ctrl U _BIO_meth_set_destroy U _BIO_meth_set_read U _BIO_meth_set_write U _BIO_new U _BIO_new_mem_buf U _BIO_set_data U _BIO_set_flags U _BIO_set_init U _BIO_vfree U _BN_CTX_free U _BN_CTX_new U _BN_add U _BN_add_word U _BN_bin2bn U _BN_bn2bin U _BN_bn2dec U _BN_bn2lebinpad U _BN_clear_free U _BN_cmp U _BN_copy U _BN_dec2bn U _BN_div U _BN_div_word U _BN_dup U _BN_gcd U _BN_hex2bn U _BN_is_bit_set U _BN_is_prime_ex U _BN_mod_add U _BN_mod_exp U _BN_mod_inverse U _BN_mod_mul U _BN_mod_sub U _BN_mod_word U _BN_mul U _BN_new U _BN_num_bits U _BN_rand U _BN_set_bit U _BN_set_word U _BN_sub U _BN_sub_word U _CRYPTO_free U _ERR_error_string_n U _ERR_get_error U _ERR_peek_error U _EVP_CIPHER_CTX_free U _EVP_CIPHER_CTX_new U _EVP_CIPHER_CTX_set_padding U _EVP_CIPHER_block_size U _EVP_CIPHER_iv_length U _EVP_CIPHER_key_length U _EVP_CIPHER_nid U _EVP_CipherFinal_ex U _EVP_CipherInit_ex U _EVP_CipherUpdate U _EVP_DecryptUpdate U _EVP_EncryptUpdate U _EVP_MD_size U _EVP_PKEY_CTX_free U _EVP_PKEY_CTX_new U _EVP_PKEY_base_id U _EVP_PKEY_encrypt U _EVP_PKEY_encrypt_init U _EVP_PKEY_free U _EVP_aes_256_cbc U _EVP_aes_256_ctr U _EVP_aes_256_ecb U _EVP_get_cipherbyname U _EVP_sha1 U _EVP_sha256 U _EVP_sha512 U _HMAC U _HMAC_CTX_free U _HMAC_CTX_new U _HMAC_Final U _HMAC_Init_ex U _HMAC_Update U _MD5 U _OBJ_nid2sn U _OPENSSL_cleanse U _OPENSSL_init_crypto U _OPENSSL_init_ssl U _PEM_read_bio_PUBKEY U _PEM_read_bio_RSAPublicKey U _PKCS5_PBKDF2_HMAC U _RAND_add U _RAND_bytes U _RSA_free U _RSA_get0_key U _RSA_pkey_ctx_ctrl U _RSA_size U _SHA1 U _SHA256 U _SHA256_Final U _SHA256_Init U _SHA256_Update U _SHA512 U _SSL_CTX_ctrl U _SSL_CTX_free U _SSL_CTX_load_verify_locations U _SSL_CTX_new U _SSL_CTX_set_cipher_list U _SSL_CTX_set_default_verify_paths U _SSL_CTX_set_options U _SSL_CTX_set_verify U _SSL_CTX_set_verify_depth U _SSL_ctrl U _SSL_free U _SSL_get0_param U _SSL_get_error U _SSL_is_init_finished U _SSL_new U _SSL_read U _SSL_set_bio U _SSL_set_connect_state U _SSL_set_quiet_shutdown U _SSL_shutdown U _SSL_write U _TLS_client_method U _X509_NAME_oneline U _X509_STORE_CTX_get_current_cert U _X509_STORE_CTX_get_error U _X509_STORE_CTX_get_error_depth U _X509_VERIFY_PARAM_set1_host U _X509_VERIFY_PARAM_set1_ip_asc U _X509_VERIFY_PARAM_set_hostflags U _X509_get_subject_name U _X509_verify_cert_error_string U __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcm U __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5rfindEcm U __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm U __ZNKSt3__119__shared_weak_count13__get_deleterERKSt9type_info U __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv U __ZNKSt3__120__vector_base_commonILb1EE20__throw_out_of_rangeEv U __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv U __ZNKSt3__18ios_base6getlocEv U __ZNSt3__112__next_primeEm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5eraseEmm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEmc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKcm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_mm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEEc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEmPKc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEmmmmmm U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_ U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_mmRKS4_ U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5_ U __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEc U __ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4readEPcl U __ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev U __ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev U __ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERd U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5writeEPKcl U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev U __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd U __ZNSt3__113random_deviceC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE U __ZNSt3__113random_deviceD1Ev U __ZNSt3__113random_deviceclEv U __ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev U __ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev U __ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev U __ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev U __ZNSt3__119__shared_weak_count14__release_weakEv U __ZNSt3__119__shared_weak_count4lockEv U __ZNSt3__119__shared_weak_countD2Ev U __ZNSt3__15mutex4lockEv U __ZNSt3__15mutex6unlockEv U __ZNSt3__15mutexD1Ev U __ZNSt3__16__sortIRNS_6__lessIiiEEPiEEvT0_S5_T_ U __ZNSt3__16__sortIRNS_6__lessIxxEEPxEEvT0_S5_T_ U __ZNSt3__16chrono12steady_clock3nowEv U __ZNSt3__16chrono12system_clock3nowEv U __ZNSt3__16locale7classicEv U __ZNSt3__16localeC1ERKS0_ U __ZNSt3__16localeD1Ev U __ZNSt3__16localeaSERKS0_ U __ZNSt3__18ios_base4initEPv U __ZNSt3__18ios_base5clearEj U __ZNSt3__18ios_base5imbueERKNS_6localeE U __ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev U __ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ U __ZSt7nothrow U __ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev U __ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev U __ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev U __ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev U __ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev U __ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev U __ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev U __ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev U __ZdaPv U __ZdlPv U __Znam U __Znwm U __ZnwmRKSt9nothrow_t U ____chkstk_darwin U ___bzero U ___cxa_atexit U ___cxa_guard_acquire U ___cxa_guard_release U ___cxa_pure_virtual U ___error U ___memcpy_chk U ___memset_chk U ___sincos_stret U ___stack_chk_fail U ___stack_chk_guard U ___stderrp U ___stdoutp U ___strlcat_chk U ___strlcpy_chk U __tlv_bootstrap U _abort U _access U _atan U _atoi U _close U _closedir U _confstr U _connect U _crc32 U _deflate U _deflateEnd U _deflateInit2_ U _dup2 U _exp U _fchmod U _fchown U _fcntl U _fdopendir$INODE64 U _flock U _fopen U _fprintf U _freeaddrinfo U _fsctl U _fstat$INODE64 U _fstatfs$INODE64 U _fsync U _ftruncate U _futimes U _gai_strerror U _getaddrinfo U _getcwd U _getenv U _geteuid U _gethostuuid U _getpeername U _getpid U _getsockname U _getsockopt U _gettimeofday U _gmtime U _inet_addr U _inet_ntop U _inet_pton U _inflate U _inflateEnd U _inflateInit2_ U _kevent U _kqueue U _localtime U _log U _lseek U _lstat$INODE64 U _malloc_create_zone U _malloc_default_zone U _malloc_set_zone_name U _malloc_size U _malloc_zone_free U _malloc_zone_malloc U _malloc_zone_realloc U _memchr U _memcmp U _memcpy U _memmove U _memset U _memset_pattern16 U _mkdir U _mkdtemp U _mlock U _mmap U _munlock U _munmap U _open U _opendir$INODE64 U _poll U _pread U _pthread_create U _pthread_join U _pthread_mutex_destroy U _pthread_mutex_init U _pthread_mutex_lock U _pthread_mutex_trylock U _pthread_mutex_unlock U _pthread_mutexattr_destroy U _pthread_mutexattr_init U _pthread_mutexattr_settype U _pthread_rwlock_destroy U _pthread_rwlock_init U _pthread_rwlock_rdlock U _pthread_rwlock_unlock U _pthread_rwlock_wrlock U _pwrite U _random U _read U _readdir$INODE64 U _readlink U _realpath$DARWIN_EXTSN U _rename U _rmdir U _sched_yield U _setsockopt U _sin U _snprintf U _socket U _socketpair U _srandomdev U _stat$INODE64 U _statfs$INODE64 U _strcmp U _strcspn U _strerror_r U _strlen U _strncmp U _strrchr U _strstr U _sysconf U _sysctlbyname U _tan 00000000000023f0 T _td_json_client_create 00000000000024b0 T _td_json_client_destroy 0000000000002580 T _td_json_client_execute 0000000000002570 T _td_json_client_receive 0000000000002530 T _td_json_client_send 00000000000026a0 T _td_set_log_fatal_error_callback 00000000000025b0 T _td_set_log_file_path 0000000000002680 T _td_set_log_max_file_size 0000000000002690 T _td_set_log_verbosity_level U _time U _unlink U _usleep U _utimes U _write U _writev U dyld_stub_binder ```

$ nm /td-1.6.9/build/libtdjson_static.a

``` /td-1.6.9/build/libtdjson_static.a(td_json_client.cpp.o): U __ZN2td10ClientJson4sendENS_5SliceE U __ZN2td10ClientJson7executeENS_5SliceE U __ZN2td10ClientJson7receiveEd U __ZN2td12td_json_sendEiNS_5SliceE U __ZN2td15td_json_executeENS_5SliceE U __ZN2td15td_json_receiveEd U __ZN2td21td_json_create_clientEv U __ZN2td6ClientC1Ev U __ZN2td6ClientD1Ev U __ZNSt3__15mutexD1Ev U __ZdlPv U __Znwm U _strlen 00000000000001c0 T _td_create_client 0000000000000220 T _td_execute 0000000000000000 T _td_json_client_create 00000000000000c0 T _td_json_client_destroy 0000000000000190 T _td_json_client_execute 0000000000000180 T _td_json_client_receive 0000000000000140 T _td_json_client_send 0000000000000210 T _td_receive 00000000000001d0 T _td_send /td-1.6.9/build/libtdjson_static.a(td_log.cpp.o): U __ZN2td3Log13set_file_pathENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE U __ZN2td3Log17set_max_file_sizeEx U __ZN2td3Log19set_verbosity_levelEi U __ZN2td3Log24set_fatal_error_callbackEPFvPKcE U __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv U __ZdlPv U __Znwm U _memcpy U _strlen 00000000000000f0 T _td_set_log_fatal_error_callback 0000000000000000 T _td_set_log_file_path 00000000000000d0 T _td_set_log_max_file_size 00000000000000e0 T _td_set_log_verbosity_level ```

levlam commented 4 years ago

Thanks! Now it make sense.

levlam commented 4 years ago

I pushed fix for macOS dylib.

esindger commented 4 years ago

It works now. Thank you!