nixpkgs/pkgs/development/tools/build-managers/meson/clear-old-rpath.patch
Jan Tojnar e8bfa708c4 meson: Fix rpath clearing
Meson allows projects to set `build_rpath` property, containing paths
that will be added during build but will be removed when installing.

When Meson removes build_rpath from `DT_RUNPATH` entry, it just writes
the shorter ␀-terminated new rpath over the old one to reduce
the risk of potentially breaking the ELF files
(when the linker does string de-duplication or something).
But this can cause much bigger problem for Nix, as it can produce
cut-in-half-by-␀ store path references.

For example, in systemd’s libudev, it was removing three `$ORIGIN`-relative paths from

    $ORIGIN/../libsystemd:$ORIGIN/../basic:$ORIGIN/../shared:…␀

resulting in the following `DT_RUNPATH` entry:

    …␀store/v589pqjhvxrj73g3r0xb41yr84z5pwb7-gcc-9.3.0-lib/lib␀

We previously handled this in `fix-rpath.patch` but the method we prevent
Meson from removing paths added to rpath through `NIX_LDFLAGS` was changed
during 0.55.0 update and I forgot about this second purpose of the patch.

Let’s re-add this clearing code, as it worked without issues for a long time.
2020-08-11 17:48:18 +02:00

21 lines
889 B
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py
index 77ac03d66..d12f77592 100644
--- a/mesonbuild/scripts/depfixer.py
+++ b/mesonbuild/scripts/depfixer.py
@@ -337,6 +337,15 @@ class Elf(DataSizes):
if not new_rpath:
self.remove_rpath_entry(entrynum)
else:
+ # Clear old rpath to avoid stale references,
+ # not heeding the warning above about de-duplication
+ # since it does not seem to cause issues for us
+ # and not doing so trips up Nixs reference checker.
+ # See https://github.com/NixOS/nixpkgs/pull/46020
+ # and https://github.com/NixOS/nixpkgs/issues/95163
+ self.bf.seek(rp_off)
+ self.bf.write(b'\0'*len(old_rpath))
+
self.bf.seek(rp_off)
self.bf.write(new_rpath)
self.bf.write(b'\0')