From 3dbb32f6265bfacea10059500b9ae2ad1db80058 Mon Sep 17 00:00:00 2001 From: Julian Stecklina Date: Fri, 8 May 2020 17:10:26 +0200 Subject: open-watcom-bin: fix EOVERFLOW on stat() calls We've already worked around failing stat() calls in the installer by running it in qemu-user. Turns out on some systems this workaround is also needed to run `wlib', the archiver of the Open Watcom toolchain. This issue manifested itself in broken VirtualBox builds due to /build/virtualbox/out/linux.amd64/dbgopt/obj/VBoxPcBios32/pci32.obj not being found by `wlib'. We now just wrap all binaries in qemu-user to avoid this. --- .../compilers/open-watcom-bin/default.nix | 77 ++++++++++++++++++---- 1 file changed, 66 insertions(+), 11 deletions(-) (limited to 'pkgs') diff --git a/pkgs/development/compilers/open-watcom-bin/default.nix b/pkgs/development/compilers/open-watcom-bin/default.nix index 0cd80b6e1df39..a9c6b221065c2 100644 --- a/pkgs/development/compilers/open-watcom-bin/default.nix +++ b/pkgs/development/compilers/open-watcom-bin/default.nix @@ -1,15 +1,62 @@ -{ stdenvNoCC, fetchurl, qemu, expect, writeScript, ncurses }: +{ stdenvNoCC, fetchurl, qemu, expect, writeScript, writeScriptBin, ncurses, bash, coreutils }: let - # We execute the installer in qemu-user, because otherwise the - # installer fails to open itself due to a failed stat() call. This - # seems like an incompatibility of new Linux kernels to run this - # ancient binary. - performInstall = writeScript "perform-ow-install" '' + # We execute all OpenWatcom binaries in qemu-user, because otherwise + # some binaries (most notably the installer itself and wlib) fail to + # use the stat() systemcall. The failure mode is that it returns + # EOVERFLOW for completely legitimate requests. This seems like an + # incompatibility of new Linux kernels to run this ancient binary. + wrapLegacyBinary = writeScript "wrapLegacyBinary" '' + #!${bash}/bin/bash + + set -eu + + if [ $# -ne 2 ]; then + echo "Usage: $0 unwrapped-binary wrapped-binary" + exit 1 + fi + + IN="$(${coreutils}/bin/realpath $1)" + OUT="$2" + ARGV0="$(basename $2)" + + cat > "$OUT" <