aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/linkers.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2019-08-09 15:59:21 -0700
committerDylan Baker <dylan@pnwbakers.com>2019-08-14 13:13:23 -0700
commit1bb5d53b5ade7aa592e48a9804d48455d0f88952 (patch)
tree048f9807d34a40168b43690f6052f72c7534835d /mesonbuild/linkers.py
parentc77414a20b446588f98fee35d7a9a2dbf8a627a9 (diff)
downloadmeson-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.py46
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)]