Building the Telegram Database Library with latest-upstream

39 views
Skip to first unread message

Dylan Staley

unread,
Jul 26, 2019, 1:08:13 PM7/26/19
to emscripten-discuss
Hello again! I just wanted to drop a note detailing my experiences building Telegram's Database Library (https://github.com/tdlib/td) with the new WASM backend. Overall the experience was a bit rough, mainly due to errors that did not occur using fastcomp, primarily the new strict pthreads checking and lack of support for Position Independent Code.

To get TdLib building, I had to make the following changes:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ec8c456..96736d4f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,7 +36,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" "${CMAKE_MODULE_PATH}"
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
 
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+# set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
 enable_testing()
 
@@ -98,8 +98,8 @@ if (EMSCRIPTEN)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s WASM=0 -Wno-almost-asm")
   else()
     set(TD_EMSCRIPTEN td_wasm)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1")
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s WASM=1")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s WASM=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0")
   endif()
 endif()
 
diff --git a/example/web/build-openssl.sh b/example/web/build-openssl.sh
index faf4f657..0031bef8 100755
--- a/example/web/build-openssl.sh
+++ b/example/web/build-openssl.sh
@@ -12,7 +12,7 @@ echo "Unpacking OpenSSL sources..."
 tar xzf $OPENSSL.tar.gz || exit 1
 cd openssl-$OPENSSL
 
-emconfigure ./Configure linux-generic32 no-shared no-dso no-engine no-unit-test no-ui || exit 1
+emconfigure ./Configure linux-generic32 no-threads no-pic no-asm no-shared no-dso no-engine no-unit-test no-ui || exit 1
 sed -i.bak 's/CROSS_COMPILE=.*/CROSS_COMPILE=/g' Makefile || exit 1
 sed -i.bak 's/-ldl //g' Makefile || exit 1
 echo "Building OpenSSL..."

These changes disabled threading and PIC when building OpenSSL, and also disabled the error on undefined symbols. The latter change was necessary as I was running into "error: undefined symbol: __cxa_uncaught_exception".

Once those changes were made, I was able to successfully compile TdLib to WASM! Sadly I didn't see any significant size changes: the original fastcomp WASM module was 7.7 MB, and the new module was 7.5 MB. While the module seems to load and perform some actions correctly, the WebSocket connections are closed before a connection is established, so I wasn't able to make any calls to the Telegram API. I'm not a C++ developer, so I probably can't debug that particular issue and will have to wait for the Telegram developers to take a look.

I just wanted to share my experiences trying to compile a non-trivial WASM library with the new upstream backend. The only suggestions I can make are to add warnings to the fastcomp compiler for things that won't be supported in the new backend, such as linking a library built with threads support with a library that doesn't support it.

Alon Zakai

unread,
Jul 29, 2019, 6:54:07 PM7/29/19
to emscripte...@googlegroups.com
Thanks Dylan!

The __cxa_uncaught_exception issue sounds like an unknown bug - can you please file an issue with a testcase?

I agree we should add more docs on the differences between the backends, good idea! I opened https://github.com/emscripten-core/emscripten/pull/9119

- Alon


--
You received this message because you are subscribed to the Google Groups "emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-disc...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/bcd7836d-555a-4a68-aeb5-8f7c07510877%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages