Darwin fix libstdc++ build warnings.
authorIain Sandoe <iain@sandoe.co.uk>
Thu, 6 Dec 2018 19:42:21 +0000 (19:42 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Thu, 6 Dec 2018 19:42:21 +0000 (19:42 +0000)
GCC does not export construction vtable symbols from shared libraries.

The symbols are marked hidden in the objects; for Darwin that makes
them also external (“private_extern” is Darwin’s hidden) which means
that they show up in the list of possible symbols for export from
libstdc++, and there are sufficiently relaxed match conditions that
they reach the exports list.   When Darwin’s static linker encounters
them it generates a warning that they cannot be exported.  This patch
prunes them from the list of symbols to be considered, thus
eliminating the warnings. No functional Change inended to the library
exports.

2018-12-06  Iain Sandoe  <iain@sandoe.co.uk>

* scripts/make_exports.pl (check names): Don’t try to export
construction vtable symbols.

From-SVN: r266864

libstdc++-v3/ChangeLog
libstdc++-v3/scripts/make_exports.pl

index 72feab11d9dc0cd6f7ac911db060ba13f749b009..c29ae157db943b227db2c527c17056e2e3ec7a13 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-06  Iain Sandoe  <iain@sandoe.co.uk>
+
+       * scripts/make_exports.pl (check names): Don’t try to export
+       construction vtable symbols.
+
 2018-12-06  Jonathan Wakely  <jwakely@redhat.com>
            Iain Sandoe  <iain@sandoe.co.uk>
 
index 7c9e4e31d4f878d2afec23f8abc273cc6f9af14f..93100e17ddfc713508e0145dfe883703ce01e236 100644 (file)
@@ -103,6 +103,14 @@ NAME: while (<NM>) {
     # Ignore undefined and local symbols.
     next if (/^([^ ]+) [Ua-z] /);
 
+    # GCC does not export construction vtables from shared libraries.
+    # However the symbols are marked hidden, for Darwin that makes them
+    # also external "private_extern", which means that they show up in
+    # this list.  When ld64 encounters them it generates a warning that
+    # they cannot be exported, so trim them from the set now.
+    next if (/^construction vtable.*$/);
+    next if (/^__ZTC.*$/);
+
     # $sym is the name of the symbol, $noeh_sym is the same thing with
     # any '.eh' suffix removed.
     die "unknown nm output $_" if (! /^([^ ]+) [A-Z] /);