diff options
| author | L. E. Segovia <amy@amyspark.me> | 2025-08-03 14:25:17 -0300 |
|---|---|---|
| committer | Jussi Pakkanen <jussi.pakkanen@mailbox.org> | 2025-08-25 22:49:37 +0300 |
| commit | 84c1791a011e4c07ec13cb98d5663b42ce39a18b (patch) | |
| tree | e40bc57e194feb2dfcbc49fc0b17c5a68d9a99c3 | |
| parent | 79f17fa86352f3fc041081c783a63d51543eadf4 (diff) | |
| download | meson-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.py | 9 | ||||
| -rw-r--r-- | mesonbuild/backend/ninjabackend.py | 9 | ||||
| -rw-r--r-- | mesonbuild/compilers/compilers.py | 5 | ||||
| -rw-r--r-- | mesonbuild/linkers/linkers.py | 7 |
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') |
