summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorL. E. Segovia <amy@amyspark.me>2025-08-03 14:25:17 -0300
committerJussi Pakkanen <jussi.pakkanen@mailbox.org>2025-08-25 22:49:37 +0300
commit84c1791a011e4c07ec13cb98d5663b42ce39a18b (patch)
treee40bc57e194feb2dfcbc49fc0b17c5a68d9a99c3
parent79f17fa86352f3fc041081c783a63d51543eadf4 (diff)
downloadmeson-84c1791a011e4c07ec13cb98d5663b42ce39a18b.tar.gz
linkers: Fix dsymutil being unable to symbolicate binaries with LTO
According to https://clang.llvm.org/docs/CommandGuide/clang.html#cmdoption-flto, the -object_path_lto flag is needed to preserve the intermediate object files.
-rw-r--r--mesonbuild/backend/backends.py9
-rw-r--r--mesonbuild/backend/ninjabackend.py9
-rw-r--r--mesonbuild/compilers/compilers.py5
-rw-r--r--mesonbuild/linkers/linkers.py7
4 files changed, 26 insertions, 4 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 8fe696e4a..9a7700618 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -1570,6 +1570,15 @@ class Backend:
cmd = [i.replace('\\', '/') if isinstance(i, str) else i for i in cmd]
return inputs, outputs, cmd
+ def transform_link_args(self, target: build.BuildTarget, args: list[str]) -> list[str]:
+ resolved_args = []
+ for i in args:
+ if '@PRIVATE_DIR@' in i:
+ pdir = self.get_target_private_dir(target)
+ i = i.replace('@PRIVATE_DIR@', pdir)
+ resolved_args.append(i)
+ return resolved_args
+
def get_introspect_command(self) -> str:
return ' '.join(shlex.quote(x) for x in self.environment.get_build_command() + ['introspect'])
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index d93e8c99c..cb97245ec 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -3623,11 +3623,12 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
# options passed on the command-line, in default_options, etc.
# These have the lowest priority.
if isinstance(target, build.StaticLibrary):
- commands += linker.get_base_link_args(target, linker, self.environment)
+ base_link_args = linker.get_base_link_args(target, linker, self.environment)
else:
- commands += compilers.get_base_link_args(target,
- linker,
- self.environment)
+ base_link_args = compilers.get_base_link_args(target,
+ linker,
+ self.environment)
+ commands += self.transform_link_args(target, base_link_args)
# Add -nostdlib if needed; can't be overridden
commands += self.get_no_stdlib_link_args(target, linker)
# Add things like /NOLOGO; usually can't be overridden
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index a823aeb00..624226d33 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -354,6 +354,8 @@ def get_base_link_args(target: 'BuildTarget',
threads=num_threads,
mode=lto_mode,
thinlto_cache_dir=thinlto_cache_dir))
+ obj_cache_path = os.path.join('@PRIVATE_DIR@', "lto.o")
+ args.extend(linker.get_lto_obj_cache_path(obj_cache_path))
except (KeyError, AttributeError):
pass
try:
@@ -1036,6 +1038,9 @@ class Compiler(HoldableObject, metaclass=abc.ABCMeta):
thinlto_cache_dir: T.Optional[str] = None) -> T.List[str]:
return self.linker.get_lto_args()
+ def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
+ return self.linker.get_lto_obj_cache_path(path)
+
def sanitizer_compile_args(self, value: T.List[str]) -> T.List[str]:
return []
diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py
index c528db748..a905f0667 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -231,6 +231,9 @@ class DynamicLinker(metaclass=abc.ABCMeta):
def get_thinlto_cache_args(self, path: str) -> T.List[str]:
return []
+ def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
+ return []
+
def sanitizer_args(self, value: T.List[str]) -> T.List[str]:
return []
@@ -898,6 +901,10 @@ class AppleDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
def get_thinlto_cache_args(self, path: str) -> T.List[str]:
return ["-Wl,-cache_path_lto," + path]
+ def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
+ # https://clang.llvm.org/docs/CommandGuide/clang.html#cmdoption-flto
+ return ["-Wl,-object_path_lto," + path]
+
def export_dynamic_args(self, env: 'Environment') -> T.List[str]:
if mesonlib.version_compare(self.version, '>=224.1'):
return self._apply_prefix('-export_dynamic')