On Mon, 15 May 2023 at 06:48:04 +0200, Johannes Schauer Marin Rodrigues wrote: > Obviously, with Luca's proposal, binaries from packages built with a different > dynamic linker path in them would not work on distributions without > merged-/usr > symlinks. But if the property of stuff from Debian being able to run on > non-Debian non-merged-/usr systems is an important one, then why was it okay > to > have merged-/usr as the default? Because with merged-/usr we already changed > the interface contract for a lot of things because now binaries and libraries > can also be found at other locations than on non-merged-/usr systems. A script > with a /usr/bin/bash shebang built on and for Debian will not work on a system > without the symlinks.
pre-bookworm gcc writes /lib64/ld-linux-x86-64.so.2 into the ELF header of amd64 binaries and I think post-bookworm gcc should continue to do so even though that has never been the physical path to the ELF interpreter on Debian (it's really /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2, or historically a version-numbered path). People who are only testing on Debian systems, even in pre-merged-/usr releases like Debian 9, could already have been relying on /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 existing; and now that we're saying merged-/usr is mandatory, people who are only testing on Debian >= 12 could also start relying on /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 or /usr/lib64/ld-linux-x86-64.so.2; but we arrange for both/all paths to exist, and we advise developers that they should only rely on the interoperable /lib64/ld-linux-x86-64.so.2, treating all other paths that lead to the same binary as an implementation detail. I don't think it's any different to say that both /usr/bin/sh and /bin/sh exist and will work, but ask that everyone should continue to use /bin/sh and treat /usr/bin/sh as an implementation detail. The way I think about merged /usr is a variant of Postel's principle: be conservative in what you require, but be liberal about what will work. A merged-/usr system can run software that assumes merged-/usr, and can also run software that doesn't (because of the compatibility symlinks); a non-merged-/usr system can run software that doesn't assume merged-/usr, but software that makes that assumption will sometimes fail to work on it. Consistent with that, despite being in favour of merged-/usr myself, I didn't switch my development laptop or my autopkgtest VM images to the merged-/usr setup until it became effectively mandatory during the bookworm cycle - because if a package was doing something not-maximally-portable, I wanted my development laptop or my test VM to be one of the places it would fail to work, so that I would notice and report that bug. Conversely, I *did* switch non-development computers (servers and family laptops) to merged-/usr, because on those systems the important thing is for software to work, even if in theory it "doesn't deserve" to work. On post-bookworm, merged-/usr Debian systems, if we keep using #!/bin/sh and #!/usr/bin/perl scripts, and avoiding #!/usr/bin/sh and #!/bin/perl scripts, then I think that's a positive thing for cross-distro interop - and using the interoperable path to the ELF interpreter (dynamic linker) is completely consistent with that. As far as I can see, post-bookworm Lintian will continue to warn about the non-interoperable spellings like #!/usr/bin/sh and #!/bin/perl, unless changed to special-case them. Note that the paths that are canonical from the point of view of cross-distro interoperability (like #!/bin/sh) are not always the same as the paths that are canonical from the point of view of realpath(). *At the moment*, they are usually canonical from dpkg's point of view, but that won't be the case forever, and I think that's fine. /lib64/ld-linux-x86-64.so.2 isn't considered to be canonical by either realpath() or dpkg either (dpkg knows it's a symlink, even on non-merged-/usr systems where /lib64 is a real directory), but it's canonical for the x86_64-linux-gnu ABI and that's what we say is most important. > With merged-/usr we already *did* "change fundamental things around" for > reasons that are really not clear to me (but which i do not want to discuss > here) and as a result did not "care about interoperability" (with those who do > not also adopt it). Didn't we? With merged /usr, the "theoretically correct" #!/bin/sh scripts that have always worked will continue to work, and additionally, "incorrect" #!/usr/bin/sh scripts will *also* work. That sounds like caring about interoperability to me! The one piece of interop we lose with merged-/usr becoming mandatory is that if a developer has only tested on Debian (and other merged-/usr distros like Fedora), if they have used a less-interoperable spelling of the path like #!/usr/bin/sh or #!/bin/perl, their testing will not highlight that source of potential non-interop with others. However, I don't think it's credible to claim that "if you only test on Debian, your software might not work on non-Debian systems" is something new; if you aim to support some other distro as a first-class citizen, there's no substitute for actually testing on it (or having users, bug reporters and contributors test on it for you). smcv