Π·Π΅ΡΠΊΠ°Π»ΠΎ ΠΈΠ· https://github.com/mozilla/gecko-dev.git
Bug 1464084 - Don't export std:π§΅:_M_start_thread symbols with --enable-stdcxx-compat. r=froydnj
This relies on the fact that providing multiple --version-script
combines them all, so we effectively create a new symbol version
that has no global symbol, but hides the std:π§΅:_M_start_thread
symbols.
This version script trick happens to work with BFD ld, gold, and lld.
The downside is that when providing multiple --version-script's, ld
doesn't want any of them to have no version at all. So for the libraries
that do already have a version script (through SYMBOLS_FILE), we use a
version where there used to be none, using the library name as the
version. Practically speaking, this binds the libraries a little closer
than they used to be, kind of non-flat namespace on OSX (which is the
default there), meaning the dynamic linker will actively want to use
symbols from those libraries instead of a system library that might
happen to have the same symbol name.
--HG--
extra : rebase_source : a7f672c35609d993849385ddb874ba791b34f929
This commit is contained in:
Π ΠΎΠ΄ΠΈΡΠ΅Π»Ρ
fec7fec568
ΠΠΎΠΌΠΌΠΈΡ
5c6ce84a4c
|
@ -0,0 +1,5 @@
|
|||
hidden {
|
||||
local:
|
||||
# std::thread::_M_start_thread(...)
|
||||
_ZNSt6thread15_M_start_thread*;
|
||||
};
|
|
@ -23,3 +23,5 @@ COMPILE_FLAGS['CLANG_PLUGIN'] = []
|
|||
|
||||
DEFINES['MOZ_LIBSTDCXX_VERSION'] = CONFIG['MOZ_LIBSTDCXX_TARGET_VERSION']
|
||||
HOST_DEFINES['MOZ_LIBSTDCXX_VERSION'] = CONFIG['MOZ_LIBSTDCXX_HOST_VERSION']
|
||||
|
||||
OS_LIBS += ['-Wl,--version-script,%s/hide_std.ld' % SRCDIR]
|
||||
|
|
|
@ -42,6 +42,8 @@ def generate_symbols_file(output, *args):
|
|||
|
||||
symbols = [s.strip() for s in pp.out.getvalue().splitlines() if s.strip()]
|
||||
|
||||
libname, ext = os.path.splitext(os.path.basename(output.name))
|
||||
|
||||
if buildconfig.substs['OS_TARGET'] == 'WINNT':
|
||||
# A def file is generated for MSVC link.exe that looks like the
|
||||
# following:
|
||||
|
@ -66,14 +68,13 @@ def generate_symbols_file(output, *args):
|
|||
# those platforms, and to DATA on Windows, so that the "DATA" part
|
||||
# is, in fact, part of the symbol name as far as the symbols variable
|
||||
# is concerned.
|
||||
libname, ext = os.path.splitext(os.path.basename(output.name))
|
||||
assert ext == '.def'
|
||||
output.write('LIBRARY %s\nEXPORTS\n %s\n'
|
||||
% (libname, '\n '.join(symbols)))
|
||||
elif buildconfig.substs['GCC_USE_GNU_LD']:
|
||||
# A linker version script is generated for GNU LD that looks like the
|
||||
# following:
|
||||
# {
|
||||
# liblibrary.so {
|
||||
# global:
|
||||
# symbol1;
|
||||
# symbol2;
|
||||
|
@ -81,8 +82,8 @@ def generate_symbols_file(output, *args):
|
|||
# local:
|
||||
# *;
|
||||
# };
|
||||
output.write('{\nglobal:\n %s;\nlocal:\n *;\n};'
|
||||
% ';\n '.join(symbols))
|
||||
output.write('%s {\nglobal:\n %s;\nlocal:\n *;\n};'
|
||||
% (libname, ';\n '.join(symbols)))
|
||||
elif buildconfig.substs['OS_TARGET'] == 'Darwin':
|
||||
# A list of symbols is generated for Apple ld that simply lists all
|
||||
# symbols, with an underscore prefix.
|
||||
|
|
|
@ -43,7 +43,6 @@ skip-if = os == 'android' # Bug 1147630
|
|||
[TestSaturate]
|
||||
[TestSplayTree]
|
||||
[TestSPSCQueue]
|
||||
skip-if = os == 'linux' # Bug 1464084
|
||||
[TestSyncRunnable]
|
||||
[TestTemplateLib]
|
||||
[TestTuple]
|
||||
|
|
ΠΠ°Π³ΡΡΠ·ΠΊΠ°β¦
Π‘ΡΡΠ»ΠΊΠ° Π² Π½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅