[tor-commits] [tor-browser-build/master] Bug 25485: Fix libstdc++.so.6 compatibility for Tor Browser

boklm at torproject.org boklm at torproject.org
Wed Aug 8 09:55:46 UTC 2018


commit 6a89049c0d1200302a59f74e71151466ddae5582
Author: Sukhbir Singh <sukhbir at torproject.org>
Date:   Tue Aug 7 10:08:30 2018 -0400

    Bug 25485: Fix libstdc++.so.6 compatibility for Tor Browser
    
    We ship our version of libstdc++.so.6 for backward compatibility of Tor
    Browser on older systems like Ubuntu 16.04. However, a newer version of
    the library may be installed on the user's system and we should detect
    and use that. This commit adds support for detecting the library using a
    C++ program that uses the latest ABI; if the program executes, we should
    use the system library, and if not (for the older systems), we add our
    libstdc++.so.6 to LD_LIBRARY_PATH.
---
 projects/firefox/abicheck.cc                       | 35 ++++++++++++++++++++++
 projects/firefox/build                             |  4 +++
 projects/firefox/config                            |  2 ++
 .../tor-browser/RelativeLink/start-tor-browser     |  7 +++++
 projects/tor/build                                 |  4 ++-
 5 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/projects/firefox/abicheck.cc b/projects/firefox/abicheck.cc
new file mode 100644
index 0000000..cbecafa
--- /dev/null
+++ b/projects/firefox/abicheck.cc
@@ -0,0 +1,35 @@
+/*
+ * Bug 25485: Browser/TorBrowser/Tor/libstdc++.so.6: version `CXXABI_1.3.11' not found
+ * This program is borrowed from
+ * https://en.cppreference.com/w/cpp/error/uncaught_exception and is useful in
+ * determining the latest C++ ABI. Specifically this program requires
+ * `GLIBCXX_3.4.22` which we use to compare the version of the installed
+ * libstdc++.so.6 and the bundled version. If the program executes
+ * successfully, that means we should use the system version of libstdc++.so.6
+ * and if not, that means we should use the bundled version.
+ */
+
+#include <iostream>
+#include <exception>
+#include <stdexcept>
+
+struct Foo {
+    int count = std::uncaught_exceptions();
+    ~Foo() {
+        std::cout << (count == std::uncaught_exceptions()
+            ? "~Foo() called normally\n"
+            : "~Foo() called during stack unwinding\n");
+    }
+};
+
+int main()
+{
+    Foo f;
+    try {
+        Foo f;
+        std::cout << "Exception thrown\n";
+        throw std::runtime_error("test exception");
+    } catch (const std::exception& e) {
+        std::cout << "Exception caught: " << e.what() << '\n';
+    }
+}
diff --git a/projects/firefox/build b/projects/firefox/build
index da1e71b..4dd0945 100644
--- a/projects/firefox/build
+++ b/projects/firefox/build
@@ -237,6 +237,10 @@ ELSE;
 END;
 %]
 
+[% IF c("var/linux") %]
+  /var/tmp/dist/gcc/bin/g++ $rootdir/abicheck.cc -o Browser/abicheck
+[% END %]
+
 [% c('tar', {
         tar_src => [ browserdir ],
         tar_args => '-czf ' _ dest_dir _ '/' _ c('filename') _ '/tor-browser.tar.gz',
diff --git a/projects/firefox/config b/projects/firefox/config
index 3284ed4..02a380d 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -116,3 +116,5 @@ input_files:
   - project: fxc2
     name: fxc2
     enable: '[% c("var/windows") %]'
+  - filename: abicheck.cc
+    enable: '[% c("var/linux") %]'
diff --git a/projects/tor-browser/RelativeLink/start-tor-browser b/projects/tor-browser/RelativeLink/start-tor-browser
index 6639f44..47fbdef 100755
--- a/projects/tor-browser/RelativeLink/start-tor-browser
+++ b/projects/tor-browser/RelativeLink/start-tor-browser
@@ -274,7 +274,14 @@ if [ $SYSARCHITECTURE -ne $TORARCHITECTURE ]; then
 fi
 
 LD_LIBRARY_PATH="${HOME}/TorBrowser/Tor/"
+# Check if the system has a more recent version of libstdc++.so.6; if yes, use
+# that instead of the bundled version.
+./abicheck >/dev/null 2>&1
+if [ $? -ne 0 ]; then
+  LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${HOME}/TorBrowser/Tor/libstdc++/"
+fi
 export LD_LIBRARY_PATH
+
 [% IF ! c("var/release") %]
 export SELFRANDO_write_layout_file=
 [% END %]
diff --git a/projects/tor/build b/projects/tor/build
index 8f129d6..89a5418 100644
--- a/projects/tor/build
+++ b/projects/tor/build
@@ -47,12 +47,14 @@ openssldir=/var/tmp/dist/openssl
   # LD_LIBRARY_PATH value to the Tor Browser with the newer one. Thus, we copy
   # the libstdc++ into the directory with the libs tor depends on, too. See bug
   # 13359 for further details.
-  cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.6 "$distdir/Tor/"
+  mkdir -p "$distdir/Tor/libstdc++"
+  cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.6 "$distdir/Tor/libstdc++/"
   [% IF c("var/asan") -%]
     cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.3 "$distdir/Tor/"
     cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.0 "$distdir/Tor/"
   [% END -%]
   chmod 700 "$distdir"/Tor/*.so*
+  chmod 700 "$distdir"/Tor/libstdc++/*.so*
   # This is needed to make RPATH unavailable. See bug 9150.
   export LD_LIBRARY_PATH="$distdir/Tor/"
 [% END %]



More information about the tor-commits mailing list