{ pkgs, pwndbg, ... }: let pkgsNative = pkgs.pkgsBuildHost; lib = pkgs.lib; isLLDB = pwndbg.meta.isLLDB; python3 = pwndbg.meta.pwndbgVenv.meta.python3; pwndbgVenv = pwndbg.meta.pwndbgVenv; bundler = arg: (pkgsNative.callPackage ./bundle { } arg); ldName = lib.readFile ( pkgsNative.runCommand "pwndbg-bundle-ld-name-IFD" { nativeBuildInputs = [ pkgsNative.patchelf ]; } '' echo -n $(basename $(patchelf --print-interpreter "${python3}/bin/python3")) > $out '' ); ldLoader = if pkgs.stdenv.isLinux then "\"$dir/lib/${ldName}\"" else ""; commonEnvs = lib.optionalString (pkgs.stdenv.isLinux && isLLDB) '' export LLDB_DEBUGSERVER_PATH="$dir/bin/lldb-server" '' + lib.optionalString pkgs.stdenv.isLinux '' export TERMINFO_DIRS=${ lib.concatStringsSep ":" [ # Fix issue Linux https://github.com/pwndbg/pwndbg/issues/2531 "/etc/terminfo" # Debian, Fedora, Gentoo "/lib/terminfo" # Debian "/usr/share/terminfo" # upstream default, probably all FHS-based distros "/run/current-system/sw/share/terminfo" # NixOS "$dir/share/terminfo" ] } '' + lib.optionalString pkgs.stdenv.isDarwin '' export TERMINFO_DIRS=${ lib.concatStringsSep ":" [ # Fix issue Darwin https://github.com/pwndbg/pwndbg/issues/2531 "/usr/share/terminfo" # upstream default, probably all FHS-based distros "$dir/share/terminfo" ] } '' + '' export PYTHONNOUSERSITE=1 export PYTHONHOME="$dir" export PYTHONPATH="" export PATH="$dir/bin/:$PATH" ''; macosQuarantine = lib.optionalString pkgs.stdenv.isDarwin '' libpython="libpython${python3.pythonVersion}.dylib" if command -v xattr >/dev/null 2>&1 && command -v grep >/dev/null 2>&1; then if xattr -x "$dir/lib/$libpython" 2>/dev/null | grep -q com.apple.quarantine; then echo "Error: The pwndbg is marked as quarantined by macOS." echo "To fix this, run the following command:" echo "" echo " xattr -rd com.apple.quarantine \"$dir\"" echo "" exit 1 fi fi ''; wrapperBinPy = file: pkgs.writeScript "pwndbg-wrapper-bin-py" '' #!/bin/sh dir="$(cd -- "$(dirname "$(dirname "$(realpath "$0")")")" >/dev/null 2>&1 ; pwd -P)" ${commonEnvs} ${macosQuarantine} exec ${ldLoader} "$dir/exe/python3" "$dir/${file}" "$@" ''; wrapperBin = file: pkgs.writeScript "pwndbg-wrapper-bin" '' #!/bin/sh dir="$(cd -- "$(dirname "$(dirname "$(realpath "$0")")")" >/dev/null 2>&1 ; pwd -P)" ${commonEnvs} ${macosQuarantine} exec ${ldLoader} "$dir/${file}" "$@" ''; pwndbgGdbBundled = bundler ( (lib.optionals (pkgs.libffi_portable != null) [ "${lib.getLib pkgs.libffi_portable}/lib/" "lib/" ]) ++ [ "${python3}/bin/python3" "exe/python3" "${pwndbgVenv}/lib/" "lib/" "${python3}/lib/" "lib/" "${pwndbgVenv}/bin/pwndbg" "exe/pwndbg" "${pwndbgVenv}/bin/gdb" "exe/gdb" "${pwndbgVenv}/bin/gdbserver" "exe/gdbserver" "${wrapperBinPy "exe/pwndbg"}" "bin/pwndbg" "${wrapperBinPy "exe/gdb"}" "bin/gdb" "${wrapperBinPy "exe/gdbserver"}" "bin/gdbserver" ] ); pwndbgLldbBundled = bundler ( (lib.optionals (pkgs.libffi_portable != null) [ "${lib.getLib pkgs.libffi_portable}/lib/" "lib/" ]) ++ [ "${pwndbgVenv}/lib/" "lib/" "${python3}/lib/" "lib/" "${python3}/bin/python3" "exe/python3" "${pwndbgVenv}/bin/pwndbg-lldb" "exe/pwndbg-lldb" "${pwndbgVenv}/bin/lldb" "exe/lldb" "${pwndbgVenv}/bin/lldb-server" "exe/lldb-server" "${wrapperBinPy "exe/pwndbg-lldb"}" "bin/pwndbg-lldb" "${wrapperBinPy "exe/lldb"}" "bin/lldb" "${wrapperBinPy "exe/lldb-server"}" "bin/lldb-server" ] ); pwndbgBundled = if isLLDB then pwndbgLldbBundled else pwndbgGdbBundled; portable = pkgsNative.runCommand "portable-${pwndbg.name}" { meta = { name = pwndbg.name; version = pwndbg.version; architecture = pwndbgVenv.stdenv.targetPlatform.system; }; } '' mkdir -p $out/pwndbg/ # copy cp -rf ${pwndbgBundled}/* $out/pwndbg/ # writable out chmod -R +w $out # fix lldb/gdb in bundle ${ if pwndbgVenv.stdenv.targetPlatform.isLinux then '' ${pkgsNative.patchelf}/bin/patchelf --set-rpath '$ORIGIN/../../../../../../lib' $out/pwndbg/lib/${python3.libPrefix}/site-packages/gdb_for_pwndbg/_vendor/bin/gdbserver || true ${pkgsNative.patchelf}/bin/patchelf --set-rpath '$ORIGIN/../../../../../../lib' $out/pwndbg/lib/${python3.libPrefix}/site-packages/lldb_for_pwndbg/_vendor/bin/lldb-server || true '' else "" } # remove unneeded dirs rm -rf $out/pwndbg/lib/pkgconfig find $out/pwndbg/lib/${python3.libPrefix}/ -type d -name "__pycache__" -exec rm -rf {} + find $out/pwndbg/lib/${python3.libPrefix}/ -maxdepth 1 -type d -name "config-*" -exec rm -rf {} + # EXTERNALLY-MANAGED info echo -e "[externally-managed]\nError=This is a pwndbg-portable installation.\n Installing additional dependencies is not supported." > $out/pwndbg/lib/${python3.libPrefix}/EXTERNALLY-MANAGED # copy extra files mkdir -p $out/pwndbg/share/ cp -rf ${lib.getLib pkgs.ncurses}/share/terminfo/ $out/pwndbg/share/ # fix python "subprocess.py" to use "/bin/sh" and not the nix'ed version, otherwise "gdb-pt-dump" is broken sed -i 's@/nix/store/.*/bin/sh@/bin/sh@' $out/pwndbg/lib/${python3.libPrefix}/subprocess.py # remove /nix/store references in all files find $out/pwndbg/ -type f -exec ${pkgsNative.nukeReferences}/bin/nuke-refs {} + # build pycache SOURCE_DATE_EPOCH=0 ${pkgsNative.python3}/bin/python3 -c "import compileall; compileall.compile_dir('$out', stripdir='$out', force=True);" ''; in portable