diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2019-08-09 15:59:21 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2019-08-14 13:13:23 -0700 |
commit | 1bb5d53b5ade7aa592e48a9804d48455d0f88952 (patch) | |
tree | 048f9807d34a40168b43690f6052f72c7534835d /mesonbuild/linkers.py | |
parent | c77414a20b446588f98fee35d7a9a2dbf8a627a9 (diff) | |
download | meson-1bb5d53b5ade7aa592e48a9804d48455d0f88952.zip meson-1bb5d53b5ade7aa592e48a9804d48455d0f88952.tar.gz meson-1bb5d53b5ade7aa592e48a9804d48455d0f88952.tar.bz2 |
linkers: Add SolarisDynamicLinker
A dynamic linker for solaris/opensolaris. This is still completely
untested and probably doesn't work.
Diffstat (limited to 'mesonbuild/linkers.py')
-rw-r--r-- | mesonbuild/linkers.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py index dfb30b3..3bc7f89 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)] |