Skip to content

Commit 84c1791

Browse files
amysparkjpakkane
authored andcommitted
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.
1 parent 79f17fa commit 84c1791

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

mesonbuild/backend/backends.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,15 @@ def eval_custom_target_command(
15701570
cmd = [i.replace('\\', '/') if isinstance(i, str) else i for i in cmd]
15711571
return inputs, outputs, cmd
15721572

1573+
def transform_link_args(self, target: build.BuildTarget, args: list[str]) -> list[str]:
1574+
resolved_args = []
1575+
for i in args:
1576+
if '@PRIVATE_DIR@' in i:
1577+
pdir = self.get_target_private_dir(target)
1578+
i = i.replace('@PRIVATE_DIR@', pdir)
1579+
resolved_args.append(i)
1580+
return resolved_args
1581+
15731582
def get_introspect_command(self) -> str:
15741583
return ' '.join(shlex.quote(x) for x in self.environment.get_build_command() + ['introspect'])
15751584

mesonbuild/backend/ninjabackend.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3623,11 +3623,12 @@ def generate_link(self, target: build.BuildTarget, outname, obj_list, linker: T.
36233623
# options passed on the command-line, in default_options, etc.
36243624
# These have the lowest priority.
36253625
if isinstance(target, build.StaticLibrary):
3626-
commands += linker.get_base_link_args(target, linker, self.environment)
3626+
base_link_args = linker.get_base_link_args(target, linker, self.environment)
36273627
else:
3628-
commands += compilers.get_base_link_args(target,
3629-
linker,
3630-
self.environment)
3628+
base_link_args = compilers.get_base_link_args(target,
3629+
linker,
3630+
self.environment)
3631+
commands += self.transform_link_args(target, base_link_args)
36313632
# Add -nostdlib if needed; can't be overridden
36323633
commands += self.get_no_stdlib_link_args(target, linker)
36333634
# Add things like /NOLOGO; usually can't be overridden

mesonbuild/compilers/compilers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ def get_base_link_args(target: 'BuildTarget',
354354
threads=num_threads,
355355
mode=lto_mode,
356356
thinlto_cache_dir=thinlto_cache_dir))
357+
obj_cache_path = os.path.join('@PRIVATE_DIR@', "lto.o")
358+
args.extend(linker.get_lto_obj_cache_path(obj_cache_path))
357359
except (KeyError, AttributeError):
358360
pass
359361
try:
@@ -1036,6 +1038,9 @@ def get_lto_link_args(self, *, threads: int = 0, mode: str = 'default',
10361038
thinlto_cache_dir: T.Optional[str] = None) -> T.List[str]:
10371039
return self.linker.get_lto_args()
10381040

1041+
def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
1042+
return self.linker.get_lto_obj_cache_path(path)
1043+
10391044
def sanitizer_compile_args(self, value: T.List[str]) -> T.List[str]:
10401045
return []
10411046

mesonbuild/linkers/linkers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ def get_lto_args(self) -> T.List[str]:
231231
def get_thinlto_cache_args(self, path: str) -> T.List[str]:
232232
return []
233233

234+
def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
235+
return []
236+
234237
def sanitizer_args(self, value: T.List[str]) -> T.List[str]:
235238
return []
236239

@@ -898,6 +901,10 @@ def build_rpath_args(self, env: Environment, build_dir: str, from_dir: str,
898901
def get_thinlto_cache_args(self, path: str) -> T.List[str]:
899902
return ["-Wl,-cache_path_lto," + path]
900903

904+
def get_lto_obj_cache_path(self, path: str) -> T.List[str]:
905+
# https://clang.llvm.org/docs/CommandGuide/clang.html#cmdoption-flto
906+
return ["-Wl,-object_path_lto," + path]
907+
901908
def export_dynamic_args(self, env: 'Environment') -> T.List[str]:
902909
if mesonlib.version_compare(self.version, '>=224.1'):
903910
return self._apply_prefix('-export_dynamic')

0 commit comments

Comments
 (0)