From 1bb5d53b5ade7aa592e48a9804d48455d0f88952 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Fri, 9 Aug 2019 15:59:21 -0700 Subject: [PATCH] linkers: Add SolarisDynamicLinker A dynamic linker for solaris/opensolaris. This is still completely untested and probably doesn't work. --- mesonbuild/linkers.py | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py index dfb30b3cd..3bc7f8932 100644 --- a/mesonbuild/linkers.py +++ b/mesonbuild/linkers.py @@ -822,3 +822,49 @@ class XilinkDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker): def __init__(self, for_machine: mesonlib.MachineChoice, *, version: str = 'unknown version'): super().__init__(['xilink.exe'], for_machine, 'xilink', version=version) + + +class SolarisDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker): + + """Sys-V derived linker used on Solaris and OpenSolaris.""" + + def get_link_whole_for(self, args: typing.List[str]) -> typing.List[str]: + if not args: + return args + return ['-Wl,--whole-archive'] + args + ['-Wl,--no-whole-archive'] + + def no_undefined_args(self) -> typing.List[str]: + return ['-z', 'defs'] + + def get_allow_undefined_args(self) -> typing.List[str]: + return ['-z', 'nodefs'] + + def fatal_warnings(self) -> typing.List[str]: + return ['-z', 'fatal-warnings'] + + def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str, + rpath_paths: str, build_rpath: str, + install_rpath: str) -> typing.List[str]: + if not rpath_paths and not install_rpath and not build_rpath: + return [] + processed_rpaths = prepare_rpaths(rpath_paths, build_dir, from_dir) + all_paths = mesonlib.OrderedSet([os.path.join('$ORIGIN', p) for p in processed_rpaths]) + if build_rpath != '': + all_paths.add(build_rpath) + + # In order to avoid relinking for RPATH removal, the binary needs to contain just + # enough space in the ELF header to hold the final installation RPATH. + paths = ':'.join(all_paths) + if len(paths) < len(install_rpath): + padding = 'X' * (len(install_rpath) - len(paths)) + if not paths: + paths = padding + else: + paths = paths + ':' + padding + return ['-Wl,-rpath,{}'.format(paths)] + + def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str, + suffix: str, soversion: str, darwin_versions: typing.Tuple[str, str], + is_shared_module: bool) -> typing.List[str]: + sostr = '' if soversion is None else '.' + soversion + return ['-Wl,-soname,{}{}.{}{}'.format(prefix, shlib_name, suffix, sostr)]